Detaillierte Erklärung des Prinzips und der Verwendung des Cursors (DECLARE) in der gespeicherten MySQL-Prozedur

Detaillierte Erklärung des Prinzips und der Verwendung des Cursors (DECLARE) in der gespeicherten MySQL-Prozedur

Dieser Artikel veranschaulicht anhand von Beispielen die Prinzipien und die Verwendung von Cursorn (DECLARE) in gespeicherten MySQL-Prozeduren. Teilen Sie uns die Einzelheiten zu Ihrer Information mit:

Wir können Cursor beim Verarbeiten von Ergebnismengen in gespeicherten Prozeduren verwenden, da Cursor es uns ermöglichen, über eine Reihe von Zeilen zu iterieren, die von einer Abfrage zurückgegeben werden, und jede Zeile entsprechend zu verarbeiten. Der MySQL-Cursor verfügt über drei Modi: schreibgeschützt, nicht scrollbar und sensitiv. Werfen wir einen Blick darauf:

  • Schreibgeschützt : Daten in der zugrunde liegenden Tabelle können nicht über den Cursor aktualisiert werden.
  • Nicht scrollbar : Zeilen können nur in der durch die Select-Anweisung festgelegten Reihenfolge abgerufen werden. Es ist nicht möglich, Zeilen in umgekehrter Reihenfolge abzurufen. Darüber hinaus können Sie keine Zeilen überspringen oder zu einer bestimmten Zeile im Ergebnissatz springen.
  • Sensitiv : Es gibt zwei Arten von Cursorn: sensible und unempfindliche Cursor. Sensible Cursor zeigen auf die tatsächlichen Daten, und insensitive Cursor verwenden eine temporäre Kopie der Daten. Ein sensibler Cursor wird schneller ausgeführt als ein unempfindlicher Cursor, da kein temporäres Kopieren von Daten erforderlich ist. Alle an den Daten anderer Verbindungen vorgenommenen Änderungen wirken sich jedoch auf die von sensiblen Cursorn verwendeten Daten aus. Daher ist es sicherer, wenn Sie die von sensiblen Cursorn verwendeten Daten nicht aktualisieren. MySQL-Cursor sind empfindlich.

Wir können MySQL-Cursor in gespeicherten Prozeduren, gespeicherten Funktionen und Triggern verwenden. Sehen wir uns zunächst die Syntax zum Deklarieren von Cursorn mit der Anweisung DECLARE an:

DECLARE Cursorname CURSOR FÜR SELECT_Anweisung;

Wir sollten beachten, dass die Cursordeklaration nach der Variablendeklaration stehen muss. Wenn Sie einen Cursor vor einer Variablendeklaration deklarieren, gibt MySQL einen Fehler aus. Außerdem muss ein Cursor immer mit einer SELECT-Anweisung verknüpft sein. Nachdem wir nun fertig sind, verwenden wir die OPEN-Anweisung, um den Cursor zu öffnen. Die OPEN-Anweisung initialisiert den Ergebnissatz eines Cursors. Daher müssen wir die OPEN-Anweisung aufrufen, bevor wir Zeilen aus dem Ergebnissatz abrufen:

ÖFFNEN Cursorname;

Anschließend verwenden wir die FETCH-Anweisung, um die nächste Zeile abzurufen, auf die der Cursor zeigt, und bewegen den Cursor zur nächsten Zeile im Ergebnissatz:

FETCH Cursorname in Variablenliste;

Danach können wir prüfen, ob ein Zeilendatensatz verfügbar ist und ihn dann abrufen. Denken Sie am Ende daran, die Anweisung CLOSE aufzurufen, um den Cursor zu deaktivieren und den damit verbundenen Speicher freizugeben:

SCHLIESSEN Cursorname;

