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