logo

Was ist Cursor in SQL?

Mauszeiger ist ein temporärer Speicher oder temporärer Arbeitsplatz. Es wird zugewiesen von Datenbank Server zum Zeitpunkt der Ausführung von DML-Vorgängen (Data Manipulation Language) an der Tabelle durch den Benutzer. Cursor werden zum Speichern von Datenbanktabellen verwendet.

Es gibt zwei Arten von Cursorn: implizite Cursor und explizite Cursor. Diese werden im Folgenden erläutert.

  1. Implizite Cursor: Implizite Cursor werden auch als Standardcursor von SQL SERVER bezeichnet. Diese Cursor werden von SQL SERVER zugewiesen, wenn der Benutzer DML-Vorgänge ausführt.
  2. Explizite Cursor: Explizite Cursor werden von Benutzern immer dann erstellt, wenn der Benutzer sie benötigt. Explizite Cursor werden zum zeilenweisen Abrufen von Daten aus einer Tabelle verwendet.

Wie erstelle ich einen expliziten Cursor?

  1. Deklarieren Sie das Cursor-Objekt

Syntax:



DECLARE Cursorname CURSOR FOR SELECT * FROM Tabellenname

Abfrage:

DECLARE s1 CURSOR FOR SELECT * FROM studDetails>

2. Öffnen Sie die Cursorverbindung

Anmerkungen im Spring Boot

Syntax:

Cursorverbindung ÖFFNEN

Abfrage:

OPEN s1>

Daten vom Cursor abrufen Es gibt insgesamt 6 Methoden, um vom Cursor aus auf Daten zuzugreifen. Sie sind wie folgt:

  1. ERSTE wird verwendet, um nur die erste Zeile aus der Cursortabelle abzurufen.
  2. ZULETZT wird verwendet, um nur die letzte Zeile aus der Cursortabelle abzurufen.
  3. NÄCHSTE wird verwendet, um Daten in Vorwärtsrichtung aus der Cursortabelle abzurufen.
  4. VOR wird verwendet, um Daten in Rückwärtsrichtung aus der Cursortabelle abzurufen.
  5. ABSOLUT n wird verwendet, um das genaue n abzurufenThZeile aus der Cursortabelle.
  6. RELATIV n wird verwendet, um die Daten sowohl inkrementell als auch dekrementell abzurufen.

Syntax:

FETCH NEXT/FIRST/LAST/PRIOR/ABSOLUTE n/RELATIVE n FROM Cursor_Name

Abfrage:

FETCH FIRST FROM s1 FETCH LAST FROM s1 FETCH NEXT FROM s1 FETCH PRIOR FROM s1 FETCH ABSOLUTE 7 FROM s1 FETCH RELATIVE -2 FROM s1>
  • Cursorverbindung schließen

Syntax:

CLOSE Cursorname

Abfrage:

CLOSE s1>
  • Geben Sie den Cursorspeicher frei

Syntax:

DEALLOCATE Cursorname

Abfrage:

DEALLOCATE s1>

Wie erstelle ich einen impliziten Cursor?

Ein impliziter Cursor ist ein Cursor, der automatisch von PL/SQL erstellt wird, wenn Sie eine SQL-Anweisung ausführen. Sie müssen einen impliziten Cursor nicht explizit deklarieren oder öffnen. Stattdessen verwaltet PL/SQL den Cursor hinter den Kulissen für Sie.

Um einen impliziten Cursor in PL/SQL zu erstellen, müssen Sie lediglich eine SQL-Anweisung ausführen. Um beispielsweise alle Zeilen aus der EMP-Tabelle abzurufen, können Sie den folgenden Code verwenden:

Abfrage:

BEGIN FOR emp_rec IN SELECT * FROM emp LOOP DBMS_OUTPUT.PUT_LINE('Employee name: ' || emp_rec.ename); END LOOP; END;>

In PL/SQL, wenn wir ausführen EINFÜGEN , AKTUALISIEREN oder LÖSCHEN Operationen wird automatisch ein impliziter Cursor erstellt. Dieser Cursor enthält die einzufügenden Daten oder identifiziert die zu aktualisierenden oder zu löschenden Zeilen. Sie können diesen Cursor in Ihrem Code als SQL-Cursor bezeichnen. Dieser SQL-Cursor verfügt über mehrere nützliche Attribute.

  1. %FOUND ist wahr, wenn der letzte SQL-Vorgang mindestens eine Zeile betroffen hat.
  2. %NOTFOUND ist wahr, wenn keine Zeilen davon betroffen waren.
  3. %ROWCOUNT gibt die Anzahl der betroffenen Zeilen zurück.
  4. %ISOPEN prüft, ob der Cursor geöffnet ist.

Zusätzlich zu diesen Attributen sind %BULK_ROWCOUNT und %BULK_EXCEPTIONS spezifisch für die FORALL-Anweisung, die zum gleichzeitigen Ausführen mehrerer DML-Vorgänge verwendet wird. %BULK_ROWCOUNT gibt die Anzahl der Zeilen zurück, die von jedem DML-Vorgang betroffen sind, während %BULK_EXCEPTION alle Ausnahmen zurückgibt, die während der Vorgänge aufgetreten sind.

Abfrage:

