Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как проверить создан ли курсор?  [new]
Igor888
Guest
Добрый день.

Часто применяю конструкцию в хранимых процедурах
BEGIN TRY
...
END TRY
BEGIN CATCH
...
END CATCH

Но не уверян, что правильно делаю относительно создания курсоров.

привожу небольшой пример:
BEGIN TRY
    ... много разного кода
    ... много разного кода
    ... много разного кода
    DECLARE ResInsertCursor CURSOR FOR 
      SELECT [Index] FROM @Resources WHERE [Key] = 0
  
    OPEN ResInsertCursor
    FETCH NEXT FROM ResInsertCursor INTO @Index
    WHILE @@FETCH_STATUS = 0 
    BEGIN
      EXECUTE @Ret = [SCH_MyProc] @Index
      IF @Ret <> 0
      BEGIN
        CLOSE ResInsertCursor
        DEALLOCATE ResInsertCursor 
        RETURN @Ret
      END
      
      FETCH NEXT FROM ResInsertCursor INTO @Index
    END

    CLOSE ResInsertCursor
    DEALLOCATE ResInsertCursor
    ... много разного кода
    ... много разного кода
    ... много разного кода
END TRY
BEGIN CATCH
  CLOSE ResInsertCursor
  DEALLOCATE ResInsertCursor
  RETURN 505
END CATCH


Если исключение произойдёт до момента инициализации курсора то при обработки исключения (BEGIN CATCH END CATCH) наверняка произойдёт ошибка.
Теперь вопрос: Как проверить переменную "ResInsertCursor" на предмет инициализации курсора?
24 май 15, 11:57    [17681839]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить создан ли курсор?  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
Объявляйте локальные курсоры и не нужно будет их ни проверять, ни закрывать.
24 май 15, 12:57    [17681936]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить создан ли курсор?  [new]
Igor888
Guest
invm
Объявляйте локальные курсоры и не нужно будет их ни проверять, ни закрывать.


Добрый день.
Толи справку плохо читал, тли ещё что...
Что значит локальные курсоры? Как правильно из объявить? Чем они принципиально отличаются от тех, которые я привёл в скрипте (скорость обработки и пр.)

Заранее спасибо1
24 май 15, 13:03    [17681943]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить создан ли курсор?  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
Igor888
Толи справку плохо читал
Видимо.
https://msdn.microsoft.com/ru-ru/library/ms180169.aspx
LOCAL

Указывает, что область курсора локальна по отношению к пакету, хранимой процедуре или триггеру, в которых этот курсор был создан. Имя курсора допустимо только внутри этой области. На курсор могут ссылаться локальные переменные пакета, хранимые процедуры, триггеры или параметр OUTPUT хранимой процедуры. Параметр OUTPUT используется для передачи локального курсора вызывающему его пакету, хранимой процедуре или триггеру, который затем может присвоить параметр переменной курсора с целью последующего обращения к курсору после завершения хранимой процедуры. Курсор неявно освобождается после завершения выполнения пакета, хранимой процедуры или триггера, за исключением случая, когда курсор был передан параметру OUTPUT. Если курсор был передан параметру OUTPUT, то курсор освобождается при освобождении всех ссылающихся на него переменных или при выходе из области видимости.
24 май 15, 13:23    [17681961]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить создан ли курсор?  [new]
Igor888
Guest
invm,

Огромное спасибо, то что надо!

Ранее сидел на MSDE, ранее видимо не было понятия локально (могу ошибаться))).)
Сейчас использую 2008-й
24 май 15, 13:39    [17681971]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить