Wir haben bereits im vorherigen Tutorial gesehen, wie man eine Cursor-basierte Datensatztypvariable basierend auf einem einfachen Cursor erstellt, der eine einzelne Datenzeile zurückgibt. Hier stellt sich nun die Frage, ob wir dieselbe einzelne Datensatz-Datentypvariable mit dem Cursor verwenden können, der mehrere Datenzeilen zurückgibt. Um die Antwort zu erfahren, lesen Sie mit und erfahren Sie, wie Sie mit mehreren von einem Cursor zurückgegebenen Werten umgehen, indem Sie eine einzelne Cursor-basierte Datensatzdatentypvariable verwenden.
Da wir es mit Cursor-basierten Datensätzen zu tun haben, ist ein wenig Cursor-Kenntnis erforderlich. Der Einfachheit halber und um dieses Konzept leicht verständlich zu machen, werde ich für die Demonstration einen Simple Explicit-Cursor verwenden.
Schritt 1:Deklarieren Sie einen einfachen expliziten Cursor
Ein Cursor-basierter Datensatzdatentyp erfordert einen bereits erstellten Cursor. Dieser Cursor wird zu einer zugrunde liegenden Basis für unsere Datensatztypvariable. Alle Felder der Datensatztyp-Variablen, die mit diesem Cursor erstellt werden, haben den gleichen Namen und Datentyp wie die Spalten, die in der SELECT-Liste des Cursors verwendet werden.
SET SERVEROUTPUT ON; DECLARE CURSOR cur_RebellionRider IS SELECT first_name, salary FROM employees WHERE employee_id > 200;
Im Gegensatz zum Cursor aus dem vorherigen Tutorial, der eine einzelne Datenzeile zurückgibt, gibt dieser Cursor mehrere Zeilen zurück. Alle diese Zeilen enthalten den Vornamen und das Gehalt aller Mitarbeiter mit einer Mitarbeiter-ID größer als 200.
Schritt 2:Deklarieren Sie die Cursor-basierte Datensatzdatentyp-Variable
Da wir den Cursor erstellt haben, sind wir jetzt bereit, unsere Datensatzvariable mit diesem Cursor zu deklarieren.
var_emp cur_RebellionRider%ROWTYPE;
Var_emp ist die Datensatztyp-Variable und da sie auf dem Cursor cur_RebellionRider basiert, können wir sie stolz eine Cursor-basierte Datensatztyp-Variable nennen. Nun müssen wir sehen, ob diese einzelne Datensatzvariable in der Lage ist, alle Daten aufzunehmen, die vom zugrunde liegenden Cursor cur_RebellionRider.
zurückgegeben werdenSchritt 3:Initialisieren Sie die Cursor-Record-Variable
Wie wir im PL/SQL-Tutorial 34 besprochen haben, ist die Initialisierung einer Datensatzvariablen der Prozess, ihr einige Werte zuzuweisen. Im Fall von Cursorn erledigt die Anweisung FETCH-INTO diese Arbeit. Aber wir müssen sicherstellen, dass wir den Cursor-Lebenszyklus richtig befolgt haben.
Wenn Sie nicht wissen, was dieser Cursor-Lebenszyklus ist und welche Schritte zum Erstellen eines Cursors erforderlich sind, lesen Sie diesen Blog unter „Einführung in den Datenbank-Cursor“.
BEGIN OPEN cur_RebellionRider; LOOP FETCH cur_RebellionRider INTO var_emp; EXIT WHEN cur_RebellionRider%NOTFOUND; DBMS_OUTPUT.PUT_LINE (var_emp.first_name||' '||var_emp.salary ); END LOOP;--Simple Loop End CLOSE cur_RebellionRider; END;
Der obige Ausführungsabschnitt des PL/SQL-Blocks, den wir hier erstellen, wurde im Video-Tutorial auf meinem YouTube-Kanal Zeile für Zeile erklärt. Überprüfen Sie das.
Das ist es also. Das ist alles, was wir tun müssen. Lassen Sie uns nun all diese Code-Blöcke, die wir oben in verschiedenen Schritten gesehen haben, zu einem einzigen anonymen PL/SQL-Block kombinieren.
Cursor-basierte Datensatzdatentyp-Variable in der Oracle-Datenbank
SET SERVEROUTPUT ON; DECLARE CURSOR cur_RebellionRider IS SELECT first_name, salary FROM employees WHERE employee_id > 200; var_emp cur_RebellionRider%ROWTYPE; BEGIN OPEN cur_RebellionRider; LOOP FETCH cur_RebellionRider INTO var_emp; EXIT WHEN cur_RebellionRider%NOTFOUND; DBMS_OUTPUT.PUT_LINE (var_emp.first_name||' '||var_emp.salary); END LOOP; CLOSE cur_RebellionRider; END;
Wenn Sie den obigen Code kompilieren und ausführen, erhalten Sie alle Daten, die die Anweisung FETCH-INTO vom Cursor cur_RebellionRider abgerufen und in der Cursor-basierten Datensatzvariablen var_emp gespeichert hat. Dies impliziert, dass wir tatsächlich mehrere Datenzeilen mit einem einzigen Cursor-basierten Datensatz verarbeiten können.
In meinem PL/SQL-Video-Tutorial habe ich gefragt, ob wir diesen Code vereinfachen können oder ob es eine andere Möglichkeit gibt, dieselbe Aufgabe zu erledigen. Die Antwort ist ja, es gibt mehrere Möglichkeiten, dasselbe Ergebnis zu erzielen, und eine davon ist die Verwendung von „Cursor For-Loop“. Dies ist eine besondere Art von Schleife, die im Hintergrund für Sie implizit im Hintergrund die Datensatzvariable deklariert sowie den zugrunde liegenden Cursor öffnet, holt und schließt. Weitere Informationen zur Cursor-For-Schleife finden Sie hier.
Referenzbuch für SQL Expert 1z0-047 Affiliate-Link
OCA Oracle Database SQL Certified Expert Exam Guide (Prüfung 1Z0-047)
Hier ist der Code, der mit Cursor For-Loop erstellt wurde, was dem obigen Code entspricht. Wie Sie sehen können, ist es viel weniger komplex mit wenigen Line-of-Codes (LOCs).
SET SERVEROUTPUT ON; BEGIN FOR var_emp IN (SELECT first_name, salary FROM employees WHERE employee_id >200) LOOP DBMS_OUTPUT.PUT_LINE(var_emp.first_name||' '||var_emp.salary); END LOOP; END;
Beide Codes geben dasselbe Ergebnis zurück, da beide dieselbe Aufgabe ausführen.
Ich hoffe, Ihnen hat dieses ausführliche PL/SQL-Tutorial gefallen. Bitte stellen Sie sicher, dass Sie dies auf Ihren sozialen Netzwerken teilen und mich markieren, da ich die Waren von RebellionRider jeden Monat an einen zufällig ausgewählten Benutzer verschenke. Folgen Sie mir auch auf meinen Social Media [Twitter/Facebook/Instagram] für regelmäßige Updates.
Vielen Dank und einen schönen Tag noch!