Oracle PL / SQL BULK COLLECT: FORALL Beispiel

Inhaltsverzeichnis:

Anonim

Was ist BULK COLLECT?

BULK COLLECT reduziert Kontextwechsel zwischen SQL- und PL / SQL-Engine und ermöglicht es der SQL-Engine, die Datensätze sofort abzurufen.

Oracle PL / SQL bietet die Funktionalität, die Datensätze in großen Mengen abzurufen, anstatt sie einzeln abzurufen. Diese BULK COLLECT kann in der Anweisung 'SELECT' verwendet werden, um die Datensätze in großen Mengen zu füllen oder um den Cursor in großen Mengen abzurufen. Da BULK COLLECT den Datensatz in BULK abruft, sollte die INTO-Klausel immer eine Auflistungstypvariable enthalten. Der Hauptvorteil der Verwendung von BULK COLLECT besteht darin, dass die Leistung erhöht wird, indem die Interaktion zwischen Datenbank und PL / SQL-Engine verringert wird.

Syntax:

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

In der obigen Syntax wird BULK COLLECT verwendet, um die Daten aus den Anweisungen 'SELECT' und 'FETCH' zu sammeln.

In diesem Tutorial lernen Sie:

  • FORALL-Klausel
  • LIMIT-Klausel
  • BULK COLLECT-Attribute

FORALL-Klausel

Mit FORALL können die DML-Operationen für Daten in großen Mengen ausgeführt werden. Es ähnelt der FOR-Schleifenanweisung, außer dass in der FOR-Schleife Dinge auf Datensatzebene geschehen, während es in FORALL kein LOOP-Konzept gibt. Stattdessen werden alle im angegebenen Bereich vorhandenen Daten gleichzeitig verarbeitet.

Syntax:

FORALL in;

In der obigen Syntax wird die angegebene DML-Operation für die gesamten Daten ausgeführt, die zwischen dem unteren und dem oberen Bereich vorhanden sind.

LIMIT-Klausel

Das Bulk-Erfassungskonzept lädt die gesamten Daten als Bulk in die Zielerfassungsvariable, dh die gesamten Daten werden in einem Durchgang in die Erfassungsvariable eingefügt. Dies ist jedoch nicht ratsam, wenn der Gesamtdatensatz, der geladen werden muss, sehr groß ist, da PL / SQL beim Laden der gesamten Daten mehr Sitzungsspeicher benötigt. Daher ist es immer gut, die Größe dieses Massensammelvorgangs zu begrenzen.

Diese Größenbeschränkung kann jedoch leicht erreicht werden, indem die ROWNUM-Bedingung in die 'SELECT'-Anweisung eingefügt wird, während dies im Fall eines Cursors nicht möglich ist.

Um dies zu überwinden, hat Oracle eine 'LIMIT'-Klausel bereitgestellt, die die Anzahl der Datensätze definiert, die in den Bulk aufgenommen werden müssen.

Syntax:

FETCH  BULK COLLECT INTO  LIMIT ;

In der obigen Syntax verwendet die Cursor-Fetch-Anweisung die BULK COLLECT-Anweisung zusammen mit der LIMIT-Klausel.

BULK COLLECT-Attribute

Ähnlich wie bei den Cursorattributen verfügt BULK COLLECT über% BULK_ROWCOUNT (n), das die Anzahl der betroffenen Zeilen in der n- ten DML-Anweisung der FORALL-Anweisung zurückgibt, dh die Anzahl der in der FORALL-Anweisung betroffenen Datensätze für jeden einzelnen Wert aus der Auflistung angibt Variable. Der Ausdruck 'n' gibt die Wertesequenz in der Sammlung an, für die die Zeilenanzahl benötigt wird.

Beispiel 1 : In diesem Beispiel projizieren wir den gesamten Mitarbeiternamen aus der Tabelle emp mit BULK COLLECT und erhöhen mit FORALL das Gehalt aller Mitarbeiter um 5000.

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;/

Ausgabe

Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYSalary Updated

Code Erläuterung:

  • Codezeile 2 : Deklarieren des Cursors guru99_det für die Anweisung 'SELECT emp_name FROM emp'.
  • Codezeile 3 : Deklarieren von lv_emp_name_tbl als Tabellentyp von VARCHAR2 (50)
  • Codezeile 4 : Deklarieren von lv_emp_name als lv_emp_name_tbl-Typ.
  • Codezeile 6: Öffnen des Cursors.
  • Codezeile 7: Abrufen des Cursors mit BULK COLLECT mit der LIMIT-Größe als 5000 intl lv_emp_name Variable.
  • Codezeile 8-11: Einrichten der FOR-Schleife zum Drucken des gesamten Datensatzes in der Auflistung lv_emp_name.
  • Codezeile 12: Verwenden von FORALL, um das Gehalt aller Mitarbeiter um 5000 zu aktualisieren.
  • Codezeile 14: Festschreiben der Transaktion.