2011-11-03 2 views
0

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

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

Error: Cursor trying to open C1, is already open.

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

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

ответ

2

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

DECLARE customerCursor LOCAL 

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

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

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

+0

Большое спасибо. Это сделал трюк. –

Смежные вопросы