Wir müssen wissen, dass der Cursor geschlossen werden soll, wenn er nicht mehr verwendet wird. Wenn wir MySQL-Cursor verwenden, müssen wir auch einen NOT FOUND-Handler deklarieren, um den Fall zu behandeln, wenn der Cursor keine Zeilen findet. Denn bei jedem Aufruf der FETCH-Anweisung versucht der Cursor, die nächste Zeile im Ergebnissatz zu lesen. Wenn der Cursor das Ende des Ergebnissatzes erreicht, können keine Daten abgerufen werden und es wird eine Bedingung generiert. Der NOT FOUND-Handler wird verwendet, um diese Situation zu bewältigen. Werfen wir einen Blick auf seine grammatische Struktur:

DECLARE CONTINUE HANDLER FÜR NICHT GEFUNDENES SET, fertig = 1;

„finished“ ist eine Variable, die angibt, dass der Cursor das Ende des Ergebnissatzes erreicht hat. Beachten Sie, dass die Handler-Deklaration nach den Variablen- und Cursor-Deklarationen in der gespeicherten Prozedur erscheinen muss. Werfen wir einen Blick auf das Funktionsprinzipdiagramm des MySQL-Cursors:

Als Nächstes entwickeln wir eine gespeicherte Prozedur, um eine Liste der E-Mail-Adressen aller Mitarbeiter in der Mitarbeitertabelle zu erhalten. Beginnen wir mit der Deklaration einiger Variablen, eines Cursors zum Durchlaufen der Mitarbeiter-E-Mails und eines NOT FOUND-Handlers:

DECLARE fertig INTEGER DEFAULT 0;
DECLARE E-Mail varchar (255) DEFAULT "";
-- Cursor für Mitarbeiter-E-Mail deklarieren
DEClARE email_cursor CURSOR FÜR
 WÄHLEN SIE E-Mails von Mitarbeitern aus;
-- NOT FOUND-Handler deklarieren
DECLARE-CONTINUE-HANDLER
FÜR NICHT GEFUNDENES SET fertig = 1;
Öffnen Sie als Nächstes „email_cursor“ mit der OPEN-Anweisung:
ÖFFNEN Sie den E-Mail-Cursor.

Iterieren Sie dann über die Liste der E-Mails und verketten Sie jede E-Mail mit dem Trennzeichen (;):

get_email: SCHLEIFE
 FETCH email_cursor INTO v_email;
 WENN v_fertig = 1 DANN
 VERLASSEN Sie get_email;
 ENDE, WENN;
 --E-Mail-Liste erstellen
 SET E-Mail-Liste = CONCAT(v_email,";",E-Mail-Liste);
ENDE DER SCHLEIFE get_email;

Anschließend verwenden wir die Variable v_finished in der Schleife, um zu prüfen, ob sich E-Mails in der Liste befinden, um die Schleife zu beenden, und wenn wir fertig sind, schließen wir den Cursor mit der Anweisung CLOSE:

SCHLIESSEN Sie email_cursor;

Sehen wir uns den gesamten Code in der gespeicherten Prozedur build_email_list an:

TRENNUNGSZEICHEN $$
ERSTELLEN SIE DAS VERFAHREN „build_email_list“ (INOUT „email_list“ varchar(4000))
BEGINNEN
 DECLARE v_finished INTEGER DEFAULT 0;
    DECLARE v_email varchar(100) DEFAULT "";
 -- Cursor für Mitarbeiter-E-Mail deklarieren
 DEClARE email_cursor CURSOR FÜR
 WÄHLEN SIE E-Mails von Mitarbeitern aus;
 -- NOT FOUND-Handler deklarieren
 DECLARE-CONTINUE-HANDLER
    FÜR NICHT GEFUNDEN SET v_finished = 1;
 ÖFFNEN Sie den E-Mail-Cursor.
 get_email: SCHLEIFE
 FETCH email_cursor INTO v_email;
 WENN v_fertig = 1 DANN
 VERLASSEN Sie get_email;
 ENDE, WENN;
 --E-Mail-Liste erstellen
 SET E-Mail-Liste = CONCAT(v_email,";",E-Mail-Liste);
 ENDE DER SCHLEIFE get_email;
 SCHLIESSEN Sie email_cursor;
