Что такое КУРСОР в PL / SQL?
Курсор - это указатель на эту область контекста. Oracle создает область контекста для обработки оператора SQL, которая содержит всю информацию об операторе.
PL / SQL позволяет программисту управлять областью контекста с помощью курсора. Курсор удерживает строки, возвращаемые оператором SQL. Набор строк, удерживаемых курсором, называется активным набором. Эти курсоры также можно назвать так, чтобы на них можно было ссылаться из другого места кода.
В этом уроке вы узнаете:
- Неявный курсор
- Явный курсор
- Атрибуты курсора
- Оператор курсора цикла FOR
Курсор бывает двух типов.
- Неявный курсор
- Явный курсор
Неявный курсор
Всякий раз, когда в базе данных происходят какие-либо операции DML, создается неявный курсор, который содержит затронутые строки в этой конкретной операции. Эти курсоры не могут быть названы и, следовательно, ими нельзя управлять или ссылаться на них из другого места кода. Мы можем ссылаться только на самый последний курсор через атрибуты курсора.
Явный курсор
Программистам разрешено создавать именованную область контекста для выполнения своих операций DML, чтобы получить больший контроль над ней. Явный курсор должен быть определен в разделе объявления блока PL / SQL, и он создается для оператора SELECT, который необходимо использовать в коде.
Ниже приведены шаги по работе с явными курсорами.
- Объявление курсора
Объявление курсора означает просто создание одной именованной области контекста для оператора SELECT, который определен в части объявления. Имя этой области контекста совпадает с именем курсора.
- Курсор открытия
Открытие курсора укажет PL / SQL выделить память для этого курсора. Курсор будет готов к выборке записей.
- Получение данных из курсора
В этом процессе выполняется инструкция «SELECT», и выбранные строки сохраняются в выделенной памяти. Теперь они называются активными наборами. Получение данных от курсора - это действие на уровне записи, что означает, что мы можем получить доступ к данным в режиме записи за записью.
Каждый оператор выборки извлекает один активный набор и содержит информацию об этой конкретной записи. Этот оператор аналогичен оператору «SELECT», который выбирает запись и присваивает значение переменной в предложении «INTO», но не вызывает никаких исключений.
- Закрытие курсора
Как только вся запись будет выбрана, нам нужно закрыть курсор, чтобы освободить память, выделенную для этой области контекста.
Синтаксис:
DECLARECURSORIS
- В приведенном выше синтаксисе часть объявления содержит объявление курсора и переменную курсора, в которой будут назначены выбранные данные.
- Курсор создается для оператора SELECT, указанного в объявлении курсора.
- В части исполнения объявленный курсор открывается, выбирается и закрывается.
Атрибуты курсора
И неявный курсор, и явный курсор имеют определенные атрибуты, к которым можно получить доступ. Эти атрибуты предоставляют дополнительную информацию об операциях с курсором. Ниже приведены различные атрибуты курсора и их использование.
Атрибут курсора | Описание |
%НАЙДЕННЫЙ | Он возвращает логический результат «ИСТИНА», если последняя операция выборки успешно извлекла запись, в противном случае он вернет ЛОЖЬ. |
%НЕ НАЙДЕН | Это работает противоположно% FOUND, он вернет «ИСТИНА», если последняя операция выборки не смогла получить какую-либо запись. |
%ОТКРЫТ | Он возвращает логический результат «ИСТИНА», если данный курсор уже открыт, иначе он возвращает «ЛОЖЬ». |
% ROWCOUNT | Возвращает числовое значение. Он дает фактическое количество записей, на которые повлияла активность DML. |
Пример 1. В этом примере мы увидим, как объявлять, открывать, извлекать и закрывать явный курсор.
Мы будем проецировать все имена сотрудников из таблицы emp с помощью курсора. Мы также будем использовать атрибут курсора, чтобы установить цикл для извлечения всей записи из курсора.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;lv_emp_name emp.emp_name%type;BEGINOPEN guru99_det;LOOPFETCH guru99_det INTO lv_emp_name;IF guru99_det%NOTFOUNDTHENEXIT;END IF;Dbms_output.put_line(‘Employee Fetched:‘||lv_emp_name);END LOOP;Dbms_output.put_line(‘Total rows fetched is‘||guru99_det%R0WCOUNT);CLOSE guru99_det;END:/
Выход
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYTotal rows fetched is 3
Пояснение к коду:
- Строка кода 2 : Объявление курсора guru99_det для оператора SELECT emp_name FROM emp.
- Строка кода 3 : Объявление переменной lv_emp_name.
- Строка кода 5 : Открытие курсора guru99_det.
- Строка кода 6: настройка оператора цикла Basic для выборки всех записей в таблице emp.
- Строка кода 7: Выбирает данные guru99_det и присваивает значение lv_emp_name.
- Строка кода 9: Использование атрибута курсора "% NOTFOUND", чтобы определить, все ли записи в курсоре выбраны. При извлечении он вернет «ИСТИНА», и управление выйдет из цикла, иначе элемент управления продолжит извлекать данные из курсора и печатать данные.
- Строка кода 11: условие EXIT для оператора цикла.
- Строка кода 12: Распечатайте полученное имя сотрудника.
- Строка кода 14: Использование атрибута курсора "% ROWCOUNT" для определения общего количества записей, которые были затронуты / выбраны в курсоре.
- Строка кода 15: После выхода из цикла курсор закрывается, и выделенная память освобождается.
Оператор курсора цикла FOR
Оператор FOR LOOP может использоваться для работы с курсорами. Мы можем указать имя курсора вместо ограничения диапазона в операторе цикла FOR, чтобы цикл работал от первой записи курсора до последней записи курсора. Переменная курсора, открытие курсора, выборка и закрытие курсора будут выполняться неявно циклом FOR.
Синтаксис:
DECLARECURSORIS
- В приведенном выше синтаксисе часть объявления содержит объявление курсора.
- Курсор создается для оператора SELECT, указанного в объявлении курсора.
- В части выполнения объявленный курсор устанавливается в цикле FOR, и переменная цикла «I» в этом случае будет вести себя как переменная курсора.
Пример 1 : В этом примере мы спроецируем все имена сотрудников из таблицы emp, используя цикл FOR с курсором.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;BEGINFOR lv_emp_name IN guru99_detLOOPDbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name);END LOOP;END;/
Выход
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY
Пояснение к коду:
- Строка кода 2 : Объявление курсора guru99_det для оператора SELECT emp_name FROM emp.
- Строка кода 4 : Создание цикла FOR для курсора с переменной цикла lv_emp_name.
- Строка кода 5: печать имени сотрудника на каждой итерации цикла.
- Строка кода 8: выход из цикла
Примечание. В цикле Cursor-FOR нельзя использовать атрибуты курсора, поскольку открытие, выборка и закрытие курсора выполняется неявно циклом FOR.