Oracle PL / SQL BULK COLLECT: FORALL Приклад

Зміст:

Anonim

Що таке BULK COLLECT?

BULK COLLECT зменшує перемикання контексту між механізмами SQL та PL / SQL і дозволяє двигуну SQL одночасно отримувати записи.

Oracle PL / SQL забезпечує функціональність отримання записів масово, а не отримання по одному. Цей BULK COLLECT можна використовувати в операторі 'SELECT' для заповнення записів масово або для отримання курсора масово. Оскільки BULK COLLECT отримує запис у BULK, речення INTO завжди повинно містити змінну типу колекції. Основною перевагою використання BULK COLLECT є підвищення продуктивності за рахунок зменшення взаємодії між базою даних та механізмом PL / SQL.

Синтаксис:

SELECT  BULK COLLECT INTO bulk_varaible FROM 
;FETCH  BULK COLLECT INTO ;

У наведеному вище синтаксисі BULK COLLECT використовується для збору даних із операторів 'SELECT' та 'FETCH'.

У цьому підручнику ви дізнаєтесь-

  • Застереження FORALL
  • Стаття ОБМЕЖЕННЯ
  • Атрибути BULK COLLECT

Застереження FORALL

FORALL дозволяє виконувати операції DML з даними масово. Це схоже на оператор циклу FOR, за винятком циклу FOR, речі відбуваються на рівні запису, тоді як у FORALL немає концепції LOOP. Натомість усі дані, присутні в даному діапазоні, обробляються одночасно.

Синтаксис:

FORALL in;

У наведеному вище синтаксисі дана операція DML буде виконана для всіх даних, які знаходяться між нижчим та вищим діапазоном.

Стаття ОБМЕЖЕННЯ

Концепція масового збору завантажує всі дані до цільової змінної збору як групова, тобто цілі дані будуть одночасно завантажені до змінної збору. Але це недоцільно, коли загальний запис, який потрібно завантажити, дуже великий, тому що коли PL / SQL намагається завантажити всі дані, це споживає більше пам'яті сеансу. Отже, завжди добре обмежити розмір цієї операції масового збору.

Однак цього обмеження розміру можна легко досягти, ввівши умову ROWNUM в операторі 'SELECT', тоді як у випадку курсору це неможливо.

Для подолання цього Oracle передбачив пункт «LIMIT», який визначає кількість записів, які потрібно включити в групу.

Синтаксис:

FETCH  BULK COLLECT INTO  LIMIT ;

У наведеному вище синтаксисі оператор вибору курсора використовує оператор BULK COLLECT разом із реченням LIMIT.

Атрибути BULK COLLECT

Подібно до атрибутів курсора, BULK COLLECT має% BULK_ROWCOUNT (n), що повертає кількість рядків, що зазнали впливу в n- му DML-операторі оператора FORALL, тобто це дасть кількість записів, що зазнали впливу в операторі FORALL, для кожного окремого значення з колекції змінна. Термін 'n' вказує на послідовність значень у колекції, для якої необхідний підрахунок рядків.

Приклад 1 : У цьому прикладі ми спроектуємо всі імена співробітників із таблиці emp, використовуючи BULK COLLECT, а також збираємося збільшити зарплату всіх співробітників на 5000, використовуючи FORALL.

DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;TYPE lv_emp_name_tbl IS TABLE OF VARCHAR2(50);lv_emp_name lv_emp_name_tbl;BEGINOPEN guru99_det;FETCH guru99_det BULK COLLECT INTO lv_emp_name LIMIT 5000;FOR c_emp_name IN lv_emp_name.FIRST… lv_emp_name.LASTLOOPDbms_output.put_line(‘Employee Fetched:‘||c_emp_name);END LOOP:FORALL i IN lv_emp_name.FIRST… lv emp_name.LASTUPDATE emp SET salaiy=salary+5000 WHERE emp_name=lv_emp_name(i);COMMIT; Dbms_output.put_line(‘Salary Updated‘);CLOSE guru99_det;END;/

Вихідні дані

Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYSalary Updated

Пояснення коду:

  • Рядок коду 2 : Оголошення курсора guru99_det для виразу "SELECT emp_name FROM emp".
  • Рядок коду 3 : Оголошення lv_emp_name_tbl як типу таблиці VARCHAR2 (50)
  • Рядок коду 4 : Оголошення lv_emp_name як типу lv_emp_name_tbl.
  • Рядок коду 6: Відкриття курсору.
  • Рядок коду 7: Отримання курсора за допомогою функції BULK COLLECT із розміром LIMIT як 5000 змінних intv lv_emp_name.
  • Рядок коду 8-11: Налаштування циклу FOR для друку всього запису в колекції lv_emp_name.
  • Код рядок 12: Використання FORALL оновлює заробітну плату всього працівника на 5000.
  • Код, рядок 14: Фіксація транзакції.