Hromadný zber Oracle PL / SQL: FORALL Príklad

Obsah:

Anonim

Čo je BULK COLLECT?

BULK COLLECT redukuje kontextové prepínania medzi motorom SQL a PL / SQL a umožňuje motoru SQL načítať záznamy naraz.

Oracle PL / SQL poskytuje funkciu hromadného načítania záznamov namiesto hromadného načítania. Tento HROMADNÝ VÝBER je možné použiť vo vyhlásení 'SELECT' na hromadné vyplnenie záznamov alebo na hromadné načítanie kurzora. Pretože BULK COLLECT načítava záznam v BULK, klauzula INTO by mala vždy obsahovať premennú typu kolekcie. Hlavnou výhodou použitia BULK COLLECT je zvýšenie výkonu znížením interakcie medzi databázou a PL / SQL engine.

Syntax:

SELECT  BULK COLLECT INTO bulk_varaible FROM 
;FETCH  BULK COLLECT INTO ;

Vo vyššie uvedenej syntaxe sa BULK COLLECT používa na zhromažďovanie údajov z príkazov „SELECT“ a „FETCH“.

V tomto návode sa naučíte

  • FORALL klauzula
  • LIMITNÁ doložka
  • Atribúty BULK COLLECT

FORALL klauzula

FORALL umožňuje hromadne vykonávať operácie DML s údajmi. Je to podobné ako v prípade príkazu FOR loop, až na to, že v cykloch FOR sa veci dejú na úrovni záznamu, zatiaľ čo vo FORALL neexistuje koncept LOOP. Namiesto toho sa súčasne spracúvajú všetky údaje nachádzajúce sa v danom rozsahu.

Syntax:

FORALL in;

Vo vyššie uvedenej syntaxi sa daná operácia DML vykoná pre všetky údaje, ktoré sú prítomné medzi nižším a vyšším rozsahom.

LIMITNÁ doložka

Koncept hromadného zhromažďovania načíta všetky údaje do cieľovej premennej zhromažďovania ako hromadné, tj. Všetky údaje sa naraz naplnia do premennej zhromažďovania. Ale to sa neodporúča, keď je celkový záznam, ktorý je potrebné načítať, veľmi veľký, pretože keď sa PL / SQL pokúša načítať celé údaje, spotrebuje to viac pamäte relácie. Preto je vždy dobré obmedziť veľkosť tejto operácie hromadného zberu.

Tento limit veľkosti je však možné ľahko dosiahnuť zavedením podmienky ROWNUM do príkazu „SELECT“, zatiaľ čo v prípade kurzora to nie je možné.

Na prekonanie tohto problému spoločnosť Oracle poskytla doložku „LIMIT“, ktorá definuje počet záznamov, ktoré je potrebné zahrnúť hromadne.

Syntax:

FETCH  BULK COLLECT INTO  LIMIT ;

Vo vyššie uvedenej syntaxi používa príkaz na vyzdvihnutie kurzora príkaz BULK COLLECT spolu s klauzulou LIMIT.

Atribúty BULK COLLECT

Podobne ako atribúty kurzora BULK COLLECT má% BULK_ROWCOUNT (n), ktorý vracia počet ovplyvnených riadkov v n- tom vyhlásení DML príkazu FORALL, tj poskytne počet záznamov ovplyvnených v príkaze FORALL pre každú jednu hodnotu z kolekcie premenná. Výraz „n“ označuje postupnosť hodnôt v kolekcii, pre ktorú je potrebný počet riadkov.

Príklad 1 : V tomto príklade premietneme celé meno zamestnanca z tabuľky emp pomocou programu BULK COLLECT a tiež pomocou programu FORALL zvýšime plat všetkých zamestnancov o 5 000.

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

Výkon

Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYSalary Updated

Vysvetlenie kódu:

  • Riadok kódu 2 : Deklarovanie kurzora guru99_det pre príkaz „SELECT emp_name FROM emp“.
  • Riadok kódu 3 : Deklarovanie lv_emp_name_tbl ako typu tabuľky VARCHAR2 (50)
  • Riadok kódu 4 : Deklarovanie lv_emp_name ako typu lv_emp_name_tbl.
  • Riadok kódu 6: Otvorenie kurzora.
  • Riadok kódu 7: Načítanie kurzora pomocou HROMADNÉHO ZBIERKY s veľkosťou LIMIT ako 5 000 premenná intl lv_emp_name.
  • Riadok kódu 8-11: Nastavenie slučky FOR na vytlačenie všetkých záznamov v zbierke lv_emp_name.
  • Riadok kódu 12: Pomocou FORALLU sa aktualizuje plat všetkých zamestnancov o 5 000.
  • Riadok kódu 14: Zaviazanie sa transakcie.