Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So verwenden Sie die Bulk-Collect-Klausel mit der SELECT INTO-Anweisung in der Oracle-Datenbank

Bulk-Collect-Klausel mit SELECT INTO-Anweisung

Willkommen zum zweiten Tutorial in der Reihe PL/SQL Bulk Collect, in dem wir lernen, wie man die BULK COLLECT-Klausel mit der SELECT-INTO-Anweisung verwendet.

Kontextwechsel sind gut, aber nur, wenn sie zahlenmäßig gering sind. Eine erhöhte Anzahl von Kontextwechseln kann zu Problemen wie einer schlechten Abfrageleistung führen. Dieser durch Kontextwechsel verursachte Overhead könnte leicht kontrolliert werden, wenn wir sie komprimieren können. Genau das lernen Sie in dieser Anleitung.

Sie können mehr über SELECT-INTO erfahren hier .

Wann sollten wir Bulk Collect mit Select-Into-Anweisung verwenden?

Wenn Sie sicher sind, dass das zurückgegebene Ergebnis Ihrer SELECT-Anweisung klein ist dann sollten Sie die Bulk Collect-Klausel mit der Select-Into-Anweisung verwenden. Andernfalls wird Ihre Bulk-Collect-Klausel Ihre Select-Into-Anweisung zu einem speicherfressenden Monster machen. Folglich wird die Leistung Ihrer Datenbank verlangsamt.

Was soll ich tun, wenn meine SELECT-Anweisung eine große Anzahl von Zeilen abruft?

Sie können immer die LIMIT-Klausel zusammen mit der Massenerfassung verwenden, um die Anzahl der aus der Datenbank abgerufenen Zeilen zu begrenzen. Dies ist jedoch nur möglich, wenn wir die Bulk Collect-Klausel mit PL/SQL-Cursorn verwenden. Nichtsdestotrotz werden wir im nächsten Tutorial ausführlich darauf eingehen.

Warum können wir die mit Bulk Collect in der SELECT-INTO-Anweisung abgerufenen Daten nicht begrenzen?

Wenn wir die Bulk Collect-Klausel mit der SELECT-INTO-Anweisung verwenden, verwendet sie implizit Cursor um die Aufgabe der Massendatenverarbeitung auszuführen. Die Limit-Klausel kann jedoch nur mit der Bulk-Collect-Klausel verwendet werden, wenn letztere den Explicit Cursor verwendet zur Datenverarbeitung.

Wann verwendet die Massenerfassungsklausel einen impliziten Cursor und wann einen expliziten Cursor?

Wenn wir die Bulk-Collect-Klausel mit einer SQL-Anweisung wie SELECT-INTO verwenden, verwendet sie einen impliziten Cursor. Auf der anderen Seite wird immer dann, wenn wir die Bulk Collect-Klausel mit der FETCH-Anweisung verwenden, ein expliziter Cursor verwendet.

Ich empfehle Ihnen zu lesen wie man einen expliziten Cursor erstellt um mehr über die FETCH-Anweisung zu erfahren.

Können wir das von der Bulk-Collect-Klausel zurückgegebene Ergebnis in einer Variablen eines primitiven Datentyps speichern?

Nein, ab sofort sind PL/SQL-Sammlungen die einzigen unterstützenden Datentypen für die Massendatenverarbeitung mit der Massenerfassungsklausel in der Oracle-Datenbank. Falls Sie versuchen, die mit der Bulk Collect-Klausel abgerufenen Daten in einer Variablen des Datentyps wie Char, Number oder Varchar2 zu speichern, erhalten Sie eine Fehlermeldung, die etwa so lautet:

„PLS-00497:Mischen zwischen einer Zeile und mehreren Zeilen (BULK) in der INTO-Liste nicht möglich“

Definition der Bulk-Collect-Into-Anweisung
Die „Bulk Collect Into“-Anweisung wählt mehrere Daten aus einer Spalte aus und speichert sie in einer SQL-Sammlung.

Syntax der Bulk-Collect-Klausel mit Select-Into-Anweisung.

Die Syntax für die Verwendung der PL/SQL-Massenerfassungsklausel mit der Select-Into-Anweisung in der Oracle-Datenbank lautet wie folgt:

SELECT column_list
 BULK COLLECT INTO collection_datatype_name 
