Oracle PL / SQL BULK COLLECT: FORALL példa

Tartalomjegyzék:

Anonim

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 egyszerre történő letöltését.

Az Oracle PL / SQL a rekordok tömeges lekérésének funkcióját nyújtja, nem pedig egyenként. Ez a BULK COLLECT felhaszná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 lekéri a rekordot BULK-ban, az INTO záradéknak mindig tartalmaznia kell egy gyűjteménytípus változót. A BULK COLLECT használatának fő előnye, hogy növeli a teljesítményt azáltal, hogy csökkenti az adatbázis és a PL / SQL motor közötti kölcsönhatást.

Szintaxis:

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

A fenti szintaxisban a BULK COLLECT-et használják a 'SELECT' és a 'FETCH' utasítás adatainak összegyűjtéséhez.

Ebben az oktatóanyagban megtanulja-

  • FORALL záradék
  • LIMIT záradék
  • BULK COLLECT attribútumok

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 a FOR ciklusban, a dolgok rekord szinten történnek, míg a FORALL-ban nincs LOOP koncepció. Ehelyett az adott tartományban lévő teljes adat egyidejűleg kerül feldolgozásra.

Szintaxis:

FORALL in;

A fenti szintaxisban az adott DML műveletet az alacsonyabb és a magasabb tartomány közötti teljes adatra végrehajtjuk.

LIMIT záradék

A tömeges gyűjtési koncepció a teljes adatot tömegesen tölti be a célgyűjtési változóba, vagyis a teljes adat egyszeri feltöltéssel kerül be a gyűjtési változóba. De ez nem tanácsos, ha a betöltendő teljes rekord nagyon nagy, mert amikor a PL / SQL megpróbálja betölteni a teljes adatot, több munkamemória fogyaszt. Ezért mindig jó korlátozni ennek a tömeges gyűjtési műveletnek a méretét.

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

Ennek kiküszöbölése érdekében az Oracle egy „LIMIT” záradékot adott, amely meghatározza az ömlesztve felvenni kívánt rekordok számát.

Szintaxis:

FETCH  BULK COLLECT INTO  LIMIT ;

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

BULK COLLECT attribútumok

Hasonlóan a kurzorattribútumokhoz, a BULK COLLECT% BULK_ROWCOUNT (n) értékkel rendelkezik, amely visszaadja a FORALL utasítás n- edik DML utasításában érintett sorok számát , vagyis megadja a FORALL utasításban érintett rekordok számát a gyűjtemény minden egyes értékéhez változó. Az 'n' kifejezés a gyűjtemény azon értékének sorrendjét jelöli, amelyhez sorszámra van szükség.

1. példa : Ebben a példában a BULK COLLECT használatával kivetítjük az összes alkalmazott nevét az emp táblázatból, és a FORALL használatával emelni fogjuk az összes alkalmazott fizetését 5000-tel.

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

Kimenet

Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYSalary Updated

Kód Magyarázat:

  • 2. kódsor: A „SELECT emp_name FROM emp” utasítás guru99_det kurzorának deklarálása.
  • 3. kódsor: Az lv_emp_name_tbl deklarálása a VARCHAR2 táblatípusaként (50)
  • 4. kódsor: Az lv_emp_name deklarálása lv_emp_name_tbl típusnak.
  • 6. kódsor : A kurzor megnyitása.
  • 7. kódsor : A kurzor lekérése a BULK COLLECT használatával, amelynek LIMIT mérete 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ához.
  • 12. kódsor : A FORALL használatával az összes alkalmazott fizetésének 5000-tel történő frissítése.
  • 14. kódsor : A tranzakció végrehajtása.