Oracle PL / SQL BULK COLLECT: FORALL Exempel

Innehållsförteckning:

Anonim

Vad är BULK COLLECT?

BULK COLLECT minskar sammanhangsväxlar mellan SQL och PL / SQL-motorn och gör att SQL-motorn kan hämta posterna på en gång.

Oracle PL / SQL tillhandahåller funktionaliteten för att hämta poster i bulk snarare än att hämta en efter en. Denna BULK COLLECT kan användas i 'VÄLJ' uttalande för att fylla i poster i bulk eller för att hämta markören i bulk. Eftersom BULK COLLECT hämtar posten i BULK bör INTO-satsen alltid innehålla en samlingstypvariabel. Den största fördelen med att använda BULK COLLECT är att den ökar prestandan genom att minska interaktionen mellan databasen och PL / SQL-motorn.

Syntax:

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

I ovanstående syntax används BULK COLLECT för att samla in data från 'SELECT' och 'FETCH' uttalanden.

I denna handledning lär du dig-

  • FORALL klausul
  • GRÄNSKlausul
  • BULK COLLECT-attribut

FORALL klausul

FORALL gör det möjligt att utföra DML-operationer på bulkdata. Det liknar det för FOR-loop-uttalande förutom i FOR-loop händer saker på rekordnivå medan det i FORALL inte finns något LOOP-koncept. Istället behandlas hela data som finns i det givna intervallet samtidigt.

Syntax:

FORALL in;

I ovanstående syntax kommer den givna DML-operationen att utföras för hela data som finns mellan lägre och högre intervall.

GRÄNSKlausul

Masskollektionskonceptet laddar hela data i målsamlingsvariabeln som en bulk, dvs. hela data kommer att fyllas i samlingsvariabeln på en gång. Men detta är inte tillrådligt när den totala posten som behöver laddas är mycket stor, för när PL / SQL försöker ladda hela data så förbrukar det mer sessionsminne. Därför är det alltid bra att begränsa storleken på denna bulkuppsamlingsoperation.

Denna storleksgräns kan emellertid lätt uppnås genom att införa ROWNUM-villkoret i "SELECT" -uttrycket, medan det inte är möjligt med markören.

För att övervinna detta har Oracle tillhandahållit 'LIMIT' -klausul som definierar antalet poster som måste ingå i bulk.

Syntax:

FETCH  BULK COLLECT INTO  LIMIT ;

I ovanstående syntax använder markörhämtningsuttalandet BULK COLLECT-sats tillsammans med LIMIT-satsen.

BULK COLLECT-attribut

Liknar markörattribut BULK COLLECT har% BULK_ROWCOUNT (n) som returnerar antalet rader som påverkas i den n: e DML-satsen i FORALL-satsen, dvs det kommer att ge antalet poster som påverkas i FORALL-satsen för varje enskilt värde från samlingen variabel. Termen 'n' indikerar sekvensen för värde i samlingen, för vilken radantalet behövs.

Exempel 1 : I det här exemplet projicerar vi alla anställdas namn från EMP-tabellen med hjälp av BULK COLLECT och vi kommer också att öka lönen för alla anställda med 5000 med 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

Kodförklaring:

  • Kodrad 2 : Förklarar markören guru99_det för uttalandet 'VÄLJ emp_name FROM emp'.
  • Kodrad 3 : Deklarerar lv_emp_name_tbl som tabelltyp VARCHAR2 (50)
  • Kodrad 4 : Deklarerar lv_emp_name som lv_emp_name_tbl-typ.
  • Kodrad 6: Öppna markören.
  • Kodrad 7: Hämta markören med hjälp av BULK COLLECT med LIMIT-storleken som 5000 intl lv_emp_name variabel.
  • Kodrad 8-11: Ställa in FOR-slinga för att skriva ut alla poster i samlingen lv_emp_name.
  • Kodrad 12: Använda FORALL för att uppdatera lönen för alla anställda med 5000.
  • Kodrad 14: Genomför transaktionen.