FROM table_name 
WHERE <where clause> 
ORDER BY <column list>;

Wo:

Spaltenliste ist die Liste der Spalten, aus denen Sie die Daten abrufen möchten.

Datentypname der Sammlung wird der Name der Sammlungsvariablen sein, die die von der Massenerfassungsklausel zurückgegebenen Daten enthält.

Denken Sie außerdem immer daran, dass jede Spalte, die Sie zum Abrufen der Daten angegeben haben, einen entsprechenden Sammlungsdatentyp zum Speichern dieser Daten enthalten muss. Weil die PL/SQL-Laufzeit-Engine die aus der Spalte abgerufenen Daten immer parallel in der Sammlung speichert.

Zum Beispiel

SELECT column_1, column_2 BULK COLLECT INTO collection_1, collection2 FROM table;

Hier werden die aus Spalte_1 abgerufenen Daten automatisch in Sammlung_1 und Daten aus Spalte_2 automatisch in Sammlung_2 gespeichert.

Tabellenname könnte der Name einer beliebigen Tabelle sein, aus der Sie die Daten abrufen möchten.

Danach haben wir die Klauseln WHERE und ORDER BY, die optional sind, aber wenn Sie möchten, können Sie sie verwenden.

Nachdem wir nun die Syntax besprochen haben, machen wir ein einfaches Beispiel, um zu lernen, wie man mit der PL/SQL-Bulk-Collect-Klausel mit der SELECT INTO-Anweisung in Oracle Database arbeitet.

SET SERVEROUTPUT ON;
DECLARE
    TYPE nt_fName   IS TABLE OF VARCHAR2 (20);
    TYPE nt_lName   IS TABLE OF VARCHAR2 (20);
    
    fname   nt_fName;
    lName   nt_lName;
BEGIN
    SELECT first_name, last_name 
        BULK COLLECT INTO fName, lName 
    FROM employees; 
        
        --Print values from the collection--
    FOR idx IN 1..fName.COUNT
    LOOP
        DBMS_OUTPUT.PUT_LINE (idx||' - '||fName (idx) ||' '||lName (idx));
    END LOOP;
END;
/

Erklärung des Beispiels

Hier haben wir einen sehr einfachen Code, um zu demonstrieren, wie die Bulk Collect-Klausel mit der Select-Into-Anweisung verwendet wird. Im Deklarationsabschnitt dieses Codes haben wir zuerst zwei Sammlungen vom Typ „Nested Table“ „nt_fName“ und „nt_lName“ mit ihren entsprechenden Sammlungsvariablen „fName“ und „lName“ erstellt. Tatsächlich werden diese beiden Sammlungen verwendet, um die Daten zu speichern, die von der Select-Into-Anweisung zurückgegeben werden.

Hier können Sie nachlesen, wie Sie eine verschachtelte Tabelle erstellen.

Im Deklarationsabschnitt haben wir unsere Select-Into-Anweisung mit Bulk-Collect-Klausel. Darüber hinaus rufen wir mit dieser Select-Into-Anweisung alle Daten aus den Spalten „Vorname“ und „Nachname“ der Tabelle „Employees“ ab. Und mit Hilfe der Bulk-Collect-Klausel speichern wir diese Daten parallel in entsprechenden Sammlungen.

Außer zusammen mit der Select-Into-Anweisung haben wir auch eine „For-Schleife“ die die Daten beider Sammlungen auf dem Ausgabebildschirm ausgibt.

Muss gesehen werden
Sehen Sie sich auf jeden Fall das Video an, in dem ich gezeigt habe, wie die Bulk-Collect-Klausel mehrere Kontextwechsel zu einem komprimiert und die Leistung der Abfrage verbessert. Hier ist der Link.

Das ist das Tutorial, das die Konzepte der Bulk Collect-Klausel mit der Select-Into-Anweisung im Detail erklärt. In diesem Tutorial habe ich versucht, alle möglichen Fragen zu beantworten, denen Sie sowohl in Ihrer Zertifizierungsprüfung als auch im Vorstellungsgespräch begegnen könnten.

Ich hoffe, Sie hatten Spaß beim Lesen. Bitte stellen Sie sicher, dass Sie diesen Blog mit Ihren Freunden in Ihren sozialen Netzwerken TEILEN. Vielen Dank und einen schönen Tag!