Oracle PL / SQL BULK COLLECT: PREDNJI primer

Kazalo:

Anonim

Kaj je BULK COLLECT?

BULK COLLECT zmanjša preklapljanje med konteksti med SQL in PL / SQL motorjem in omogoča, da mehanizem SQL naenkrat pridobi zapise.

Oracle PL / SQL zagotavlja funkcionalnost pridobivanja zapisov v velikem obsegu in ne enega za drugim. Ta BULK COLLECT se lahko uporablja v stavku 'SELECT' za polnjenje zapisov v razsutem stanju ali za pridobivanje kurzorja v velikem obsegu. Ker BULK COLLECT pridobi zapis v BULK, mora člen INTO vedno vsebovati spremenljivko vrste zbirke. Glavna prednost uporabe BULK COLLECT je, da poveča zmogljivost z zmanjšanjem interakcije med bazo podatkov in PL / SQL mehanizmom.

Sintaksa:

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

V zgornji sintaksi se BULK COLLECT uporablja za zbiranje podatkov iz stavkov 'SELECT' in 'FETCH'.

V tej vadnici boste izvedeli-

  • Klavzula FORALL
  • Klavzula Omejitev
  • Atributi BULK COLLECT

Klavzula FORALL

FORALL omogoča izvajanje DML operacij s podatki v velikem obsegu. Podobna je izjavi zanke FOR, razen v zanki FOR se stvari dogajajo na ravni zapisa, medtem ko v FORALL-u ni koncepta LOOP. Namesto tega se istočasno obdelajo vsi podatki, ki so prisotni v danem obsegu.

Sintaksa:

FORALL in;

V zgornji sintaksi bo dana operacija DML izvedena za celotne podatke, ki so prisotni med spodnjim in višjim obsegom.

Klavzula Omejitev

Koncept množičnega zbiranja naloži celotne podatke v ciljno spremenljivko zbiranja kot množično, tj. Celotni podatki se v enkratno uporabo vnesejo v spremenljivko zbiranja. Toda to ni priporočljivo, če je celoten zapis, ki ga je treba naložiti, zelo velik, ker ko poskuša PL / SQL naložiti celotne podatke, porabi več pomnilnika seje. Zato je vedno dobro omejiti velikost te operacije zbiranja v razsutem stanju.

Vendar je to omejitev velikosti mogoče enostavno doseči z uvedbo pogoja ROWNUM v stavku 'SELECT', medtem ko v primeru kazalca to ni mogoče.

Za premagovanje tega je Oracle zagotovil klavzulo 'LIMIT', ki določa število zapisov, ki jih je treba vključiti v večino.

Sintaksa:

FETCH  BULK COLLECT INTO  LIMIT ;

V zgornji sintaksi stavek za pridobivanje kazalca uporablja stavek BULK COLLECT skupaj s stavkom LIMIT.

Atributi BULK COLLECT

Podobno kot atributi kazalke tudi BULK COLLECT vsebuje% BULK_ROWCOUNT (n), ki vrne število vrstic, ki jih prizadene n- ti stavek DML stavka FORALL, tj. Za vsako posamezno vrednost iz zbirke bo navedel število zapisov, prizadetih v stavku FORALL spremenljivka. Izraz 'n' označuje zaporedje vrednosti v zbirki, za katero je potrebno štetje vrstic.

Primer 1 : V tem primeru bomo iz tabele emp projicirali vsa imena zaposlenih z uporabo BULK COLLECT, plačo vseh zaposlenih pa bomo povečali za 5000 z uporabo 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;/

Izhod

Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYSalary Updated

Razlaga kode:

  • Vrstica kode 2 : razglasitev kazalca guru99_det za stavek 'SELECT emp_name FROM emp'.
  • Vrstica kode 3 : razglasitev lv_emp_name_tbl kot vrste tabele VARCHAR2 (50)
  • Vrstica kode 4 : razglasitev imena lv_emp_name kot vrste lv_emp_name_tbl.
  • 6. vrstica kode: Odpiranje kurzorja.
  • Vrstica kode 7: Pridobivanje kurzorja z uporabo BULK COLLECT z velikostjo LIMIT kot 5000 spremenljivke intl lv_emp_name.
  • Vrstica kode 8-11: Nastavitev zanke FOR za tiskanje celotnega zapisa v zbirki lv_emp_name.
  • 12. vrstica kode: Z uporabo FORALL-a se plača vseh zaposlenih posodobi za 5000.
  • Vrstica kode 14: Izvajanje transakcije.