PL / SQL-Cursor (Deutsch)

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:

  1. Setzen Sie die Kreditlimits aller Kunden auf Null zurück.
  2. 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

Leave a Reply

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.