Oracle PL / SQL BULK COLLECT: FORALL-voorbeeld

Inhoudsopgave:

Anonim

Wat is BULK COLLECT?

BULK COLLECT vermindert contextwisselingen tussen SQL en PL / SQL-engine en stelt de SQL-engine in staat om de records in één keer op te halen.

Oracle PL / SQL biedt de functionaliteit om de records in bulk op te halen in plaats van één voor één op te halen. Deze BULK COLLECT kan worden gebruikt in de 'SELECT'-instructie om de records in bulk te vullen of bij het ophalen van de cursor in bulk. Aangezien de BULK COLLECT het record ophaalt in BULK, moet de INTO-clausule altijd een variabele van het collectietype bevatten. Het belangrijkste voordeel van het gebruik van BULK COLLECT is dat het de prestaties verhoogt door de interactie tussen database en PL / SQL-engine te verminderen.

Syntaxis:

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

In de bovenstaande syntaxis wordt BULK COLLECT gebruikt om de gegevens van de 'SELECT'- en' FETCH'-instructie te verzamelen.

In deze tutorial leer je-

  • FORALL Clausule
  • LIMIT Clausule
  • BULK VERZAMEL Attributen

FORALL Clausule

De FORALL maakt het mogelijk om de DML-bewerkingen op gegevens in bulk uit te voeren. Het is vergelijkbaar met dat van de FOR loop-instructie, behalve in FOR-lus dingen gebeuren op recordniveau, terwijl er in FORALL geen LOOP-concept is. In plaats daarvan worden alle gegevens die in het opgegeven bereik aanwezig zijn, tegelijkertijd verwerkt.

Syntaxis:

FORALL in;

In de bovenstaande syntaxis wordt de gegeven DML-bewerking uitgevoerd voor alle gegevens die aanwezig zijn tussen het lagere en hogere bereik.

LIMIT Clausule

Het bulkverzamelingsconcept laadt de volledige gegevens in de doelverzamelingsvariabele als een bulk, dwz dat de volledige gegevens in één keer in de verzamelingsvariabele worden ingevuld. Maar dit is niet aan te raden als het totale record dat moet worden geladen erg groot is, omdat wanneer PL / SQL probeert de volledige gegevens te laden, het meer sessiegeheugen in beslag neemt. Daarom is het altijd goed om de omvang van deze bulkophaaloperatie te beperken.

Deze groottelimiet kan echter gemakkelijk worden bereikt door de ROWNUM-voorwaarde in de 'SELECT'-instructie in te voeren, terwijl dit in het geval van cursor niet mogelijk is.

Om dit op te lossen heeft Oracle een 'LIMIT'-clausule voorzien die het aantal records definieert dat in de bulk moet worden opgenomen.

Syntaxis:

FETCH  BULK COLLECT INTO  LIMIT ;

In de bovenstaande syntaxis gebruikt de instructie cursor fetch de instructie BULK COLLECT samen met de clausule LIMIT.

BULK VERZAMEL Attributen

Vergelijkbaar met cursorattributen heeft BULK COLLECT% BULK_ROWCOUNT (n) dat het aantal rijen retourneert dat is beïnvloed in de n de DML-instructie van de FORALL-instructie, dwz het geeft het aantal records dat is beïnvloed in de FORALL-instructie voor elke afzonderlijke waarde uit de verzameling variabele. De term 'n' geeft de reeks waarden in de verzameling aan, waarvoor het aantal rijen nodig is.

Voorbeeld 1 : In dit voorbeeld zullen we alle werknemersnamen uit de emp-tabel projecteren met behulp van BULK COLLECT en we gaan ook het salaris van alle werknemers verhogen met 5000 met 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;/

Uitvoer

Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYSalary Updated

Code Verklaring:

  • Coderegel 2 : Declaratie van de cursor guru99_det voor statement 'SELECT emp_name FROM emp'.
  • Coderegel 3 : lv_emp_name_tbl declareren als tabeltype van VARCHAR2 (50)
  • Coderegel 4 : lv_emp_name declareren als lv_emp_name_tbl type.
  • Coderegel 6: de cursor openen.
  • Coderegel 7: de cursor ophalen met behulp van BULK COLLECT met de LIMIT-grootte als 5000 intl lv_emp_name variabele.
  • Coderegel 8-11: FOR-lus instellen om alle records in de verzameling lv_emp_name af te drukken.
  • Coderegel 12: FORALL gebruiken om het salaris van alle werknemers bij te werken met 5000.
  • Coderegel 14: de transactie uitvoeren.