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.
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.

