Oracle PL / SQL BULK COLLECT: FORALL näide

Lang L: none (table-of-contents):

Anonim

Mis on BULK COLLECT?

BULK COLLECT vähendab kontekstivahetusi SQL-i ja PL / SQL-i vahel ning võimaldab SQL-i mootoril kirjeid korraga tuua.

Oracle PL / SQL pakub kirjete hulgi toomise funktsionaalsust, mitte ükshaaval toomist. Seda BULK COLLECT-i saab kasutada käsku 'SELECT' kirjete hulgikaubana täitmiseks või kursori hulgihakina toomiseks. Kuna BULK COLLECT tõmbab kirje BULK-is, peaks klausel INTO alati sisaldama kogu tüüpi muutujat. BULK COLLECTi kasutamise peamine eelis on see, et see suurendab jõudlust, vähendades andmebaasi ja PL / SQL-i mootori vastastikust mõju.

Süntaks:

SELECT  BULK COLLECT INTO bulk_varaible FROM 
;FETCH  BULK COLLECT INTO ;

Ülaltoodud süntaksis kasutatakse lausete 'SELECT' ja 'FETCH' andmete kogumiseks funktsiooni BULK COLLECT.

Selles õpetuses saate teada

  • FORALL klausel
  • LIMIT klausel
  • BULK COLLECT atribuudid

FORALL klausel

FORALL võimaldab teostada DML-toiminguid andmetega hulgi. See on sarnane FOR-tsükli avaldusega, välja arvatud FOR-tsüklis juhtuvad asjad rekordtasemel, samas kui FORALL-is pole LOOP-i kontseptsiooni. Selle asemel töödeldakse samal ajal kõiki antud vahemikus olevaid andmeid.

Süntaks:

FORALL in;

Ülaltoodud süntaksis viiakse antud DML-toiming läbi kõigi andmete suhtes, mis asuvad madalama ja suurema vahemiku vahel.

LIMIT klausel

Hulgikogumise kontseptsioon laadib kogu andmed sihtkogumise muutujasse lahtiselt, st kogu teave täidetakse kogu muutujaga ühe korraga. Kuid see pole soovitatav, kui kogu laaditav kirje on väga suur, sest kui PL / SQL proovib kogu andmeid laadida, kulutab see rohkem seansimälu. Seetõttu on alati hea piirata selle kogumisoperatsiooni suurust.

Selle suuruse piirangu saab aga hõlpsasti saavutada, kui sisestada ROWNUM tingimus lausesse 'SELECT', kusjuures kursori puhul pole see võimalik.

Selle ületamiseks on Oracle pakkunud klauslit „LIMIT”, mis määratleb hulga hulka kuuluvate kirjete arvu.

Süntaks:

FETCH  BULK COLLECT INTO  LIMIT ;

Ülaltoodud süntaksis kasutab kursori toomise lause lauset BULK COLLECT koos klausliga LIMIT.

BULK COLLECT atribuudid

Sarnaselt kursori atribuutidele on ka BULK COLLECT-l% BULK_ROWCOUNT (n), mis tagastab FORALL-i lause n- ndas DML-i avalduses mõjutatud ridade arvu , st see annab FORALL-i avalduses mõjutatud kirjete arvu kogu üksiku väärtuse kohta muutuv. Termin n tähistab kogu väärtuse jada, mille jaoks on vaja ridade arvu.

Näide 1 : Selles näites projitseerime BULK COLLECTi abil kogu töötaja nime emp tabelist ja suurendame FORALLi abil ka kõigi töötajate palka 5000 võrra.

DECLARECURSOR 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;BEGINOPEN 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.LASTLOOPDbms_output.put_line(‘Employee Fetched:‘||c_emp_name);END LOOP:FORALL i IN lv_emp_name.FIRST… lv emp_name.LASTUPDATE emp SET salaiy=salary+5000 WHERE emp_name=lv_emp_name(i);COMMIT; Dbms_output.put_line(‘Salary Updated‘);CLOSE guru99_det;END;/

Väljund

Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYSalary Updated

Koodi selgitus:

  • Koodirida 2 : Kursori „SELECT emp_name FROM emp” kursori guru99_detaili deklareerimine.
  • Koodirida 3 : lv_emp_name_tbl deklareerimine VARCHAR2 tabelitüübiks (50)
  • Koodirida 4 : lv_emp_name deklareeritakse tüübiks lv_emp_name_tbl.
  • Koodirida 6: Kursori avamine.
  • Koodirida 7: Kursori toomine funktsiooni BULK COLLECT abil muutujaga LIMIT väärtuseks 5000 intl lv_emp_name.
  • Koodirida 8-11: FOR-tsükli seadistamine kogu kogu lv_emp_name kirje printimiseks.
  • Koodirida 12: FORALLi abil saate kogu töötaja töötasu uuendada 5000 võrra.
  • Koodirida 14: Tehingu sooritamine.