Я только что столкнулся со странным поведением ASE (версия 15.7 ESD 15.2) с использованием курсора обновления.
Наконец-то я нашел основную причину, но решил опубликовать ее здесь, потому что она может быть полезна, и, возможно, кто-то уже сталкивался с этим.
Я написал этот простой курсор «для обновления»:
DECLARE c_contactrule
CURSOR FOR
SELECT a.id
FROM FTContactRule a, Client b, ClientContact c
WHERE /* join conditions */
AND a.client_id IN ( bla bla bla )
AND a.message_subtype_id ( bla bla bla )
AND /* and so on */
for update of a.preferred_medium_id
go
(я немного обобщил запрос для этого поста, чтобы его было удобнее читать)
Далее, конечно, я читаю значение курсора до конца.
open c_contactrule
fetch c_contactrule into @rule_to_update
while @@sqlstatus = 0
begin
/* do something */
end
close c_contactrule
deallocate c_contactrule
go
Я думаю, вы догадались, что где-то есть update preferred_medium_id where current of
В настоящее время этот запрос дает сбой очень специфическим образом: выдается сообщение «ASE завершил этот процесс», и действительно, он убил мою сессию!
Проведя расследование, я обнаружил, что плохой строкой кода была первая инструкция fetch into
.