„Oracle PL / SQL BULK COLLECT: FORALL“ pavyzdys

Kas yra BULK COLLECT?

„BULK COLLECT“ sumažina konteksto persijungimą tarp SQL ir PL / SQL variklio ir leidžia SQL varikliui vienu metu gauti įrašus.

„Oracle PL / SQL“ suteikia funkciją, kad įrašai būtų siunčiami masiškai, o ne po vieną. Šį „BULK COLLECT“ galima naudoti sakinyje „SELECT“, kad būtų galima užpildyti įrašus urmu arba gauti žymeklį iš masės. Kadangi BULK COLLECT gauna įrašą BULK, sąlygoje INTO visada turi būti rinkinio tipo kintamasis. Pagrindinis „BULK COLLECT“ naudojimo pranašumas yra tai, kad jis padidina našumą, sumažindamas sąveiką tarp duomenų bazės ir PL / SQL variklio.

Sintaksė:

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

Pirmiau pateiktoje sintaksėje BULK COLLECT naudojamas renkant duomenis iš „SELECT“ ir „FETCH“ sakinių.

Šioje pamokoje sužinosite

  • FORAL sąlyga
  • LIMIT sąlyga
  • BULK COLLECT atributai

FORAL sąlyga

FORALL leidžia atlikti DML operacijas su visais duomenimis. Tai panašu į FOR ciklo teiginį, išskyrus tai, kad FOR cikle viskas vyksta įrašų lygiu, o FORALL nėra LOOP koncepcijos. Vietoj to visi duomenys, esantys nurodytame diapazone, yra apdorojami tuo pačiu metu.

Sintaksė:

FORALL in;

Aukščiau pateiktoje sintaksėje nurodyta DML operacija bus vykdoma visiems duomenims, esantiems tarp žemesnio ir aukštesnio diapazono.

LIMIT sąlyga

Masinio rinkimo koncepcija visus duomenis įkelia į tikslinį rinkinio kintamąjį kaip masinį, ty visi duomenys bus surinkti į rinkimo kintamąjį vienu metu. Bet tai nėra patartina, kai bendras įrašas, kurį reikia įkelti, yra labai didelis, nes kai PL / SQL bando įkelti visus duomenis, sunaudojama daugiau sesijos atminties. Taigi visada gerai apriboti šios masinio surinkimo operacijos dydį.

Tačiau šį dydžio apribojimą galima lengvai pasiekti įvedant sąlygą ROWNUM į sakinį „SELECT“, tuo tarpu žymeklio atveju tai neįmanoma.

Norėdami įveikti šią „Oracle“, buvo numatyta sąlyga „LIMIT“, apibrėžianti įrašų, kuriuos reikia įtraukti į masę, skaičių.

Sintaksė:

FETCH  BULK COLLECT INTO  LIMIT ;

Pirmiau pateiktoje sintaksėje žymeklio paėmimo sakinyje naudojamas sakinys BULK COLLECT kartu su sąlyga LIMIT.

BULK COLLECT atributai

Panašiai kaip žymeklio atributuose, BULK COLLECT turi% BULK_ROWCOUNT (n), kuris pateikia eilučių skaičių, paveiktą FOR -ojo sakinio n -ajame DML sakinyje, t. Y. Jis pateiks FORALL sakinyje paveiktų įrašų skaičių kiekvienai reikšmei iš kolekcijos kintamasis. Terminas „n“ nurodo vertės seką kolekcijoje, kuriai reikalingas eilučių skaičius.

1 pavyzdys : Šiame pavyzdyje mes suprojektuosime visus darbuotojo vardus iš „emp“ lentelės naudodami „BULK COLLECT“, taip pat ketiname padidinti visų darbuotojų atlyginimus 5000, naudodami „FORALL“.

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

Rezultatas

Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYSalary Updated

Kodo paaiškinimas:

  • 2 kodo eilutė : žymos guru99_det deklaravimas teiginiui „SELECT emp_name FROM emp“.
  • 3 kodo eilutė : „lv_emp_name_tbl“ paskelbimas VARCHAR2 lentelės tipu (50)
  • 4 kodo eilutė : „lv_emp_name“ paskelbimas „lv_emp_name_tbl“ tipu.
  • Kodo 6 eilutė: žymeklio atidarymas.
  • 7 kodo eilutė: žymeklio nuskaitymas naudojant BULK COLLECT, kurio dydis LIMIT yra 5000 intl lv_emp_name kintamasis.
  • Kodo eilutė 8–11: „ FOR“ kilpos nustatymas, norint atspausdinti visą kolekcijos „lv_emp_name“ įrašą.
  • Kodo 12 eilutė: naudojant FORALL atnaujinamas visų darbuotojų atlyginimas 5000.
  • Kodo 14 eilutė: Sandorio įvykdymas.

Įdomios straipsniai...