Що таке КУРСОР у PL / SQL?
Курсор - це вказівник на цю контекстну область. Oracle створює контекстну область для обробки оператора SQL, який містить всю інформацію про оператор.
PL / SQL дозволяє програмісту керувати контекстною областю за допомогою курсору. Курсор містить рядки, повернені оператором SQL. Набір рядків, який утримує курсор, називається активним набором. Ці курсори також можна назвати так, щоб на них можна було посилатись з іншого місця коду.
У цьому підручнику ви дізнаєтесь-
- Неявний курсор
- Явний курсор
- Атрибути курсору
- Оператор курсору FOR
Курсор буває двох типів.
- Неявний курсор
- Явний курсор
Неявний курсор
Всякий раз, коли в базі даних відбуваються будь-які операції DML, створюється неявний курсор, який містить зазначені рядки в цій конкретній операції. Ці курсори не можуть бути названі і, отже, ними не можна керувати або посилатися з іншого місця коду. Ми можемо посилатися лише на найновіший курсор через атрибути курсору.
Явний курсор
Програмістам дозволено створювати іменовану контекстну область для виконання своїх операцій DML, щоб отримати більше контролю над нею. Явний курсор повинен бути визначений у розділі декларації блоку PL / SQL, і він створюється для оператора 'SELECT', який потрібно використовувати в коді.
Нижче наведені кроки, які стосуються роботи з явними курсорами.
- Оголошення курсору
Оголошення курсору означає просто створити одну іменовану контекстну область для оператора 'SELECT', який визначено в частині декларації. Назва цієї області контексту збігається з назвою курсора.
- Відкриття курсору
Відкриття курсора дасть PL / SQL розподіл пам'яті для цього курсору. Це зробить курсор готовим до отримання записів.
- Отримання даних із курсору
У цьому процесі виконується оператор 'SELECT', а отримані рядки зберігаються у виділеній пам'яті. Зараз вони називаються активними наборами. Отримання даних із курсору - це діяльність на рівні запису, що означає, що ми можемо отримати доступ до даних способом запису за записом.
Кожен оператор отримання отримає один активний набір і містить інформацію про цей конкретний запис. Цей вислів такий самий, як оператор 'SELECT', який отримує запис і призначає змінну в реченні 'INTO', але він не створює жодних винятків.
- Закриття курсору
Як тільки весь запис отримано зараз, нам потрібно закрити курсор, щоб звільнилася пам’ять, виділена цій контекстній області.
Синтаксис:
DECLARECURSORIS
- У наведеному вище синтаксисі частина декларації містить декларацію курсора та змінну курсору, в якій будуть присвоєні отримані дані.
- Курсор створюється для оператора 'SELECT', який подається в декларації курсора.
- У частині виконання оголошений курсор відкривається, отримується та закривається.
Атрибути курсору
І неявний курсор, і явний курсор мають певні атрибути, до яких можна отримати доступ. Ці атрибути дають більше інформації про операції з курсором. Нижче наведені різні атрибути курсору та їх використання.
Атрибут курсору | Опис |
% ЗНАЙДЕНО | Він повертає булевий результат "TRUE", якщо остання операція отримання отримала запис успішно, інакше він поверне FALSE. |
%НЕ ЗНАЙДЕНО | Це працює навпаки% FOUND, він поверне "TRUE", якщо остання операція отримання не змогла отримати жодного запису. |
% ІЗОПЕН | Він повертає булевий результат "TRUE", якщо даний курсор уже відкритий, інакше повертає "FALSE" |
% ROWCOUNT | Він повертає числове значення. Він надає фактичну кількість записів, які зазнали впливу діяльності DML. |
Приклад 1 : У цьому прикладі ми побачимо, як оголосити, відкрити, отримати та закрити явний курсор.
Ми спроектуємо все ім’я працівника з таблиці emp за допомогою курсору. Ми також будемо використовувати атрибут cursor, щоб встановити цикл для отримання всього запису з курсору.
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 loop для отримання всіх записів у таблиці 'emp'.
- Рядок коду 7: Отримує дані guru99_det і присвоює значення lv_emp_name.
- Рядок коду 9: Використання атрибута курсору '% NOTFOUND', щоб визначити, чи отримано весь запис у курсорі. Якщо його отримати, він поверне значення "TRUE", а елемент керування вийде з циклу, інакше елемент керування буде продовжувати отримувати дані з курсору та друкувати дані.
- Рядок коду 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.