Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];

Вниз

Не осилил вопросы по транзакциям на собеседовании   Найти похожие ветки 

 
Petr V. Abramov ©   (2006-03-07 22:51) [80]

Если первый вопрос считать вежливой(?) провокацией и выводм на дискуссию,
то второй - бред полный

try
if not Database.InTransaction then Database.StartTransaction;
Database.Commit;
except
on E: Exception do
begin
  ShowMessage(E.Message);
  Database.Rollback
end
end;

ошибка возникает либо на StartTransaction, либо на commit. Это возникнуть может, когда ресурсы, похоже, уже съедены :)

Если транзакция так ине стартовала, то есть она ничего не будет. Если сервер не реагирует на commit, он скорее всего, ни на что уже не среагирует (спецслучаи Oracle не берем), и не к месту написанный ShowMessage тут ни при чем


 
Дельфятник   (2006-03-08 00:06) [81]


> Например, на
> a). Имеется таблица
>
> create table T (
>  Дата  date,
>  Валюта char(3),
>  Курс numeric,
>  primary key (Дата, Валюта)
> );
>
> Данные:
>
> Дата      Валюта    Курс
> ------------------------
> 01.09.04  USD       29.8
> 02.09.04  EUR       35.4
> 03.09.04  USD       29.7
> 05.09.04  USD       29.6
> 06.09.04  USD       29.8
> 06.09.04  EUR       35.6
> ...
>
> Напишите запрос, выдающий курс заданной валюты на заданную
> дату.
> Курс считается определенным, если для данной валюты
> есть запись с датой не превосходящей заданную, взять ближайший
> курс.
> Запрос должен выдать курс в обеих случаях:
> - курс USD на 06.09.04
> - курс USD на 04.09.04
>
> Отвечает 1 из 20 !!!,


Я попробовал это сделать на Oracle. Вот что у меня получилось:
create table TT_TEMP
( FDATE DATE,
 CURR  VARCHAR2(3),
 RATE  NUMBER)

create or replace function TT_GetRate(pDate in Date, pCurr in varchar2) return varchar2 is
 s varchar2(200);
begin
 select
   case
     when exists(select rate from TT_TEMP
                      where FDate = pDate and Curr = pCurr)
       then (select distinct to_char(rate) from TT_TEMP
               where FDate= pDate and Curr = pCurr)
     when exists(select rate from TT_TEMP where Curr = pCurr)
       then
         case
           when pDate <= (select min(FDate) from TT_TEMP where Curr = pCurr)
             then "Нет данных о курсе "||pCurr||" на заданную дату ("||to_char(pDate)||")"
           else
             (select distinct to_char(rate) from TT_TEMP
              where Curr = pCurr and
                FDate = nvl((select max(FDate) from TT_TEMP
                                  where Curr= pCurr and FDate <= pDate),
                                 (select max(FDate) from TT_TEMP
                                  where Curr= pCurr)
              )
           end
       else "Нет данных о курсе данной валюты ("||pCurr||")"
    end
 into s
 from dual;
 return(trim(s));
end TT_GetRate;

И, наконец, запрос
select TT_GetRate("06.09.2004","USD") rate1,
        TT_GetRate("04.09.2004","USD") rate2
from dual

выдаёт то, что нужно:

Rate1 | Rate2
29,8      29,7

По-моему, это не вполне нормально предлагать решить такую задачу на собеседовании. Просто тупое перебирание вариантов. Что оно говорит о кандидате?


 
Дельфятник   (2006-03-08 00:16) [82]

Ещё раз посмотрел на функцию, и нашёл неточность:

вместо

               FDate = nvl((select max(FDate) from TT_TEMP
                                 where Curr= pCurr and FDate <= pDate),
                                (select max(FDate) from TT_TEMP
                                 where Curr= pCurr)

должно быть просто

             FDate = (select max(FDate) from TT_TEMP
                         where Curr= pCurr and FDate <= pDate)


 
Жуков Олег   (2006-03-08 01:37) [83]

К чему такие сложности, это делается одним запросом. Синтаксис SQL не помню сейчас, но что-то типа такого должно быть

Select
 Rate
from
 Rates
where
 Date = (Select Max(Date) from Rates where Date <= @NecessaryDate)


 
paul_k ©   (2006-03-09 08:18) [84]

> [74] Romkin ©   (07.03.06 17:33)

если речь о MSSQL то божно и без, насколько помню...


> [81] Дельфятник   (08.03.06 00:06)

Чесслово - даже разговаривать не стал бы с вами после такого ответа на собеседовании.
Лучшебы сказали что не можете и спросили а как?
условие задачи - одним запросом
ответ - длиннючая процедура.
фи... Зачем нужен чел на работу, который не следует поставленной задаче?

Table
curensy_id id валюты
rate_value значение курса
rate_date дата курса

select top 1 rate_value
from table
where curency_id=@input_id
and rate_date <=@input date
order by rate_date desc


 
Bless ©   (2006-03-09 08:57) [85]


> Romkin ©   (07.03.06 17:33) [74]
>
> Bless ©   (07.03.06 16:40) [71] Кто такое сказал? Эссно,
>  его надо решать с подзапросом :))


Ну, не так уже и естесственно :)


DECLARE
@dat smalldatetime,
@valuta varchar(5)

SELECT @dat="9/06/2004", @valuta="USD"

SELECT top 1 * FROM T
WHERE valuta=@valuta AND dat<=@dat
ORDER BY @dat-dat



 
Bless ©   (2006-03-09 09:00) [86]


