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 intl lv_emp_name переменной.
  • Строка кода 8-11: Настройка цикла FOR для печати всей записи в коллекции lv_emp_name.
  • Строка кода 12: Использование FORALL обновляет зарплату всех сотрудников на 5000.
  • Строка кода 14: Подтверждение транзакции.