Форум: "Базы";
Текущий архив: 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