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