ENDE$$
TRENNUNGSZEICHEN ;

Testen wir die gespeicherte Prozedur build_email_list mit dem folgenden Skript:

SETZEN Sie @email_list = "";
Rufen Sie build_email_list(@email_list) auf;
Wählen Sie @email_list;

Auf die Ergebnisse werde ich nicht näher eingehen.

Leser, die an weiteren MySQL-bezogenen Inhalten interessiert sind, können sich die folgenden Themen auf dieser Site ansehen: „Kenntnisse zu gespeicherten MySQL-Prozeduren“, „Zusammenfassung der allgemeinen MySQL-Funktionen“, „Kenntnisse zu MySQL-Protokollvorgängen“, „Zusammenfassung der Kenntnisse zu MySQL-Transaktionsvorgängen“ und „Zusammenfassung der Kenntnisse zu MySQL-Datenbanksperren“.

Ich hoffe, dass dieser Artikel für jedermann beim Entwurf einer MySQL-Datenbank hilfreich ist.

Das könnte Sie auch interessieren:
  • Einführung in die Verwendung der Cursorschleife für gespeicherte Prozeduren in MySQL
  • Beispiel für das Verlassen und Fortsetzen der Cursorschleife in gespeicherten MySQL-Prozeduren
  • Verschachtelte Schleife einer gespeicherten MySQL-Prozedur mit Cursor-Beispielcode
  • Beispiel für die Verwendung des Cursors in einer gespeicherten MySQL-Prozedur
  • Dynamisches MySQL-Cursor-Lernen (MySQL-Cursor für gespeicherte Prozeduren)
  • Detaillierte Erläuterung der gespeicherten Prozeduren, Cursor und Transaktionsbeispiele von MySQL
  • Beispiel für die Verwendung des Cursors in einer gespeicherten MySQL-Prozedur
  • Verwenden einer Cursorschleife zum Lesen temporärer Tabellen in gespeicherten MySQL-Prozeduren
  • Beispiele für die Verwendung von gespeicherten MySql-Prozeduren und Cursorn

<<:  JavaScript zum Erzielen eines benutzerdefinierten Bildlaufleisteneffekts

>>:  Grafisches Tutorial zur Installation von Tomcat8 auf einem Linux-System Centos7.X

Artikel empfehlen

Detailliertes Tutorial zur Verwendung von stimulsoft.reports.js mit vue-cli

vue-cli verwendet stimulsoft.reports.js (Tutorial...

Detailliertes Tutorial zum Bereitstellen eines Hadoop-Clusters mit Docker

Ich möchte in meinem Unternehmen kürzlich einen H...

So verwenden Sie allgemeine MySQL-Funktionen zur Verarbeitung von JSON

Offizielle Dokumentation: JSON-Funktionen Name Be...

So richten Sie Textfelder in mehreren Formularen in HTML aus

Der Formularcode ist wie in der Abbildung dargest...

border-radius-Methode zum Hinzufügen abgerundeter Ränder zu Elementen

border-radius:10px; /* Alle Ecken sind mit einem ...

Anfänger lernen einige HTML-Tags (1)

Anfänger können HTML lernen, indem sie einige HTM...

Allgemeine Shell-Skriptbefehle und zugehöriges Wissen unter Linux

Inhaltsverzeichnis 1. Einige Punkte, die Sie beac...

Konfigurationslösung für die MySQL Dual-Master-Architektur (Master-Master)

In Unternehmen hat die hohe Verfügbarkeit von Dat...

Verwendung der Vue3-Tabellenkomponente

Inhaltsverzeichnis 1. Ant Design Vue 1. Offiziell...

So verstehen Sie den einfachen Speichermodus der Statusverwaltung von Vue

Inhaltsverzeichnis Überblick 1. Definieren Sie st...