Oracle PL / SQL BULK COLLECT: FORALL Eksempel

Indholdsfortegnelse:

Anonim

Hvad er BULK COLLECT?

BULK COLLECT reducerer kontekstskifter mellem SQL og PL / SQL-motor og giver SQL-motor mulighed for at hente poster på én gang.

Oracle PL / SQL giver funktionaliteten til at hente poster i bulk frem for at hente en efter en. Denne BULK COLLECT kan bruges i 'SELECT' -erklæringen til at udfylde poster i bulk eller til at hente markøren i bulk. Da BULK COLLECT henter posten i BULK, skal INTO-klausulen altid indeholde en samlingstypevariabel. Den største fordel ved at bruge BULK COLLECT er, at det øger ydeevnen ved at reducere interaktionen mellem database og PL / SQL-motor.

Syntaks:

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

I ovenstående syntaks bruges BULK COLLECT til at indsamle data fra 'SELECT' og 'FETCH' udsagn.

I denne vejledning lærer du-

  • FORALL klausul
  • LIMIT-klausul
  • BULK COLLECT attributter

FORALL klausul

FORALL giver mulighed for at udføre DML-operationer på massedata. Det svarer til FOR-loop-sætningen undtagen i FOR-loop sker der ting på rekordniveau, mens der i FORALL ikke er noget LOOP-koncept. I stedet behandles alle data, der er til stede i det givne interval på samme tid.

Syntaks:

FORALL in;

I ovenstående syntaks udføres den givne DML-operation for hele data, der findes mellem lavere og højere område.

LIMIT-klausul

Bulk indsamlingskonceptet indlæser hele data i målopsamlingsvariablen som en bulk, dvs. hele dataene udfyldes i samlingsvariablen på en gang. Men dette tilrådes ikke, når den samlede post, der skal indlæses, er meget stor, for når PL / SQL forsøger at indlæse hele dataene, bruger den mere sessionhukommelse. Derfor er det altid godt at begrænse størrelsen på denne bulkopsamlingsoperation.

Denne størrelsesgrænse kan dog let opnås ved at indføre ROWNUM-tilstanden i 'SELECT' -erklæringen, hvorimod det ikke er muligt i tilfælde af markør.

For at overvinde dette har Oracle leveret 'LIMIT' klausul, der definerer antallet af poster, der skal inkluderes i bulk.

Syntaks:

FETCH  BULK COLLECT INTO  LIMIT ;

I ovenstående syntaks bruger markørhentningssætningen BULK COLLECT-sætning sammen med LIMIT-klausulen.

BULK COLLECT attributter

Svarende til markøren attributter BULK COLLECT har% BULK_ROWCOUNT (n), som returnerer antallet af rækker ramt i n th DML opgørelse af FORALL erklæring, dvs. det vil give optællingen af poster påvirkes i FORALL opgørelse for hver enkelt værdi fra samlingen variabel. Udtrykket 'n' angiver rækkefølgen af ​​værdi i samlingen, hvor rækkeoptællingen er nødvendig.

Eksempel 1 : I dette eksempel projicerer vi hele medarbejdernavnet fra emp-tabellen ved hjælp af BULK COLLECT, og vi øger også lønnen til alle medarbejderne med 5000 ved hjælp af 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;/

Produktion

Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYSalary Updated

Kode Forklaring:

  • Kodelinje 2 : Erklæring om markøren guru99_det for udsagn 'VÆLG emp_name FRA emp'.
  • Kodelinje 3 : Erklæring om lv_emp_name_tbl som tabel type VARCHAR2 (50)
  • Kodelinje 4 : Erklærer lv_emp_name som lv_emp_name_tbl type.
  • Kodelinje 6: Åbning af markøren.
  • Kodelinje 7: Henter markøren ved hjælp af BULK COLLECT med LIMIT-størrelsen som 5000 intl lv_emp_name-variabel.
  • Kodelinje 8-11: Opsætning af FOR-loop til at udskrive alle poster i samlingen lv_emp_name.
  • Kodelinje 12: Brug FORALL til at opdatere lønnen til hele medarbejderen med 5000.
  • Kodelinje 14: Forpligtelse til transaktionen.