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, щоб налаштувати цикл для отримання всіх записів з курсору.

Oracle Курсор PL/SQL

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.