Hromadný výběr Oracle PL / SQL: FORALL Příklad

Obsah:

Anonim

Co je BULK COLLECT?

BULK COLLECT snižuje kontextové přepínání mezi SQL a PL / SQL strojem a umožňuje stroji SQL načítat záznamy najednou.

Oracle PL / SQL poskytuje funkce hromadného načítání záznamů, nikoli načítání jeden po druhém. Tento BULK COLLECT lze použít v příkazu 'SELECT' k hromadnému naplnění záznamů nebo hromadnému načítání kurzoru. Protože BULK COLLECT načte záznam v BULK, klauzule INTO by měla vždy obsahovat proměnnou typu kolekce. Hlavní výhodou použití BULK COLLECT je zvýšení výkonu snížením interakce mezi databází a PL / SQL strojem.

Syntax:

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

Ve výše uvedené syntaxi se při shromažďování dat z příkazů 'SELECT' a 'FETCH' používá BULK COLLECT.

V tomto výukovém programu se naučíte-

  • FORALL klauzule
  • LIMITNÍ doložka
  • Atributy BULK COLLECT

FORALL klauzule

FORALL umožňuje hromadné provádění operací DML s daty. Je to podobné jako u příkazu smyčky FOR, s výjimkou smyčky FOR, co se děje na úrovni záznamu, zatímco ve FORALL neexistuje koncept LOOP. Místo toho jsou všechna data přítomná v daném rozsahu zpracovávána současně.

Syntax:

FORALL in;

Ve výše uvedené syntaxi bude daná operace DML provedena pro všechna data, která jsou přítomna mezi nižším a vyšším rozsahem.

LIMITNÍ doložka

Koncept hromadného sběru načte všechna data do cílové proměnné sběru jako hromadný, tj. Celá data se najednou naplní do proměnné sběru. Ale to se nedoporučuje, když je celkový záznam, který je třeba načíst, velmi velký, protože když se PL / SQL pokusí načíst celá data, spotřebuje více paměti relace. Proto je vždy dobré omezit velikost této operace hromadného sběru.

Tohoto limitu velikosti však lze snadno dosáhnout zavedením podmínky ROWNUM do příkazu 'SELECT', zatímco v případě kurzoru to není možné.

K překonání tohoto problému poskytla společnost Oracle klauzuli „LIMIT“, která definuje počet záznamů, které je třeba hromadně zahrnout.

Syntax:

FETCH  BULK COLLECT INTO  LIMIT ;

Ve výše uvedené syntaxi používá příkaz načtení kurzoru příkaz BULK COLLECT spolu s klauzulí LIMIT.

Atributy BULK COLLECT

Podobně jako u kurzoru atributy BULK má COLLECT% BULK_ROWCOUNT (n), která vrací počet řádků ovlivněných v n -tého DML prohlášení výkazu forall, to znamená, že bude dávat počet záznamů ovlivněny ve výkazu forall pro každou hodnotu z kolekce proměnná. Termín „n“ označuje posloupnost hodnoty v kolekci, pro kterou je potřeba počet řádků.

Příklad 1 : V tomto příkladu promítneme celé jméno zaměstnance z emp tabulky pomocí BULK COLLECT a také pomocí FORALL zvýšíme plat všech zaměstnanců o 5000.

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ýstup

Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYSalary Updated

Vysvětlení kódu:

  • Řádek kódu 2 : Deklarace kurzoru guru99_det pro příkaz 'SELECT emp_name FROM emp'.
  • Řádek kódu 3 : Deklarování lv_emp_name_tbl jako typu tabulky VARCHAR2 (50)
  • Řádek kódu 4 : Deklarování lv_emp_name jako typu lv_emp_name_tbl.
  • Řádek kódu 6: Otevření kurzoru.
  • Řádek kódu 7: Načítání kurzoru pomocí HROMADNÉHO SBÍRÁNÍ s velikostí LIMIT jako 5000 proměnná intl lv_emp_name.
  • Řádek kódu 8-11: Nastavení smyčky FOR pro tisk všech záznamů v kolekci lv_emp_name.
  • Řádek kódu 12: Pomocí FORALLU se aktualizuje plat všech zaměstnanců o 5000.
  • Řádek kódu 14: Zavázání transakce.