![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не осилил вопросы по транзакциям на собеседовании
Дельфятник © (2006-03-06 18:29:00)1) В каких случаях надо использовать механизм транзакций
а) при редактировании данных
б) при удалении данных
в) в любом случае
г) при редактировании и/или удалении данных?
И зачем вообще нужен механизм транзакций?
2) Есть следующий код:
try
if not Database.InTransaction then Database.StartTransaction;
Database.Commit;
except
on E: Exception do
begin
ShowMessage(E.Message);
Database.Rollback
end
end;
В результате его выполнения программа выдала сообщение об ошибке. Пользователь по каким-то причинам не нажал "ОК", сообщение так и осталось висеть. По какой причине через некоторое время эта транзакция съест все ресурсы SQL-сервера?
Romkin (2006-03-09 14:47:00) [1]Polevi © (09.03.06 14:37) [97] Да это еще терпимо :)))
http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=12992
Polevi (2006-03-09 14:37:00) [2]>Дельфятник (08.03.06 00:06) [81]
мдя, плохо дело
msguns (2006-03-09 14:07:00) [3]>Fay © (09.03.06 12:48) [91]
>Нафиг? Положительное движения - приход 8)
Надеюсь, это шутка ? Ибо убивець тот, кто так делает ;)
Brenagwynn (2006-03-09 13:54:00) [4]Насчет валют (пишу для оракла):
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'))
paul_k (2006-03-09 12:59:00) [5]мsckz - мысль...
paul_k (2006-03-09 12:57:00) [6]> [90] Romkin © (09.03.06 12:41)
да хоть now для всего уходом считать.
или как ты сказал +-1. без разницы
мsckz в том, что запустив подобный запрос используя может даже верный расчет из [82] на указанном небольшом наборе данных можно спокойно уходить курить.
а если считать что подобные задачи я обрабатывал в обласи учета ценных бумаг, где не 100 валют а ******** котировок, а уход надо выбрать то по ЛИФО, то по ФИФО, то средневзвешенный, то можно и пообедать успеть легко.
Romkin (2006-03-09 12:55:00) [7]Положительное что? Количество или сумма? ;)
Нее, я не рискую, у меня именно отдельное поле на знак. Тем более 0 при этом работает, как служебные пометки. А умножить никогда не поздно
Fay (2006-03-09 12:48:00) [8]2 Romkin © (09.03.06 12:41) [90]
> -1 - уход, 1 - приход?
Нафиг? Положительное движения - приход 8)
Romkin (2006-03-09 12:41:00) [9]paul_k © (09.03.06 12:36) [89] А где записи об уходе-то? И чем отличаются? Стандартно, поле integer, -1 - уход, 1 - приход? Али как?
paul_k (2006-03-09 12:36:00) [10]> [88] Romkin © (09.03.06 12:01)
Да понятно, что в ANSI-92 никаких топов нету. Но если чел хоть с TOP напишет то уже плюс.
кстати ещё интересный вопрос - какой из запросов быстрее при прочих равных. Есть подозрение, что стандартный (как у нас говорили - штатный) вариант.
да и способ приведенный в [83] далеко не единственный.
Речь у меня, собственно, о том что если сказано в задании - запрос, то нада запрос а не процедуру.
> [82] Дельфятник (08.03.06 00:16)
Попробую разъяснить вышенаписанное мною (про прекращение разговора)
Данный способ получения данных очень часто применяется в различных переоценках и так далее.
а теперь распиши (можешь дома, на бумаге) с применением указанной тобой функции следующую задачу.
есть 500 складов. На каждом склаже примерно по 4000 наименований. По каждому товару есть данные - партия, когда поступил, валюта оплаты, цена единицы, количество
надо в отчете указать по каждому складу указать
наименование,
дату поступления,
стоимость в рублях на момент поступления,
стоимость в валюте на момент поступления
стоимость в рублях на момент ухода партии,
прибыль/убыток от курсовой разницы.
упрощение - партия товара приходит и уходит целиком
Это слегка упрощенный отчет. Собирают подобное обычно одним - несколькими запросами не используя циклов, курсоров и так далее.
Romkin (2006-03-09 12:01:00) [11]Вопрос, собственно, был по стандарту SQL.
А там, по крайней мере в 92м, никаких топов. Так что правильный путь указан в [83] :))) Я просто это не указал, а по теме ветки все поняли что это MSSQL.
Хотя, конечно, я понимаю, что все привыкли решать без подзапроса, тем или иным способом.
Почему по стандарту? Дык необязательно же придет человек, знающий тот сервер, что нужен. Главное - чтобы SQL знал.
Bless (2006-03-09 09:01:00) [12]
> order by rate_date desc все же не правильно.
Упс. Вру.
Bless (2006-03-09 09:00:00) [13]
> paul_k © (09.03.06 08:18) [84]
:) Не видел, когда писал. Хотя
order by rate_date descвсе же не правильно.
Bless (2006-03-09 08:57:00) [14]
> 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
paul_k (2006-03-09 08:18:00) [15]> [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
Жуков Олег (2006-03-08 01:37:00) [16]К чему такие сложности, это делается одним запросом. Синтаксис SQL не помню сейчас, но что-то типа такого должно быть
Select
Rate
from
Rates
where
Date = (Select Max(Date) from Rates where Date <= @NecessaryDate)
Дельфятник (2006-03-08 00:16:00) [17]Ещё раз посмотрел на функцию, и нашёл неточность:
вместо
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 00:06:00) [18]
> Например, на
> 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
По-моему, это не вполне нормально предлагать решить такую задачу на собеседовании. Просто тупое перебирание вариантов. Что оно говорит о кандидате?
Petr V. Abramov (2006-03-07 22:51:00) [19]Если первый вопрос считать вежливой(?) провокацией и выводм на дискуссию,
то второй - бред полный
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 тут ни при чем
Romkin (2006-03-07 21:58:00) [20]Fay © (07.03.06 21:39) [78]
А мне тоже стыдно :(
Ну, ты, наверное, уже в курсе :)
2all: это насчет того, что будет при наличии if then else, если в условии возникает сравнение с NULL.
К сожалению, похоже, все при этом выполняют блок else...