Oracle PL/SQL BULK COLLECT: FORALL Exemplu
Ce este BULK COLLECT?
BULK COLLECT reduce schimbฤrile de context รฎntre motorul SQL ศi PL/SQL ศi permite motorului SQL sฤ preia รฎnregistrฤrile simultan.
Oracle PL/SQL oferฤ funcศionalitatea de preluare a รฎnregistrฤrilor รฎn bloc, mai degrabฤ decรขt de preluare una cรขte una. Aceastฤ BULK COLLECT poate fi folositฤ รฎn instrucศiunea โSELECTโ pentru a popula รฎnregistrฤrile รฎn bloc sau pentru a prelua cursorul รฎn bloc. Deoarece BULK COLLECT preia รฎnregistrarea รฎn BULK, 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 <columnl> BULK COLLECT INTO bulk_varaible FROM <table name>; FETCH <cursor_name> BULK COLLECT INTO <bulk_varaible >;
รn sintaxa de mai sus, BULK COLLECT este utilizat pentru colectarea datelor din instrucศiunile โSELECTโ ศi โFETCHโ.
Clauza FORALL
FORALL permite efectuarea operaศiunilor DML pe date รฎn vrac. Este similar cu cel al instrucศiunii de buclฤ FOR, cu excepศia รฎn bucla FOR lucrurile se รฎntรขmplฤ la nivel record, รฎn timp ce รฎn FORALL nu existฤ conceptul de LOOP. ร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 care sunt prezente รฎntre intervalul inferior ศi superior.
Clauza LIMIT
Conceptul de colectare รฎn bloc รฎncarcฤ datele รฎntregi รฎn variabila de colectare ศintฤ รฎn bloc, adicฤ toate datele vor fi populate รฎn variabila de colectare รฎntr-o singurฤ trecere. Dar acest lucru nu este recomandabil atunci cรขnd รฎnregistrarea totalฤ care trebuie รฎncฤrcatฤ este foarte mare, deoarece cรขnd PL / SQL รฎncearcฤ sฤ รฎncarce toate datele, consumฤ mai multฤ memorie de sesiune. Prin urmare, este รฎntotdeauna bine sฤ limitaศi dimensiunea acestei operaศiuni de colectare รฎn vrac.
Cu toate acestea, aceastฤ limitฤ de dimensiune poate fi atinsฤ cu uศurinศฤ prin introducerea condiศiei ROWNUM รฎn instrucศiunea โSELECTโ, รฎn timp ce รฎn cazul cursorului 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 cursor fetch foloseศte instrucศiunea BULK COLLECT รฎmpreunฤ cu clauza LIMIT.
Atribute BULK COLLECT
similar cursor atributele BULK COLLECT are %BULK_ROWCOUNT(n) care returneazฤ numฤrul de rรขnduri afectate รฎn nth Instrucศiunea DML a instrucศiunii FORALL, adicฤ va oferi numฤrul de รฎnregistrฤri afectate รฎn instrucศiunea FORALL pentru fiecare valoare din variabila de colecศie. Termenul โnโ indicฤ secvenศa de valori din colecศie, pentru care este necesar numฤrul de rรขnduri.
Exemplu 1: รn acest exemplu, vom proiecta tot numele angajaศilor din tabelul emp folosind BULK COLLECT ศi vom creศte, de asemenea, salariul tuturor angajaศilor cu 5000 folosind FORALL.
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; /
producศie
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Salary Updated
Code Explicaลฃie:
- Code line 2: Declararea cursorului guru99_det pentru instrucศiunea โSELECT emp_name FROM empโ.
- Code line 3: Declararea lv_emp_name_tbl ca tip de tabel al VARCHAR2(50)
- Code line 4: Declararea lv_emp_name ca tip lv_emp_name_tbl.
- Code linia 6: Deschiderea cursorului.
- Code linia 7: Preluarea cursorului folosind BULK COLLECT cu dimensiunea LIMIT ca variabilฤ 5000 intl lv_emp_name.
- Code liniile 8-11: Configurarea buclei FOR pentru a tipฤri toate รฎnregistrฤrile din colecศia lv_emp_name.
- Code linia 12: Folosind FORALL actualizarea salariului tuturor angajatilor cu 5000.
- Code linia 14: Angajarea tranzacศiei.

