Oracle PL/SQL BULK COLLECT: FORALL Exemplu
โก Rezumat inteligent
COLECTARE รN VRAC รฎn Oracle PL/SQL preia mai multe rรขnduri simultan รฎntr-o colecศie, รฎn timp ce FORALL รฎmpinge DML รฎn bloc รฎnapoi รฎn baza de date. Ambele eliminฤ comutarile de context รฎntre motoarele SQL ศi PL/SQL, crescรขnd performanศa.

Ce este BULK COLLECT?
BULK COLLECT reduce schimbฤrile de context รฎntre SQL ศi motorul PL/SQL ศi permite motorului SQL sฤ preia รฎnregistrฤrile simultan.
Oracle PL / SQL oferฤ funcศionalitatea de preluare a รฎnregistrฤrilor รฎn bloc, รฎn loc de preluarea lor individualฤ. Aceastฤ instrucศiune BULK COLLECT poate fi utilizatฤ รฎntr-o instrucศiune SELECT pentru a popula รฎnregistrฤrile รฎn bloc sau pentru a prelua o cursor รฎn bloc. Deoarece BULK COLLECT preia รฎnregistrฤrile รฎn bloc, clauza INTO ar trebui sฤ conศinฤ รฎntotdeauna o variabilฤ de tip colecศie. Principalul avantaj al utilizฤrii BULK COLLECT este cฤ creศte performanศa prin reducerea interacศiunii dintre baza de date ศi motorul PL/SQL.
Sintaxฤ:
SELECT <column1> BULK COLLECT INTO bulk_variable FROM <table name>; FETCH <cursor_name> BULK COLLECT INTO <bulk_variable>;
รn sintaxa de mai sus, BULK COLLECT este utilizat pentru a colecta datele din instrucศiunile SELECT ศi FETCH.
Clauza FORALL
Instrucศiunea FORALL executฤ Operaศiuni DML pe date รฎn bloc. Seamฤnฤ cu o instrucศiune de buclฤ FOR, cu excepศia faptului cฤ รฎntr-o buclฤ FOR acศiunile au loc la nivel de รฎnregistrare, รฎn timp ce รฎn FORALL nu existฤ conceptul de BUCLฤ. รn schimb, toate datele prezente รฎn intervalul dat sunt procesate รฎn acelaศi timp.
Sintaxฤ:
FORALL <loop_variable> in <lower range> .. <higher range>
<DML operations>;
รn sintaxa de mai sus, operaศia DML datฤ va fi executatฤ pentru toate datele prezente รฎntre intervalul inferior ศi cel superior.
Clauza LIMIT
Conceptul de colectare รฎn bloc รฎncarcฤ toate datele รฎn variabila de colectare ศintฤ ca o operaศiune รฎn bloc, adicฤ toate datele vor fi populate รฎn variabila de colectare dintr-o singurฤ datฤ. รnsฤ acest lucru nu este recomandabil atunci cรขnd numฤrul total de รฎnregistrฤri care trebuie รฎncฤrcate este foarte mare, deoarece atunci cรขnd PL/SQL รฎncearcฤ sฤ รฎncarce toate datele, consumฤ mai multฤ memorie de sesiune. Prin urmare, este รฎntotdeauna bine sฤ se limiteze dimensiunea acestei operaศiuni de colectare รฎn bloc.
Aceastฤ limitฤ de dimensiune poate fi uศor atinsฤ prin introducerea condiศiei ROWNUM รฎn instrucศiunea SELECT, รฎn timp ce รฎn cazul unui cursor acest lucru nu este posibil.
Pentru a depฤศi acest lucru, Oracle a furnizat clauza LIMIT care defineศte numฤrul de รฎnregistrฤri care trebuie incluse รฎn bloc.
Sintaxฤ:
FETCH <cursor_name> BULK COLLECT INTO <bulk_variable> LIMIT <size>;
รn sintaxa de mai sus, instrucศiunea fetch a cursorului utilizeazฤ instrucศiunea BULK COLLECT รฎmpreunฤ cu clauza LIMIT.
Atribute BULK COLLECT
Similar atributelor cursorului, BULK COLLECT are %BULK_ROWCOUNT(n) care returneazฤ numฤrul de rรขnduri afectate รฎn a n-a instrucศiune DML a instrucศiunii FORALL, adicฤ oferฤ numฤrul de รฎnregistrฤri afectate รฎn instrucศiunea FORALL pentru fiecare valoare din variabila colecศiei. Termenul โnโ indicฤ secvenศa valorii din colecศie pentru care este necesar numฤrul de rรขnduri.
Exemplu 1: รn acest exemplu, vom proiecta toate numele angajaศilor din tabela emp folosind BULK COLLECT ศi vom creศte, de asemenea, salariul tuturor angajaศilor cu 5000 folosind FORALL.
Captura de ecran de mai jos prezintฤ acest exemplu BULK COLLECT ศi FORALL รฎmpreunฤ cu rezultatul sฤu รฎn Oracle.
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 salary=salary+5000 WHERE emp_name=lv_emp_name(i); COMMIT; Dbms_output.put_line('Salary Updated'); CLOSE guru99_det; END; /
producศie
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Salary Updated
Code Explicaลฃie:
- Code linia 2: Declararea cursorului guru99_det pentru instrucศiunea โSELECT emp_name FROM empโ.
- Code linia 3: Se declarฤ lv_emp_name_tbl ca un tip de tabel de tip VARCHAR2(50).
- Code linia 4: Declararea lui lv_emp_name ca fiind tipul lv_emp_name_tbl.
- Code linia 6: Deschiderea cursorului.
- Code linia 7: Preluarea cursorului folosind BULK COLLECT cu dimensiunea LIMIT de 5000 รฎn variabila lv_emp_name.
- Code liniile 8-11: Configurarea unei bucle FOR pentru a afiศa toate รฎnregistrฤrile din colecศia lv_emp_name.
- Code linia 12: Se utilizeazฤ FORALL pentru a actualiza salariul tuturor angajaศilor cu 5000.
- Code linia 14: Angajarea tranzacศie.

