![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что происходит с открытым курсором, если очистить "его" таблицу? [D6, не Oracle]
Курдль © (2004-05-04 20:21:00)
begin
declare CNTR_CURSOR cursor for select * from CNTR_TABLE;
open CNTR_CURSOR;
delete from CNTR_TABLE;
CNTR_LOOP:
loop
fetch next CNTR_CURSOR into ...;
--Если конец набора данных - покинуть петлю
if sqlstate = '02000'
then leave CNTR_LOOP;
message 'нет ни одной записи' to log;
end if;
message 'обработана запись' to log;
end loop CNTR_LOOP;
close CNTR_CURSOR;
end;
Если выделенная строка отсутствует, лог выглядит так:
обработана запись
обработана запись
....
обработана запись
Если выделенная строка присутствует:
нет ни одной записи
Что выходит? Изменения в "управляющей таблице(-ах)" после открытия курсора ведут к необратимым изменениям набора данных, которые принял курсор? :(
Курдль (2004-05-05 10:33:00) [1]
> Если я выбираю к примеру названия и коды товаров, то предполагаю,
> что эти два поля точно за 0.0001 секунду никто не изменит.
> (:-)
> Поэтому и не напрягаюсь.
У меня задача, в которой без вмешательства не обойтись - курсор строится по 2-м таблицам, связанным по внешнему ключу. Причем, чтобы что-то удалить из второй - надо сначала зачистить первую.
Andriy Tysh (2004-05-05 10:28:00) [2]Нет под рукой у меня хелпа. Но парень, который раньше работал с нами, тоже писал под Sybase. В его процедурах точнобыл динамический курсор. Нафиг он ему был нужен в тех местах, где он его использует - мы до сих пор не понимаем. Я всегда использую статический. Но это зависит от задачи. Если я выбираю к примеру названия и коды товаров, то предполагаю, что эти два поля точно за 0.0001 секунду никто не изменит. (:-)
Поэтому и не напрягаюсь.
Курдль (2004-05-05 10:13:00) [3]А можно навскидочку весь синтаксис (у меня Sybase, но попробую применить, или хоть доку порыть в нужном направлении). Но вообще-то это странно - нафиг он нужен такой "динамический"?..
Andriy Tysh (2004-05-05 10:10:00) [4]В MS SQL есть Dynamic и Static курсоры. Первый - реагирует на какие-либо изменеия в своём наборе данных если изменение произошло в том месте, куда он ещё не дошёл, второй делает "фотку" и далее его ничего не тревожит.