Zusammenfassung: In diesem Lernprogramm lernen Sie den PL / SQL-Cursor und seine Verwendung kennen.
Ein Cursor ist a Zeiger, der auf ein Ergebnis einer Abfrage zeigt. PL / SQL verfügt über zwei Arten von Cursorn: implizite Cursor und explizite Cursor.
Implizite Cursor
Immer wenn Oracle eine SQL-Anweisung wie SELECT INTO
, INSERT
, UPDATE
und DELETE
erstellt automatisch einen impliziten Cursor.
Oracle verwaltet intern den gesamten Ausführungszyklus impliziter Cursor und zeigt nur die Informationen und Status des Cursors an, z. B. SQL%ROWCOUNT
, SQL%ISOPEN
, SQL%FOUND
und SQL%NOTFOUND
.
Der implizite Cursor ist nicht elegant, wenn die Abfrage null oder mehrere Zeilen zurückgibt die NO_DATA_FOUND
bzw. TOO_MANY_ROWS
Ausnahme verursachen.
Explizite Cursor
Ein expliziter Cursor ist Eine SELECT
-Anweisung, die explizit im Deklarationsabschnitt des aktuellen Blocks oder in einer Paketspezifikation deklariert wurde.
Für einen expliziten Cursor haben Sie cont rol über seinen Ausführungszyklus von OPEN
, FETCH
und CLOSE
.
Oracle definiert einen Ausführungszyklus, der eine SQL-Anweisung ausführt und einen Cursor damit verknüpft.
Die folgende Abbildung zeigt den Ausführungszyklus eines expliziten Cursors:
Lassen Sie uns jeden Schritt im Detail untersuchen.
Deklarieren Sie einen Cursor
Bevor Sie einen expliziten Cursor verwenden, müssen Sie ihn im Deklarationsabschnitt eines Blocks oder Pakets wie folgt deklarieren:
In dieser Syntax :
- Geben Sie zunächst den Namen des Cursors nach dem Schlüsselwort
CURSOR
an. - Zweitens definieren Sie eine Abfrage zum Abrufen von Daten Nach dem Schlüsselwort
IS
.
Öffnen eines Cursors
Bevor Sie mit dem Abrufen von Zeilen vom Cursor beginnen, müssen Sie ihn öffnen. Zum Öffnen eines Cursors verwenden Sie die folgende Syntax:
In dieser Syntax ist cursor_name
der Name
Wenn Sie einen Cursor öffnen, analysiert Oracle die Abfrage, bindet Variablen und führt die zugehörige SQL-Anweisung aus.
Oracle bestimmt auch einen Ausführungsplan , ordnet den Platzhaltern in der SQL-Anweisung Hostvariablen und Cursorparameter zu, bestimmt die Ergebnismenge und setzt den Cursor auf die erste Zeile in der Ergebnismenge.
Weitere Informationen zum parametrisierten Cursor finden Sie im nächsten Lernprogramm.
Abrufen von einem Cursor
Die Anweisung FETCH
platziert den Inhalt der aktuellen Zeile in Variablen. Die Syntax der Anweisung FETCH
lautet wie folgt:
Um alle Zeilen in einer Ergebnismenge abzurufen, benötigen Sie Um jede Zeile bis zur letzten abzurufen.
Schließen eines Cursors
Nachdem Sie alle Zeilen abgerufen haben, müssen Sie den Cursor mit der CLOSE
Anweisung:
Durch Schließen eines Cursors wird Oracle angewiesen, den zugewiesenen Speicher zu einem geeigneten Zeitpunkt freizugeben.
Wenn Sie einen Cursor in einem deklarieren Anonymer Block, Prozedur oder Funktion. Der Cursor wird automatisch geschlossen, wenn die Ausführung dieser Objekte endet.
Sie müssen jedoch paketbasierte Cursor explizit schließen. Beachten Sie, dass Oracle beim Schließen eines noch nicht geöffneten Cursors eine INVALID_CURSOR
-Ausnahme auslöst.
Explizite Cursorattribute
Ein Cursor hat vier Attribute, auf die Sie im folgenden Format verweisen können:
wobei cursor_name
der Name des ist expliziter Cursor.
1)% ISOPEN
Dieses Attribut ist TRUE
, wenn der Cursor geöffnet ist oder FALSE
wenn nicht.
2)% FOUND
Dieses Attribut hat vier Werte:
-
NULL
vor dem ersten Abruf -
TRUE
wenn ein Datensatz erfolgreich abgerufen wurde -
FALSE
wenn keine Zeile zurückgegeben wird -
INVALID_CURSOR
wenn der Cursor nicht geöffnet ist
3)% NOTFOUND
Dieses Attribut hat vier Werte:
-
NULL
vor dem ersten Abruf -
FALSE
wenn ein Datensatz erfolgreich abgerufen wurde -
TRUE
wenn keine Zeile zurückgegeben wird -
INVALID_CURSOR
wenn der Cursor nicht geöffnet ist
3)% ROWCOUNT
Das Attribut %ROWCOUNT
gibt die Anzahl der vom Cursor abgerufenen Zeilen zurück. Wenn der Cursor nicht geöffnet ist, gibt dieses Attribut INVALID_CURSOR
zurück.
PL / SQL-Cursor-Beispiel
Wir verwenden die Tabellen orders
und order_items
von die Beispieldatenbank für die Demonstration.
Die folgende Anweisung erstellt eine Ansicht, die die Umsatzerlöse von Kunden zurückgibt:
Die Werte der Kreditspalte betragen 5% der gesamten Umsatzerlöse.
Angenommen, Sie müssen eine anonyme Entwicklung entwickeln Blockieren Sie Folgendes:
- Setzen Sie die Kreditlimits aller Kunden auf Null zurück.
- Rufen Sie Kunden sortiert nach Verkäufen in absteigender Reihenfolge ab und geben Sie ihnen neue Kreditlimits aus einem Budget von 1 Million.
Der folgende anonyme Block veranschaulicht die Logik:
Im Deklarationsabschnitt deklarieren wir drei Variablen.
Die erste ist l_budget
mit dem Anfangswert 1,000,000
.
Die zweite Variable ist eine explizite Cursor-Variable mit dem Namen c_sales
dessen ruft Daten aus der Ansicht sales
ab:
Die dritte Variable ist a Cursor-basierter Datensatz mit dem Namen c_sales
.
Im Ausführungsabschnitt führen wir Folgendes aus:
- Setzen Sie zunächst die Kreditlimits zurück aller Kunden mit einer
UPDATE
-Anweisung auf Null setzen. - Öffnen Sie anschließend den Cursor
c_sales
. - Drittens rufen Sie jede Zeile vom Cursor ab. In jeder Schleifeniteration aktualisieren wir das Kreditlimit und reduzieren das Budget. Die Schleife wird beendet, wenn keine Zeile abgerufen werden muss oder das Budget erschöpft ist.
- Schließen Sie abschließend den Cursor.
Die folgende Abfrage ruft Daten von der customers
Tabelle zum Überprüfen des Updates:
Ergebnis:
Wie Sie dem Ergebnis deutlich entnehmen können, haben nur die ersten Kunden die Kreditlimits. Wenn Sie alle Kreditlimits zusammenfassen, sollte die Summe wie folgt 1 Million betragen:
Jetzt sollten Sie PL / SQL-Cursor einschließlich impliziter und expliziter Cursor verstehen und wissen, wie Sie sie effektiv verwenden können, um Daten zeilenweise aus einer Tabelle zu verarbeiten.
- War dieses Lernprogramm hilfreich?
- JaNein