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.

Atribute BULK COLLECT

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.

Rezumaศ›i aceastฤƒ postare cu: