Database
 sql >> Datenbank >  >> RDS >> Database

So verwenden Sie die PL/SQL-Bulk-Collect-Klausel mit der FETCH INTO-Anweisung

Bulk-Collect-Klausel mit FETCH INTO-Anweisung

Im vorherigen Tutorial haben wir es geschafft, mehrere Kontextwechsel in einen einzigen zu komprimieren, indem wir PL/SQL Bulk Collect mit der SELECT-INTO-Anweisung verwendet haben. Die SELECT-INTO-Anweisung ist eine SQL-Standardabfrage, was bedeutet, dass der Entwickler nicht viel Kontrolle über die Ausführung der Anweisung hat.

Wenn wir über die Abfrageleistung sprechen, können wir mit der SELECT-INTO-Anweisung nicht über einen Extent hinausgehen. Mal sehen, wie wir all diese Mängel der SELECT-INTO-Anweisung überwinden können.

In diesem Blog erfahren Sie, wie Sie die Bulk Collect-Klausel mit der FETCH-INTO-Anweisung eines expliziten Cursors verwenden. Da FETCH-Anweisungen Teil des Cursor-Lebenszyklus sind, sind zum besseren Verständnis dieses Tutorials praktische Kenntnisse des expliziten Cursors erforderlich. Für dasselbe können Sie das Tutorial zum Erstellen eines expliziten Cursors in der Oracle-Datenbank lesen.

Warum sollten wir die Bulk Collect-Klausel mit der FETCH INTO-Anweisung verwenden?

Wie im vorherigen Blog erwähnt, verwendet die Laufzeit-Engine immer dann, wenn wir Bulk-Collect mit der SELECT-INTO-Anweisung verwenden, einen impliziten Cursor, um die Aufgabe zu verarbeiten. Aber wenn wir Bulk Collect mit der FETCH-INTO-Anweisung verwenden, verwendet die Laufzeit-Engine den expliziten Cursor, um die Aufgabe zu verarbeiten.

Ein expliziter Cursor hilft uns immer dabei, die Kontrolle über unsere Standard-SQL-Abfragen zu erlangen. Beispielsweise können wir mit einem expliziten Cursor steuern, wann die Datensätze abgerufen werden sollen oder wie viele Datensätze wir auf einmal abrufen möchten, dies ist jedoch im Fall der SELECT-INTO-Anweisung nicht möglich.

Wie lautet die Syntax von Bulk Collect mit Fetch-Into-Anweisung?

Ähnlich wie bei der SELECT-INTO-Anweisung fungiert die Bulk-Collect-Klausel als Attribut für die FETCH-INTO-Anweisung. Hier ist die Syntax

FETCH <cursor_name> BULK COLLECT INTO <plsql_collection>;

FETCH-Anweisungen sind Teil des expliziten Cursors. Wenn Sie versuchen, sie auszuführen, ohne ihren übergeordneten Cursor zu deklarieren, erhalten Sie eine Fehlermeldung. Denken Sie auch immer daran, dass PL/SQL-Sammlungen die einzige unterstützte Struktur für die Massenerfassung sind.

Beispiel:Verwendung von PL/SQL Bulk Collect mit FETCH-INTO-Anweisung in Oracle Database.

SET SERVEROUTPUT ON;
DECLARE
--Create an explicit cursor
    CURSOR exp_cur IS
    SELECT first_name FROM employees;

    --Declare collection for holding the data 
    TYPE nt_fName   IS TABLE OF VARCHAR2 (20);
    fname   nt_fName;
BEGIN
    OPEN exp_cur;
    LOOP
        FETCH exp_cur BULK COLLECT INTO fname;
        EXIT WHEN fname.count=0;
        --Print data
        FOR idx IN fname.FIRST.. fname.LAST
        LOOP
            DBMS_OUTPUT.PUT_LINE (idx||' '||fname(idx) );
        END LOOP; 
    END LOOP;
    CLOSE exp_cur;
END;
/

Ich habe jede einzelne Zeile dieses gesamten Codes im Video-Tutorial auf meinem YouTube-Kanal ausführlich erklärt. Sie können sich dieses Tutorial ansehen.

Da wir in diesem Code die Bulk Collect-Klausel mit der fetch into-Anweisung verwendet haben, bedeutet dies, dass der Kontextwechsel kein Problem darstellt. Wie wir wissen, komprimiert die Bulk-Collect-Klausel mehrere Switches zu einem einzigen, sodass kein weiterer Leistungsengpass entsteht.

Aber bedeutet das, dass dieser Code gut optimiert ist und keiner weiteren Optimierung bedarf? Oder wird die Abfrageleistung in Zukunft für uns nie ein Thema sein?

Bleiben Sie dran, um Antworten auf all diese Fragen zu erhalten und zu erfahren, wie wir dieses PL/SQL-Programm weiter optimieren können.

Ich hoffe, Ihnen hat dieser Blog gefallen. Wenn Sie irgendwelche Zweifel oder Fragen haben oder denken, dass ich vergessen habe, etwas in diesem Blog zu erwähnen, dann schreiben Sie mir auf meiner Facebook-Seite oder Twitter. Vielen Dank und einen schönen Tag!