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.
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.

