После того как весь активный набор выбран, курсор следует закрыть. Это сообщает 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 не вернул никаких
данных, так как все строки активного набора извлечены.
Курсор и вся хранившаяся информация об активном наборе удалена.
вторая строкатаблицы 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.
< Предыдущая | Следующая > |
---|