Вызов курсора в цикле - PullRequest
0 голосов
/ 03 ноября 2011

Я создал процедуру (p1).Эта процедура открывает курсор (c1).И я вызываю другую процедуру (p2) в цикле для каждой строки курсора.Процедура занимает от 22 до 120 секунд.В процедуре P1 я открываю, закрываю и освобождаю курсор c1.Это работает нормально.

Теперь процедура P1 имеет вход.Итак, я написал другую процедуру (p3) с курсором (c2).Курсор c2 получает ввод для p1.Теперь число строк для C2 равно 1403. Поэтому я звоню P1, 1403 раза из P3.И это создает ошибку:

Ошибка: курсор, пытающийся открыть C1, уже открыт.

Я понимаю, что сервер Sql пытается запустить P1 одновременно для многих строк в C2,А так как С1 уже открыт, значит, приходит ошибка.

Любая идея, как я могу ограничить P3 для выполнения P1 по одному.

1 Ответ

2 голосов
/ 03 ноября 2011

Как вы объявляете курсор C1 в P1? Это ЛОКАЛЬНЫЙ или ГЛОБАЛЬНЫЙ курсор? ЛОКАЛЬНЫЙ курсор должен иметь возможность объявляться столько раз, сколько вам нужно, поскольку он используется только в рамках одной процедуры.

DECLARE customerCursor LOCAL

Если GLOBAL / LOCAL не определен для курсора, он будет использовать значение по умолчанию для базы данных (из CURSOR_DEFAULT), которое начинается как GLOBAL.

Если вышесказанное не поможет, можно ли будет увидеть упрощенные версии ваших процедур для более простого тестирования?

С уважением, M

...