Oracle PL/SQL BULK COLLECT: FORALL Példa

Mi az a BULK COLLECT?

A BULK COLLECT csökkenti a kontextusváltást az SQL és a PL/SQL motor között, és lehetővé teszi az SQL motor számára a rekordok egyidejű lekérését.

Oracle A PL/SQL biztosítja a rekordok tömeges lekérésének funkcióját, nem pedig egyenként. Ez a BULK COLLECT használható a 'SELECT' utasításban a rekordok tömeges feltöltésére vagy a kurzor tömeges lekérésére. Mivel a BULK COLLECT a rekordot BULK-ban kéri le, az INTO záradéknak mindig tartalmaznia kell egy gyűjtemény típusú változót. A BULK COLLECT használatának fő előnye, hogy az adatbázis és a PL/SQL motor közötti interakció csökkentésével növeli a teljesítményt.

Syntax:

SELECT <columnl> BULK COLLECT INTO bulk_varaible FROM <table name>;
FETCH <cursor_name> BULK COLLECT INTO <bulk_varaible >;

A fenti szintaxisban a BULK COLLECT használatos a „SELECT” és „FETCH” utasításból származó adatok összegyűjtésére.

FORALL záradék

A FORALL lehetővé teszi a DML műveletek tömeges végrehajtását az adatokon. Hasonló a FOR ciklus utasításához, kivéve az in FOR hurok a dolgok rekordszinten történnek, míg a FORALL-ban nincs LOOP koncepció. Ehelyett az adott tartományban lévő teljes adat egyidejű feldolgozása történik.

Syntax:

FORALL <loop_variable>in<lower range> .. <higher range> 

<DML operations>;

A fenti szintaxisban az adott DML-művelet az alsó és a magasabb tartomány közötti teljes adatra végrehajtásra kerül.

LIMIT záradék

A tömeges gyűjtési koncepció a teljes adatot ömlesztett formában tölti be a célgyűjtő változóba, azaz a teljes adatot egy lépésben tölti be a gyűjtési változóba. De ez nem tanácsos, ha a teljes betöltendő rekord nagyon nagy, mert mikor PL / SQL megpróbálja betölteni a teljes adatot, több munkamenet memóriát fogyaszt. Ezért mindig célszerű korlátozni ennek a tömeges begyűjtési műveletnek a méretét.

Ez a méretkorlát azonban könnyen elérhető, ha a ROWNUM feltételt bevezetjük a 'SELECT' utasításba, míg a kurzor esetében ez nem lehetséges.

Hogy ezt leküzdjük Oracle biztosította a „LIMIT” záradékot, amely meghatározza a tömeges rekordok számát.

Syntax:

FETCH <cursor_name> BULK COLLECT INTO <bulk_variable> LIMIT <size>;

A fenti szintaxisban a kurzorfetch utasítás a BULK COLLECT utasítást használja a LIMIT záradékkal együtt.

BULK COLLECT Tulajdonságok

Hasonló a kurzor attribútumok A BULK COLLECT rendelkezik %BULK_ROWCOUNT(n) értékkel, amely visszaadja az n-ben érintett sorok számátth A FORALL utasítás DML utasítása, azaz megadja a FORALL utasításban érintett rekordok számát a gyűjteményváltozó minden egyes értékéhez. Az 'n' kifejezés azt az értéksort jelöli a gyűjteményben, amelyhez a sorok száma szükséges.

Példa 1: Ebben a példában az összes alkalmazott nevét kivetítjük az emp táblából a BULK COLLECT segítségével, és a FORALL segítségével 5000-rel növeljük az összes alkalmazott fizetését.

BULK COLLECT Tulajdonságok

DECLARE
CURSOR 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;
BEGIN
OPEN 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.LAST
LOOP
Dbms_output.put_line(‘Employee Fetched:‘||c_emp_name);
END LOOP:
FORALL i IN lv_emp_name.FIRST .. lv emp_name.LAST
UPDATE emp SET salaiy=salary+5000 WHERE emp_name=lv_emp_name(i);
COMMIT;	
Dbms_output.put_line(‘Salary Updated‘);
CLOSE guru99_det;
END;
/

teljesítmény

Employee Fetched:BBB
Employee Fetched:XXX 
Employee Fetched:YYY
Salary Updated

Kód magyarázata:

  • 2. kódsor: A guru99_det kurzor deklarálása a 'SELECT emp_name FROM emp' utasításhoz.
  • 3. kódsor: Az lv_emp_name_tbl deklarálása a VARCHAR2(50) táblatípusaként
  • 4. kódsor: Az lv_emp_name deklarálása lv_emp_name_tbl típusként.
  • 6. kódsor: A kurzor megnyitása.
  • 7. kódsor: A kurzor lekérése a BULK COLLECT használatával a LIMIT mérettel, mint 5000 intl lv_emp_name változó.
  • 8-11. kódsor: A FOR ciklus beállítása az lv_emp_name gyűjtemény összes rekordjának kinyomtatására.
  • 12. kódsor: A FORALL segítségével az összes alkalmazott fizetését 5000-rel frissíti.
  • 14. kódsor: A tranzakció lekötése.

Foglald össze ezt a bejegyzést a következőképpen: