Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2 3 4 5

Дельфятник ©   (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...


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо