Oracle PL / SQL BULK COLLECT: FORALL Eksempel

Innholdsfortegnelse:

Anonim

Hva er BULK COLLECT?

BULK COLLECT reduserer kontekstbytter mellom SQL og PL / SQL-motor og lar SQL-motoren hente postene på en gang.

Oracle PL / SQL tilbyr funksjonaliteten til å hente postene i bulk i stedet for å hente en etter en. Denne BULK COLLECT kan brukes i 'SELECT' -uttalelse for å fylle ut postene i bulk eller for å hente markøren i bulk. Siden BULK COLLECT henter posten i BULK, bør INTO-leddet alltid inneholde en variabel for samlingstypen. Den største fordelen med å bruke BULK COLLECT er at den øker ytelsen ved å redusere samspillet mellom database og PL / SQL-motor.

Syntaks:

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

I ovennevnte syntaks brukes BULK COLLECT til å samle inn data fra 'SELECT' og 'FETCH' statement.

I denne veiledningen vil du lære-

  • FORALL Klausul
  • LIMIT Klausul
  • BULK COLLECT Attributter

FORALL Klausul

FORALL tillater å utføre DML-operasjoner på bulkdata. Det ligner på FOR-loop-setningen bortsett fra i FOR-loop skjer ting på rekordnivå mens det i FORALL ikke er noe LOOP-konsept. I stedet behandles hele dataene i det gitte området samtidig.

Syntaks:

FORALL in;

I den ovennevnte syntaksen vil den gitte DML-operasjonen bli utført for hele dataene som er tilstede mellom lavere og høyere område.

LIMIT Klausul

Massesamlingskonseptet laster hele dataene inn i målsamlingsvariabelen som en bulk, dvs. at hele dataene blir fylt ut i samlingsvariabelen på en gang. Men dette er ikke tilrådelig når den totale posten som må lastes er veldig stor, for når PL / SQL prøver å laste inn hele dataen, bruker den mer øktminne. Derfor er det alltid bra å begrense størrelsen på denne samleoperasjonen.

Imidlertid kan denne størrelsesgrensen lett oppnås ved å innføre ROWNUM-tilstanden i 'SELECT' -uttalelsen, mens det i tilfelle markør ikke er mulig.

For å overvinne dette har Oracle gitt 'LIMIT' klausul som definerer antall poster som må inkluderes i bulk.

Syntaks:

FETCH  BULK COLLECT INTO  LIMIT ;

I den ovennevnte syntaksen bruker markørhentingsuttalelsen BULK COLLECT-setning sammen med LIMIT-setningen.

BULK COLLECT Attributter

I likhet med markøren attributter BULK har COLLECT% BULK_ROWCOUNT (n) som returnerer antall rader som påvirkes i n th DML utsagn av FORALL uttalelse, dvs. det vil gi tellingen av poster som berøres i FORALL regnskapet for hver enkelt verdi fra samlingen variabel. Begrepet 'n' indikerer rekkefølgen av verdi i samlingen, som det er behov for radtelling.

Eksempel 1 : I dette eksemplet vil vi projisere alt ansattens navn fra emp-tabellen ved hjelp av BULK COLLECT, og vi skal også øke lønnen til alle de ansatte med 5000 ved hjelp av 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;/

Produksjon

Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYSalary Updated

Kode Forklaring:

  • Kodelinje 2 : Erklærer markøren guru99_det for utsagnet 'VELG emp_name FRA emp'.
  • Kodelinje 3 : Deklarerer lv_emp_name_tbl som tabelltype VARCHAR2 (50)
  • Kodelinje 4 : Erklærer lv_emp_name som lv_emp_name_tbl type.
  • Kodelinje 6: Åpne markøren.
  • Kodelinje 7: Henter markøren ved hjelp av BULK COLLECT med LIMIT-størrelsen som 5000 intl lv_emp_name variabel.
  • Kodelinje 8-11: Sette opp FOR-løkke for å skrive ut alle postene i samlingen lv_emp_name.
  • Kodelinje 12: Ved hjelp av FORALL oppdaterer lønnen til alle ansatte med 5000.
  • Kodelinje 14: Forpliktelse til transaksjonen.