Oracle PL/SQL BULK COLLECT: FORALL Exempel

Vad รคr BULK COLLECT?

BULK COLLECT minskar kontextvรคxlingarna mellan SQL och PL/SQL-motorn och tillรฅter SQL-motorn att hรคmta posterna pรฅ en gรฅng.

Oracle PL/SQL tillhandahรฅller funktionen att hรคmta posterna i bulk istรคllet fรถr att hรคmta en efter en. Denna BULK COLLECT kan anvรคndas i 'SELECT'-satsen fรถr att fylla i posterna i bulk eller fรถr att hรคmta markรถren i bulk. Eftersom BULK COLLECT hรคmtar posten i BULK, bรถr INTO-satsen alltid innehรฅlla en samlingsvariabel. Den stรถrsta fรถrdelen med att anvรคnda BULK COLLECT รคr att det รถkar prestandan genom att minska interaktionen mellan databasen och PL/SQL-motorn.

Syntax:

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

I ovanstรฅende syntax anvรคnds BULK COLLECT fรถr att samla in data frรฅn "SELECT" och "FETCH"-satsen.

FORALL Klausul

FORALL gรถr det mรถjligt att utfรถra DML-operationer pรฅ data i bulk. Det liknar det fรถr FOR loop-satsen fรถrutom i Fร–R slinga saker hรคnder pรฅ rekordnivรฅ medan det i FORALL inte finns nรฅgot LOOP-koncept. Istรคllet bearbetas hela data som finns i det givna intervallet samtidigt.

Syntax:

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

<DML operations>;

I ovanstรฅende syntax kommer den givna DML-operationen att exekveras fรถr hela data som finns mellan lรคgre och hรถgre intervall.

LIMIT-klausul

Massinsamlingskonceptet lรคser in hela data i mรฅlinsamlingsvariabeln som en bulk, dvs hela data kommer att fyllas i insamlingsvariabeln pรฅ en gรฅng. Men detta รคr inte tillrรฅdligt nรคr den totala posten som behรถver laddas รคr mycket stor, fรถr nรคr PL / SQL fรถrsรถker ladda hela data det fรถrbrukar mer sessionsminne. Dรคrfรถr รคr det alltid bra att begrรคnsa storleken pรฅ denna bulkuppsamlingsoperation.

Denna storleksgrรคns kan dock enkelt uppnรฅs genom att infรถra ROWNUM-villkoret i 'SELECT'-satsen, medan detta inte รคr mรถjligt fรถr markรถren.

Fรถr att รถvervinna detta Oracle har tillhandahรฅllit 'LIMIT'-klausul som definierar antalet poster som mรฅste inkluderas i bulken.

Syntax:

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

I ovanstรฅende syntax anvรคnder cursor fetch-satsen BULK COLLECT-satsen tillsammans med LIMIT-satsen.

BULK COLLECT-attribut

Liknar markรถren attributen BULK COLLECT har %BULK_ROWCOUNT(n) som returnerar antalet pรฅverkade rader i nth DML-satsen fรถr FORALL-satsen, dvs den kommer att ge antalet poster som pรฅverkas i FORALL-satsen fรถr varje enskilt vรคrde frรฅn samlingsvariabeln. Termen 'n' indikerar vรคrdesekvensen i samlingen, fรถr vilken radrรคkningen behรถvs.

Exempelvis 1: I det hรคr exemplet kommer vi att projicera alla anstรคlldas namn frรฅn emp-tabellen med BULK COLLECT och vi kommer ocksรฅ att รถka lรถnen fรถr alla anstรคllda med 5000 med FORALL.

BULK COLLECT-attribut

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

Code Fรถrklaring:

  • Code linje 2: Deklarerar markรถren guru99_det fรถr satsen 'SELECT emp_name FROM emp'.
  • Code linje 3: Deklarerar lv_emp_name_tbl som tabelltyp fรถr VARCHAR2(50)
  • Code linje 4: Deklarerar lv_emp_name som lv_emp_name_tbl-typ.
  • Code rad 6: ร–ppnar markรถren.
  • Code rad 7: Hรคmta markรถren med BULK COLLECT med LIMIT-storleken som 5000 intl lv_emp_name-variabel.
  • Code rad 8-11: Stรคlla in FOR-loop fรถr att skriva ut alla poster i samlingen lv_emp_name.
  • Code rad 12: Anvรคnder FORALL fรถr att uppdatera lรถnen fรถr alla anstรคllda med 5000.
  • Code rad 14: Begรฅ transaktionen.

Sammanfatta detta inlรคgg med: