Oracle Курсор PL/SQL: неявний, явний, цикл For із прикладом
Що таке CURSOR у PL/SQL?
Курсор є вказівником на цю область контексту. Oracle створює контекстну область для обробки оператора SQL, яка містить всю інформацію про оператор.
PL/SQL дозволяє програмісту керувати контекстною областю за допомогою курсору. Курсор утримує рядки, повернуті оператором SQL. Набір рядків, які містить курсор, називається активним набором. Ці курсори також можна назвати так, щоб на них можна було посилатися з іншого місця коду.
Курсор буває двох видів.
- Неявний курсор
- Явний курсор
Неявний курсор
Кожного разу, коли в базі даних відбуваються будь-які операції DML, створюється неявний курсор, який утримує рядки, на які впливає ця конкретна операція. Ці курсори не можуть бути названі і, отже, ними не можна керувати або посилатися з іншого місця коду. Ми можемо посилатися лише на останній курсор через атрибути курсору.
Явний курсор
Програмістам дозволено створювати іменовану контекстну область для виконання своїх операцій DML, щоб отримати більше контролю над нею. Явний курсор має бути визначений у розділі оголошень Блок PL/SQLі створено для оператора SELECT, який потрібно використовувати в коді.
Нижче наведено кроки, пов’язані з роботою з явними курсорами.
- Оголошення курсора Оголошення курсора просто означає створення однієї іменованої контекстної області для оператора 'SELECT', який визначено в частині оголошення. Назва цієї контекстної області така ж, як і назва курсора.
- Курсор відкриттяЯкщо відкрити курсор, ви отримаєте вказівку PL / SQL щоб виділити пам'ять для цього курсору. Це зробить курсор готовим до отримання записів.
- Отримання даних з курсоруУ цьому процесі виконується оператор «SELECT», а отримані рядки зберігаються у виділеній пам’яті. Тепер вони називаються активними наборами. Отримання даних із курсору — це діяльність на рівні запису, що означає, що ми можемо отримувати доступ до даних у спосіб запис за записом. Кожен оператор fetch вибирає один активний набір і містить інформацію про цей конкретний запис. Цей оператор такий самий, як і оператор «SELECT», який отримує запис і призначає змінну в реченні «INTO», але він не створить жодних винятків.
- Закриття курсоруПісля того, як усі записи буде отримано, нам потрібно закрити курсор, щоб звільнити пам’ять, виділену для цієї області контексту.
синтаксис
DECLARE CURSOR <cursor_name> IS <SELECT statement^> <cursor_variable declaration> BEGIN OPEN <cursor_name>; FETCH <cursor_name> INTO <cursor_variable>; . . CLOSE <cursor_name>; END;
- У наведеному вище синтаксисі частина оголошення містить оголошення курсора та змінної курсора, у якій будуть призначені отримані дані.
- Курсор створюється для оператора 'SELECT', який надається в декларації курсора.
- У частині виконання оголошений курсор відкривається, вибирається та закривається.
Атрибути курсора
Як неявний курсор, так і явний курсор мають певні атрибути, до яких можна отримати доступ. Ці атрибути надають більше інформації про операції з курсором. Нижче наведено різні атрибути курсору та їх використання.
Атрибут курсора | Опис |
---|---|
% ЗНАЙДЕНО | Він повертає логічний результат "ІСТИНА", якщо остання операція вибірки успішно витягла запис, інакше повертає ЛОЖНЕ. |
%НЕ ЗНАЙДЕНО | Це працює протилежно до %FOUND, воно поверне «ІСТИНА», якщо під час останньої операції отримання не вдалося отримати жодного запису. |
%ISOPEN | Він повертає логічний результат "TRUE", якщо даний курсор уже відкрито, інакше він повертає "FALSE" |
%ROWCOUNT | Він повертає числове значення. Він дає фактичну кількість записів, на які вплинула діяльність DML. |
Явний приклад курсору:
У цьому прикладі ми побачимо, як оголосити, відкрити, отримати та закрити явний курсор.
Ми спроектуємо все ім’я співробітника з таблиці emp за допомогою курсору. Ми також будемо використовувати атрибут cursor, щоб налаштувати цикл для отримання всіх записів з курсору.
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; lv_emp_name emp.emp_name%type; BEGIN OPEN guru99_det; LOOP FETCH guru99_det INTO lv_emp_name; IF guru99_det%NOTFOUND THEN EXIT; 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:BBB Employee Fetched:XXX Employee Fetched:YYY Total rows fetched is 3
Пояснення коду
- Рядок коду 2: Оголошення курсору guru99_det для оператора 'SELECT emp_name FROM emp'.
- Рядок коду 3: Оголошення змінної lv_emp_name.
- Рядок коду 5: відкриття курсору guru99_det.
- Рядок коду 6: Налаштування базового оператора циклу для отримання всіх записів у таблиці 'emp'.
- Рядок коду 7: Отримує дані guru99_det і призначає значення lv_emp_name.
- Рядок коду 9: Використання атрибута курсору "%NOTFOUND", щоб визначити, чи всі записи в курсорі отримано. Якщо отримано, він поверне «ІСТИНА», і керування вийде з циклу, інакше керування продовжить отримувати дані з курсору та друкуватиме дані.
- Рядок коду 11: Умова EXIT для оператора циклу.
- Рядок коду 12: Надрукуйте отримане ім'я співробітника.
- Рядок коду 14: Використовуючи атрибут курсора '%ROWCOUNT', щоб знайти загальну кількість записів, на які вплинуло/витягнуто курсор.
- Рядок коду 15: Після виходу з циклу курсор закривається, а виділена пам'ять звільняється.
Оператор курсору циклу FOR
Оператор “FOR LOOP” можна використовувати для роботи з курсорами. Ми можемо вказати назву курсору замість обмеження діапазону в операторі циклу FOR, щоб цикл працював від першого запису курсору до останнього запису курсору. Курсорна змінна, відкриття курсору, вибірка та закриття курсору будуть виконані неявно за допомогою циклу FOR.
синтаксис
DECLARE CURSOR <cursor_name> IS <SELECT statement>; BEGIN FOR I IN <cursor_name> LOOP . . END LOOP; END;
- У наведеному вище синтаксисі частина оголошення містить оголошення курсора.
- Курсор створюється для оператора 'SELECT', який надається в декларації курсора.
- У частині виконання оголошений курсор встановлюється в циклі FOR, і в цьому випадку змінна циклу «I» буде поводитися як змінна курсору.
Oracle Курсор для прикладу циклу:
У цьому прикладі ми спроектуємо всі імена співробітників із таблиці emp за допомогою циклу курсору FOR.
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; BEGIN FOR lv_emp_name IN guru99_det LOOP Dbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name); END LOOP; END; /
Вихід
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY
Пояснення коду
- Рядок коду 2: Оголошення курсору guru99_det для оператора 'SELECT emp_name FROM emp'.
- Рядок коду 4: Створення циклу «FOR» для курсору зі змінною циклу lv_emp_name.
- Рядок коду 5: Друк імені співробітника в кожній ітерації циклу.
- Рядок коду 8: Вийти з циклу
Примітка: У циклі Cursor-FOR атрибути курсору не можна використовувати, оскільки відкриття, вибірка та закриття курсора здійснюється неявно за допомогою Цикл FOR.