> paul_k ©   (09.03.06 08:18) [84]


:) Не видел, когда писал. Хотя
order by rate_date desc все же не правильно.


 
Bless ©   (2006-03-09 09:01) [87]


> order by rate_date desc все же не правильно.


Упс. Вру.


 
Romkin ©   (2006-03-09 12:01) [88]

Вопрос, собственно, был по стандарту SQL.
А там, по крайней мере в 92м, никаких топов. Так что правильный путь указан в [83] :)))  Я просто это не указал, а по теме ветки все поняли что это MSSQL.
Хотя, конечно, я понимаю, что все привыкли решать без подзапроса, тем или иным способом.
Почему по стандарту? Дык необязательно же придет человек, знающий тот сервер, что нужен. Главное - чтобы SQL знал.


 
paul_k ©   (2006-03-09 12:36) [89]

> [88] Romkin ©   (09.03.06 12:01)

Да понятно, что в ANSI-92 никаких топов нету. Но если чел хоть с TOP напишет то уже плюс.
кстати ещё интересный вопрос - какой из запросов быстрее при прочих равных. Есть подозрение, что стандартный (как у нас говорили - штатный) вариант.
да и способ приведенный в  [83] далеко не единственный.
Речь у меня, собственно, о том что если сказано в задании - запрос, то нада запрос а не процедуру.


> [82] Дельфятник   (08.03.06 00:16)

Попробую разъяснить вышенаписанное мною (про прекращение разговора)
Данный способ получения данных очень часто применяется в различных переоценках и так далее.
а теперь распиши (можешь дома, на бумаге) с применением указанной тобой функции следующую задачу.

есть 500 складов. На каждом склаже примерно по 4000 наименований. По каждому товару есть данные - партия, когда поступил, валюта оплаты, цена единицы, количество
надо в отчете указать по каждому складу указать
наименование,
дату поступления,
стоимость в рублях на момент поступления,
стоимость в валюте на момент поступления
стоимость в рублях на момент ухода партии,
прибыль/убыток от курсовой разницы.

упрощение - партия товара приходит и уходит целиком


Это слегка упрощенный отчет. Собирают подобное обычно одним - несколькими запросами не используя циклов, курсоров и так далее.


 
Romkin ©   (2006-03-09 12:41) [90]

paul_k ©   (09.03.06 12:36) [89] А где записи об уходе-то? И чем отличаются? Стандартно, поле integer, -1 - уход, 1 - приход? Али как?


 
Fay ©   (2006-03-09 12:48) [91]

2 Romkin ©   (09.03.06 12:41) [90]
> -1 - уход, 1 - приход?
Нафиг? Положительное движения - приход 8)


 
Romkin ©   (2006-03-09 12:55) [92]

Положительное что? Количество или сумма? ;)
Нее, я не рискую, у меня именно отдельное поле на знак. Тем более 0 при этом работает, как служебные пометки. А умножить никогда не поздно


 
paul_k ©   (2006-03-09 12:57) [93]

> [90] Romkin ©   (09.03.06 12:41)

да хоть now  для всего уходом считать.
или как ты сказал +-1. без разницы
мsckz в том, что запустив подобный запрос используя может даже верный расчет из [82] на указанном небольшом наборе данных  можно спокойно уходить курить.
а если считать что подобные задачи я обрабатывал в обласи учета ценных бумаг, где не 100 валют а ******** котировок, а уход надо выбрать то по ЛИФО, то по ФИФО, то средневзвешенный, то можно и пообедать успеть легко.


 
paul_k ©   (2006-03-09 12:59) [94]

мsckz - мысль...


 
Brenagwynn   (2006-03-09 13:54) [95]

Насчет валют (пишу для оракла):
select * from (
select * from Rates
where currencycode = "USD"
and rate_date <= to_date("09032006","ddmmyyyy")
order by rate_date desc
)
where rownum = 1

Или так:
SELECT *
 FROM Rates vo
WHERE vo.currencycode = "USD"
  AND vo.rate_date =(
          SELECT MAX(vi.rate_date)
            FROM rates vi
           WHERE vi.currencycode = vo.currencycodecode
                 AND vi.rate_date <= TO_DATE("09032006", "ddmmyyyy"))


 
msguns ©   (2006-03-09 14:07) [96]

>Fay ©   (09.03.06 12:48) [91]
>Нафиг? Положительное движения - приход 8)

Надеюсь, это шутка ? Ибо убивець тот, кто так делает ;)


 
Polevi ©   (2006-03-09 14:37) [97]

>Дельфятник   (08.03.06 00:06) [81]
мдя, плохо дело


 
Romkin ©   (2006-03-09 14:47) [98]

Polevi ©   (09.03.06 14:37) [97] Да это еще терпимо :)))
http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=12992



Страницы: 1 2 3 вся ветка

Форум: "Базы";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.64 MB
Время: 0.015 c
1-1143042397
CAHEK
2006-03-22 18:46
2006.04.30
Tlistview работа с имиджами


3-1141656216
mvs
2006-03-06 17:43
2006.04.30
Экспорт данных из базы Interbase в скрипт средствами Delphi


2-1144742061
Тфьу
2006-04-11 11:54
2006.04.30
А вот вопрос по Oracle


15-1144151706
alles
2006-04-04 15:55
2006.04.30
По Аске получил, забавно


15-1144470910
TUser
2006-04-08 08:35
2006.04.30
Не слабо спекулянты работают.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский