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;/