CREATE TABLE Emp( EmpID INT PRIMARY KEY, Name VARCHAR(50), Country VARCHAR(50), Age int(2), Salary int(10) ); -- Insert some sample data into the Customers table INSERT INTO Emp (EmpID, Name,Country, Age, Salary) VALUES (1, 'Shubham', 'India','23','30000'), (2, 'Aman ', 'Australia','21','45000'), (3, 'Naveen', 'Sri lanka','24','40000'), (4, 'Aditya', 'Austria','21','35000'), (5, 'Nishant', 'Spain','22','25000'); Select * from Emp;>

Ausgabe:

Bild1

Dieses Programm aktualisiert eine Tabelle, indem es das Gehalt jedes Mitarbeiters um 1500 erhöht. Nach der Aktualisierung wird das SQL%ROWCOUNT-Attribut verwendet, um herauszufinden, wie viele Zeilen von der Operation betroffen waren.

Abfrage:

DECLARE total_rows number; BEGIN UPDATE Emp SET Salary = Salary + 1500; total_rows := SQL%ROWCOUNT; dbms_output.put_line(total_rows || ' rows updated.'); END;>

Ausgabe:

5 Emp selected PL/SQL procedure successfully completed.>

SQL-Cursor-Ausnahmen

Immer wenn wir eine SQL-Abfrage ausführen, besteht die Möglichkeit eines unerwarteten Fehlers. Der Cursor durchläuft jeden Satz von Zeilen, um in einer SQL-Abfrage zurückzukehren.

Es gibt einige sehr beliebte Ausnahmen:

  1. Doppelter Wert: Diese Art von Fehler tritt auf, wenn der Cursor versucht, einen Datensatz oder ein Tupel einzufügen, der bereits in der Datenbank vorhanden ist. Diese Art von Fehlern kann durch die ordnungsgemäße Handhabung der Fehlerkonfiguration vermieden werden
  2. Ungültiger Cursorstatus: Wenn sich der Cursor in einem ungültigen Zustand befindet, wird dieser Fehlertyp als Fehler angezeigt.
  3. Sperrzeitüberschreitung: Dies geschieht, wenn der Cursor versucht, eine Sperre für eine Zeile oder Tabelle zu erhalten, die Sperre jedoch bereits von einer anderen Transaktion gehalten wird.

Bedarf an Cursor in einem SQL Server

  1. Mit Cursorn können wir Daten Zeile für Zeile verarbeiten, was nützlich sein kann, wenn wir komplexe Berechnungen oder Transformationen an den Daten durchführen müssen.
  2. Mit Cursorn können wir eine Ergebnismenge mehrmals durchlaufen, was nützlich sein kann, wenn wir mehrere Operationen an denselben Daten durchführen müssen.
  3. Cursor können nützlich sein, wenn wir mehrere Tabellen mit komplexen Beziehungen verbinden müssen, beispielsweise bei der Verarbeitung hierarchischer Datenstrukturen oder bei der Durchführung rekursiver Abfragen.
  4. Mit Cursorn können wir Vorgänge wie das Aktualisieren, Löschen oder Einfügen von Datensätzen basierend auf bestimmten Bedingungen oder Kriterien ausführen.
  5. Cursor sind besonders nützlich, wenn Daten aus mehreren Tabellen verarbeitet werden, bei denen die Beziehungen nicht eindeutig sind.

Einschränkungen des SQL Server-Cursors

Da ein Cursor einige Einschränkungen aufweist, sollte er nur verwendet werden, wenn keine andere Wahl besteht. Zu diesen Einschränkungen gehören:

  1. Bei der Verarbeitung von Daten werden Sperren für eine Teilmenge oder die gesamte Tabelle verhängt.
  2. Die Cursor-Aktualisierungstabelle zeichnet jeweils eine Zeile auf, was ihre Leistung verlangsamt.
  3. Schleifen sind zwar langsamer als Cursor, haben aber einen höheren Overhead.
  4. Ein weiterer Faktor, der die Cursorgeschwindigkeit beeinflusst, ist die Anzahl der Zeilen und Spalten, die in den Cursor gebracht werden.

FAQ:

F.1 Wie können Cursor vermieden werden?

Antwort:

Die Hauptfunktion von Cursorn ist die zeilenweise Navigation in der Tabelle. Im Folgenden finden Sie einige einfache Methoden zur Vermeidung von Cursorn:

F.2 Wie verwende ich eine While-Schleife im SQL-Cursor?

Antwort:

Die Verwendung einer While-Schleife, die das Einfügen einer Ergebnismenge in die temporäre Tabelle ermöglicht, ist die einfachste Möglichkeit, die Notwendigkeit eines Cursors zu vermeiden.

F.3 Was sind benutzerdefinierte Funktionen in SQL Cursor?

Antwort:

Manchmal wird der resultierende Zeilensatz mithilfe von Cursorn berechnet. Dies erreichen wir durch den Einsatz einer benutzerdefinierten Funktion, die den Spezifikationen entspricht.

F.4 Verwendung von Joins mit SQL Cursor?

Antwort:

In Fällen, in denen große Datensätze verarbeitet werden müssen, reduziert Join die Anzahl der Codezeilen, indem nur die Spalten verarbeitet werden, die die angegebene Bedingung erfüllen.