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: Ангажиране на транзакцията.