powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Сюрприз от курсора...
5 сообщений из 5, страница 1 из 1
Сюрприз от курсора...
    #39601214
Toshkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
db2 11.1 fp2

CREATE OR REPLACE PROCEDURE schema1.proc1 ( )
LANGUAGE SQL
DETERMINISTIC
NO EXTERNAL ACTION
BEGIN ATOMIC
DECLARE docid INTEGER;

FOR c AS
SELECT id c_id, f1 c_f1, f2 c_f2
FROM schema1.t1
DO
SELECT id INTO docid FROM NEW TABLE(INSERT INTO schema1.t1(f1, f2) VALUES(c_f1, c_f2));

UPDATE schema1.t2 SET f1 = docid WHERE f1 = c_id;
DELETE FROM schema1.t1 WHERE id = c_id;
END FOR;
END;

На t1 триггер на генерацию id.
t1 и t2 перед вызовом процедуры локируются.
По факту update не 1, а три десятка, курсор отбирает записи по условию (50 тыс из 100-а).

А сюрприз заключается в том, что курсор зацикливается и начинает гонять записи по кругу, но не все, а как-то выборочно.
Причем на тестовой бд, где никто не работает, курсор повторил около 10% записей и завершился. А на рабочей, которую постоянно дергают, завершения дождаться так и не удалось.
...
Рейтинг: 0 / 0
Сюрприз от курсора...
    #39601236
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Toshkin,

Вы сами себе сюрприз сделали.
Если не хотите захватывать курсором новые вставленные записи, то:

Код: plaintext
1.
 FOR  c AS с1 INSENSITIVE CURSOR FOR
SELECT ...

Или у вас логика включает то, что вставленные при процессинге курсора записи должны им же опать захватываться?
...
Рейтинг: 0 / 0
Сюрприз от курсора...
    #39601249
Toshkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

нет, не должны...
я просто не предполагал, что содержимое курсора может меняться в процессе его обработки...
...
Рейтинг: 0 / 0
Сюрприз от курсора...
    #39601320
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Toshkin,

По-умолчанию курсор, как следует из ссылки, ASENSITIVE.
Это значит, что если курсор - read-only, то его поведение как у sensitive курсора. Если он не read-only, то - как у insensitive.
В вашем запросе - одна таблица и не указано FOR READ ONLY или FOR UPDATE. Т.е. курсор мог быть объявлен как FOR UPDATE, и db2 его так и открывает, скорее всего.

Поэтому, если не надо эффекта чтения своих же изменений, то либо как написано выше, либо в SELECT в конце добавить FOR READ ONLY.
...
Рейтинг: 0 / 0
Сюрприз от курсора...
    #39601323
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

Ошибся.

Должно быть:
---
ASENSITIVE значит, что если курсор - read-only, то его поведение как у in sensitive курсора. Если он не read-only, то - как у insensitive.
---
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Сюрприз от курсора...
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]