Oracle PL/SQL BULK COLLECT: FORALL Eksempel

Hvad er BULK COLLECT?

BULK COLLECT reducerer kontekstskift mellem SQL og PL/SQL-motor og tillader SQL-motor at hente posterne på én gang.

Oracle PL/SQL giver funktionaliteten til at hente posterne i bulk i stedet for at hente én efter én. Denne BULK COLLECT kan bruges i 'SELECT'-sætningen til at udfylde posterne i bulk eller til at hente markøren i bulk. Da BULK COLLECT henter posten i BULK, bør INTO-udtrykket altid indeholde en samlingstypevariabel. Den største fordel ved at bruge BULK COLLECT er, at det øger ydeevnen ved at reducere interaktionen mellem databasen og PL/SQL-motoren.

Syntaks:

SELECT <columnl> BULK COLLECT INTO bulk_varaible FROM <table name>;
FETCH <cursor_name> BULK COLLECT INTO <bulk_varaible >;

I ovenstående syntaks bruges BULK COLLECT til at indsamle data fra 'SELECT' og 'FETCH'-sætningen.

FORALL klausul

FORALL gør det muligt at udføre DML-operationer på data i bulk. Det svarer til FOR loop-sætningen undtagen i FOR sløjfe ting sker på rekordniveau, mens der i FORALL ikke er noget LOOP-koncept. I stedet behandles alle data, der er til stede i det givne område, på samme tid.

Syntaks:

FORALL <loop_variable>in<lower range> .. <higher range> 

<DML operations>;

I ovenstående syntaks vil den givne DML-operation blive udført for hele data, der er til stede mellem lavere og højere område.

LIMIT klausul

Masseindsamlingskonceptet indlæser alle data i målindsamlingsvariablen som en bulk, dvs. hele data vil blive udfyldt i indsamlingsvariablen på én gang. Men dette er ikke tilrådeligt, når den samlede post, der skal indlæses, er meget stor, for hvornår PL / SQL forsøger at indlæse alle data, det bruger mere sessionshukommelse. Derfor er det altid godt at begrænse størrelsen af ​​denne bulkopsamlingsoperation.

Denne størrelsesgrænse kan dog nemt opnås ved at introducere ROWNUM-betingelsen i 'SELECT'-sætningen, hvorimod dette ikke er muligt i tilfælde af cursor.

For at overvinde dette Oracle har leveret 'LIMIT'-klausul, der definerer antallet af poster, der skal inkluderes i bulken.

Syntaks:

FETCH <cursor_name> BULK COLLECT INTO <bulk_variable> LIMIT <size>;

I ovenstående syntaks bruger cursor fetch-sætningen BULK COLLECT-sætningen sammen med LIMIT-sætningen.

BULK COLLECT-attributter

Svarende til markøren attributter BULK COLLECT har %BULK_ROWCOUNT(n), der returnerer antallet af berørte rækker i nth DML-sætning af FORALL-sætningen, dvs. den vil give antallet af poster, der er påvirket i FORALL-sætningen, for hver enkelt værdi fra samlingsvariablen. Udtrykket 'n' angiver rækkefølgen af ​​værdi i samlingen, for hvilken rækkeantallet er nødvendigt.

Eksempel 1: I dette eksempel vil vi projicere hele medarbejdernavnet fra emp-tabellen ved hjælp af BULK COLLECT, og vi vil også øge lønnen for alle medarbejdere med 5000 ved hjælp af FORALL.

BULK COLLECT-attributter

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

Produktion

Employee Fetched:BBB
Employee Fetched:XXX 
Employee Fetched:YYY
Salary Updated

Kodeforklaring:

  • Kodelinje 2: Erklærer markøren guru99_det for sætningen 'SELECT emp_name FROM emp'.
  • Kodelinje 3: Erklærer lv_emp_name_tbl som tabeltype for VARCHAR2(50)
  • Kodelinje 4: Erklærer lv_emp_name som lv_emp_name_tbl type.
  • Kodelinje 6: Åbning af markøren.
  • Kodelinje 7: Henter markøren ved hjælp af BULK COLLECT med størrelsen LIMIT som 5000 intl lv_emp_name variabel.
  • Kodelinje 8-11: Opsætning af FOR-løkke til at udskrive hele posten i samlingen lv_emp_name.
  • Kodelinje 12: Bruger FORALL opdatering af lønnen for alle medarbejdere med 5000.
  • Kodelinje 14: Forpligtelse af transaktionen.