DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Закрытие курсора

После того как весь активный набор выбран, курсор следует закрыть. Это сообщает PL/SQL, что программа закончила работу с курсором и отведен­ные для него ресурсы могут быть освобождены. В состав этих ресурсов, вхо­дит пространство для хранения активного набора, а также временное пространство, используемое для определения активного набора. Синтаксис закрытия курсора:
CLOSE имя_курсора;
где        обозначает ранее открытый курсор. После закрытия кур-
сора считывать из него строки нельзя. Если попытаться сделать это, Oracle выдаст сообщение об ошибке:
Попытка закрыть уже закрытый курсор также приведет к ошибке ORA-1001.
Атрибуты курсора
В PL/SQL существуют четыре атрибута, которые могут быть применены к курсорам. Атрибуты курсора добавляются к имени курсора в блоке PL/SQL, подобно атрибутам %TYPE и %ROWTYPE. Однако курсорные ат­рибуты возвращают не тип, а значения, которые могут быть использованы в выражениях. К атрибутам курсора относятся %FOUND, %NOTFOUND, %ISOPEN и %ROWCOUNT. При их описании в качестве примера исполь­зуется программа, приведенная на рис. 6.1. (Огас1е8гдобавляет новый ат­рибут %BULK_ROWCOUNT, применяемый для извлечения массивов. См. главу 12.) В этом примере предполагается, что в таблице temp_table содержатся две строки со следующими данными:
%FOUND Это логический атрибут. Он возвращает TRUE, если при предшест­вующем считывании FETCH была извлечена строка, и FALSE — в противном случае. Если курсор не открыт, то при проверке %>FOUND выдается ошибка ORA-1001 (неверный курсор). Поведение атрибута %FOUND описывает­ся в таблице; здесь цифры соответствуют точкам, помеченным на рис. 6.1.
Точка    Значение
c_TempData%FOUND
Ошибка: ORA-1001

?        NULL

TRUE TRUE FALSE
Ошибка: ORA-1001
Пояснение

Курсор c_TempData еще не открыт, и активного набора для него не существует.
Курсор c_TempData открыт, но еще не было произведено ни одного считывания строк. Значение атрибута не может быть определено.
С помощью предшествующего оператора FETCH выбрана первая строка таблицы temp_table.
С помощью предшествующего оператора FETCH выбрана
вторая строкатаблицы tempjtable.
Предшествующий оператор FETCH не вернул никаких
данных, так как все строки активного набора извлечены.
Курсор        и вся хранившаяся информация об активном наборе удалена.
%NOTFOUND Ведет себя противоположно %FOUND: если предшеству­ющее считывание возвращает строку — значение %NOTFOUND ложно. Атрибут %NOTFOUND возвращает TRUE, только если во время предше­ствующего считывания строка извлечена не была. Этот атрибут часто ис­пользуется в качестве условия выхода из цикла выборки. Поведение %NOTFOUND описывается в таблице (см. пример на рис. 6.1).
%ISOPEN Этот логический атрибут используется для        от-
крыт или нет соответствующий курсор. Если курсор открыт, %ISOPEN возвращает TRUE, а если не открыт - FALSE. Поведение 9HSOPEN опи­сывается в следующей таблице:
%ROWCOUNT Этот числовой атрибут возвращает количество строк, счи­танных курсором на данный момент. Если %ROWCOUNT используется, когда соответствующий курсор еще не открыт, то возвращается ошибка ORA-1001. Поведение атрибута %ROWCOUNT описывается в следующей
таблице:

Точка        Значение
c_TempData%ROWCOUNT
Ошибка ORA-1001
0
1
2
2
Ошибка ORA-1001
Пояснение

Курсор  c_TempData  еще не открыт, и активного набора для него не существует.
Курсор        открыт, но еще не было произведено
ни одного считывания строк.
Считана первая строка таблицы temp_table.
Считана вторая строка таблицы temp_table.
К данному моменту считаны две строки таблицы temp_table.
Курсор        закрыт, и вся хранившаяся информация об активном наборе удалена.

Сравнение атрибутов курсора. Для сравнения в таблице 6.1 приведены значения всех четырех атрибутов курсора при выполнении рассматривае­мого блока.

Параметризованные курсоры
Существует еще один способ использования переменных привязки в кур­соре. Параметризованные (parameterized) курсоры, подобно процедурам (см. главы 9 и 10), принимают определенные аргументы. Рассмотрим кур­сор c_Classes:
Курсор c_Classes содержит две переменные привязки — v_Department и vCourse. Можно превратить cClasses в эквивалентный параметризован­ный курсор:
В этом случае 'UTS' передается как значение для pDepartment, a 101 -для p_Course. Кроме того, параметры можно передавать при помощи по­зиционной или именной формы записи. Полная информация о передаче параметров приводится в главе 9.
 









jAntivirus