Detaillierte Erklärung der Verwendung und Funktion des MySQL-Cursors

Detaillierte Erklärung der Verwendung und Funktion des MySQL-Cursors

[Verwendung und Funktion des MySQL-Cursors]

Beispiel:

Derzeit gibt es drei Tabellen A, B und C. A und B stehen in einer Eins-zu-viele-Beziehung und B und C stehen in einer Eins-zu-viele-Beziehung. Jetzt müssen Sie den Primärschlüssel von Tabelle A in B in Tabelle C speichern.
Die herkömmliche Idee besteht darin, Tabelle B abzufragen und dann Tabelle C mit einer Aktualisierungsanweisung zu aktualisieren. In Tabelle B befinden sich jedoch mehr als 2.000 Datensätze.
Muss es mehr als 2.000 Mal ausgeführt werden? Dies ist offensichtlich unrealistisch; ich habe endlich eine Möglichkeit gefunden, eine gespeicherte Prozedur zu schreiben und die C-Tabelle dann über eine Schleife zu aktualisieren.
Die gespeicherte Prozedur wird jedoch in Form eines Cursors geschrieben.

【Einführung】

Ein Cursor ist eigentlich ein Mechanismus, der aus einem Ergebnissatz, der mehrere Datensätze enthält, jeweils einen Datensatz extrahieren kann.

Der Cursor fungiert als Zeiger.

Obwohl ein Cursor alle Zeilen im Ergebnissatz durchlaufen kann, zeigt er immer nur auf eine Zeile gleichzeitig.

Die Funktion des Cursors besteht darin, die von der Abfragedatenbank zurückgegebenen Datensätze zu durchlaufen, um entsprechende Vorgänge auszuführen.

【Verwendung】

1. Deklarieren Sie einen Cursor: Deklarieren Sie den Cursornamen CURSOR für die Tabelle; (die Tabelle kann hier jede von Ihnen abgefragte Sammlung sein)
2. Öffnen Sie den definierten Cursor: Cursornamen öffnen;
3. Holen Sie sich die nächste Datenzeile: FETCH Cursorname in Testrangeid, Versions-ID;
4. Auszuführende Anweisungen (Hinzufügen, Löschen, Ändern und Prüfen): Dies hängt von der jeweiligen Situation ab
5. Lassen Sie den Cursor los: CLOSE Cursorname;

Hinweis: Jede Anweisung in der gespeicherten MySQL-Prozedur muss mit ; ​​enden und die verwendeten temporären Felder müssen vor der Definition des Cursors deklariert werden.

【Beispiel】

- 
BEGINNEN 
 
--Definieren Sie Variablen, deklarieren Sie testrangeid BIGINT; 
Deklariere die Versions-ID BIGINT; 
deklariere erledigt int; 
--Cursor erstellen und Daten speichern, deklarieren Sie cur_test CURSOR für 
 Wählen Sie die ID als Testbereichs-ID, die Versions-ID als Versions-ID von tp_testrange. 
--Nachdem der Inhalt im Cursor ausgeführt wurde, setzen Sie „done“ auf 1 
 DECLARE CONTINUE HANDLER FÜR NICHT GEFUNDENES SET, fertig=1; 
--Öffnen Sie den Cursor open cur_test; 
--Schleife ausführen posLoop:LOOP 
--Beurteilen Sie, ob die Schleife beendet werden soll, WENN fertig=1, DANN 
  VERLASSEN Sie posLoop; 
 ENDE, WENN; 
--Holen Sie sich den Wert im Cursor FETCH cur_test in testrangeid,versionid; 
--Aktualisierungsvorgang ausführen update tp_data_execute set version_id=versionid where testrange_id = testrangeid; 
 ENDE DER SCHLEIFE posLoop; 
--Lassen Sie den Cursor los. CLOSE cur_test; 
 
ENDE 
-

Beispiel 2:

Wir werden jetzt eine gespeicherte Prozedur verwenden, um eine Funktion zu erstellen, die den Gesamtbestand an iPhones zählt und die Gesamtsumme an die Konsole ausgibt.

--Wenn Sie beim Schreiben einer gespeicherten Prozedur in einem Windows-System eine Variable mit „declare“ deklarieren müssen, müssen Sie dieses Schlüsselwort hinzufügen, da sonst ein Fehler gemeldet wird. 
Trennzeichen // 
Löschprozedur, falls StatisticStore vorhanden ist; 
PROZEDUR ERSTELLEN StatisticStore() 
BEGINNEN 
 --Erstellen Sie eine Variable zum Empfangen von Cursordaten. Deklarieren Sie c int. 
 deklariere n varchar(20); 
 --Erstellen Sie die Variable „total“ und deklarieren Sie „total int default 0“. 
 --End-Flag-Variable erstellen, deklarieren „done“ int default false; 
 --Erstellen Sie einen Cursor, deklarieren Sie den cur-Cursor für „Select Name, count from store“, wobei „Name = ‚iPhone‘“ ist; 
 --Geben Sie den Rückgabewert am Ende der Cursorschleife an. Deklarieren Sie „continuum HANDLER“ für „nicht gefunden“, und setzen Sie „done“ = „true“. 
 --Setzen Sie den Anfangswert „set total = 0“; 
 --Öffnen Sie den Cursor open cur; 
 --Starten Sie die Schleife über die Daten im Cursor read_loop:loop 
 --hol cur in n,c ab, entsprechend den Daten, auf die der Cursor aktuell zeigt; 
 --Beurteilen Sie, ob die Cursorschleife beendet ist, wenn sie fertig ist. 
  read_loop verlassen; --Aus der Cursor-Schleife springen, end if; 
 --Wenn Sie ein Datenelement erhalten, fügen Sie den Zählwert hinzu. Sie können hier tun, was Sie wollen. 
 Setze Gesamtsumme = Gesamtsumme + c; 
 --Beenden Sie die Cursorschleife, End-Loop; 
 --Cursor schließen close cur; 
 
 --Ausgabeergebnisse, Gesamtauswahl; 
ENDE; 
--Rufen Sie die gespeicherte Prozedur call StatisticStore(); auf.

Fetch dient zum Abrufen der Datenzeile, auf die der Cursor aktuell zeigt, und zum Zeigen des Zeigers auf die nächste Zeile. Die Fortsetzung der Ausführung, wenn der Cursor bereits auf die letzte Zeile gezeigt hat, führt zu einem Überlauf des Cursors.
Bei Verwendung eines Schleifencursors wird nicht überwacht, ob das letzte Datenelement erreicht wurde. Der folgende Code führt zu einer Endlosschleife.

read_loop:Schleife 
hole cur in n,c; 
setze Gesamtsumme = Gesamtsumme+c; 
Endschleife;

Wenn in MySql ein Cursorüberlauf auftritt, wird der vordefinierte MySQL-Fehler NOT FOUND ausgelöst. Daher wird der folgende Code oben verwendet, um ein Fortsetzungsereignis zu definieren, wenn ein Fehler NOT FOUND ausgelöst wird, und um anzugeben, dass der Wert der Variable done geändert wird, wenn dieses Ereignis eintritt.

Deklarieren Sie den Continue-HANDLER für nicht gefundenen Satz „Done“ = „true“.

Daher habe ich der Schleife den folgenden Code hinzugefügt:

--Beurteilen Sie, ob die Cursorschleife beendet ist, wenn sie fertig ist. 
 read_loop verlassen; --Aus der Cursor-Schleife springen, end if;

Wenn der Wert von done true ist, endet die Schleife. Führen Sie den folgenden Code weiter aus

Anwendung

Es gibt drei Möglichkeiten, Cursor zu verwenden:
Die erste ist die obige Implementierung mit einer Schleife.
Die zweite Möglichkeit ist wie folgt und verwendet eine While-Schleife:

Löschprozedur, falls StatisticStore1 vorhanden ist; 
PROZEDUR ERSTELLEN StatisticStore1() 
BEGINNEN 
 Deklariere c int; 
 deklariere n varchar(20); 
 Deklarieren Sie den Gesamtint-Standardwert 0. 
 Deklarieren Sie „done“ als „int default false“. 
 Deklarieren Sie den aktuellen Cursor, um den Namen auszuwählen und aus dem Store zu zählen, wobei Name = „iPhone“ ist. 
 Deklarieren Sie den Continue-HANDLER für nicht gefundenen Satz „Done“ = „true“. 
 Setze Gesamtsumme = 0; 
 offenes Köcher; 
 hole cur in n,c; 
 während(nicht erledigt) tun 
  Setze Gesamtsumme = Gesamtsumme + c; 
  hole cur in n,c; 
 Ende während; 
  
 enger Köter; 
 Gesamtsumme auswählen; 
ENDE; 
 
rufen Sie StatisticStore1() auf;

Die dritte Möglichkeit besteht in der wiederholten Ausführung:

Löschprozedur, falls StatisticStore2 vorhanden ist; 
PROZEDUR ERSTELLEN StatisticStore2() 
BEGINNEN 
 Deklariere c int; 
 deklariere n varchar(20); 
 Deklarieren Sie den Gesamtint-Standardwert 0. 
 Deklarieren Sie „done“ als „int default false“. 
 Deklarieren Sie den aktuellen Cursor, um den Namen auszuwählen und aus dem Store zu zählen, wobei Name = „iPhone“ ist. 
 Deklarieren Sie den Continue-HANDLER für nicht gefundenen Satz „Done“ = „true“. 
 Setze Gesamtsumme = 0; 
 offenes Köcher; 
 wiederholen 
 hole cur in n,c; 
 wenn nicht getan, dann 
  Setze Gesamtsumme = Gesamtsumme + c; 
 Ende wenn; 
 bis es fertig ist, wiederholen; 
 enger Köter; 
 Gesamtsumme auswählen; 
ENDE; 
 
rufen Sie StatisticStore2() auf;

Verschachtelte Cursor

In MySQL ist jeder Anfangs- und Endblock ein unabhängiger Bereich. Da dasselbe Fehlerereignis in MySQL nur einmal definiert werden kann, wird bei mehrmaliger Definition während der Kompilierung ein im selben Block deklarierter Duplikathandler angezeigt.

Löschprozedur, falls StatisticStore3 vorhanden ist; 
PROZEDUR ERSTELLEN StatisticStore3() 
BEGINNEN 
 deklarieren Sie _n varchar(20); 
 Deklarieren Sie „done“ als „int default false“. 
 Deklarieren Sie den aktuellen Cursor, um den Namen aus der Store-Gruppe nach Namen auszuwählen. 
 Deklarieren Sie den Continue-HANDLER für nicht gefundenen Satz „Done“ = „true“. 
 offenes Köcher; 
 read_loop:Schleife 
 hol cur in _n; 
 wenn fertig dann 
  verlasse read_loop; 
 Ende wenn; 
 beginnen 
  Deklariere c int; 
  deklariere n varchar(20); 
  Deklarieren Sie den Gesamtint-Standardwert 0. 
  Deklarieren Sie „done“ als „int default false“. 
  Deklarieren Sie den aktuellen Cursor, um den Namen auszuwählen und aus dem Store zu zählen, wobei Name = „iPhone“ ist. 
  Deklarieren Sie den Continue-HANDLER für nicht gefundenen Satz „Done“ = „true“. 
  Setze Gesamtsumme = 0; 
  offenes Köcher; 
  iphone_loop:Schleife 
  hole cur in n,c; 
  wenn fertig dann 
   verlasse iphone_loop; 
  Ende wenn; 
  Setze Gesamtsumme = Gesamtsumme + c; 
  Endschleife; 
  enger Köter; 
  wähle _n,n,gesamt; 
 Ende; 
 beginnen 
   Deklariere c int; 
   deklariere n varchar(20); 
   Deklarieren Sie den Gesamtint-Standardwert 0. 
   Deklarieren Sie „done“ als „int default false“. 
   Deklarieren Sie den aktuellen Cursor für die Auswahl des Namens, zählen Sie aus dem Store, wobei Name = „Android“ ist; 
   Deklarieren Sie den Continue-HANDLER für nicht gefundenen Satz „Done“ = „true“. 
   Setze Gesamtsumme = 0; 
   offenes Köcher; 
   android_loop:Schleife 
   hole cur in n,c; 
   wenn fertig dann 
    verlasse android_loop; 
   Ende wenn; 
   Setze Gesamtsumme = Gesamtsumme + c; 
   Endschleife; 
   enger Köter; 
  wähle _n,n,gesamt; 
 Ende; 
 beginnen 
  
 Ende; 
 Endschleife; 
 enger Köter; 
ENDE; 
 
rufen Sie StatisticStore3() auf;

Das Obige dient der Implementierung einer verschachtelten Schleife, natürlich ist dieses Beispiel weit hergeholt. Schauen Sie es sich jetzt einfach einmal an.

Dynamisches SQL

MySQL unterstützt dynamische SQL-Funktionen

Setzen Sie @sqlStr='select * from table where condition1 = ?'; 
bereiten Sie s1 für @sqlStr vor; 
--Wenn mehrere Parameter vorhanden sind, trennen Sie diese durch Kommas. Führen Sie s1 mit @condition1 aus. 
--Manuelle Freigabe, oder wenn die Verbindung geschlossen wird, recycelt der Server automatisch die Freigabe und bereitet s1 vor.

Oben finden Sie eine ausführliche Erläuterung des MySQL-Cursors. Weitere Informationen zum MySQL-Cursor finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Definition und Verwendung des MySQL-Cursors
  • Verwenden einer Cursorschleife zum Lesen temporärer Tabellen in gespeicherten MySQL-Prozeduren
  • So deklarieren Sie einen Cursor in MySQL
  • MySQL-Cursor-Prinzip und Analyse von Anwendungsbeispielen
  • Hier erfahren Sie alles über die Funktionsweise der MySQL-Datenbank in Python (Cursor-Erklärung).
  • Detaillierte Erklärung des Prinzips und der Verwendung des Cursors (DECLARE) in der gespeicherten MySQL-Prozedur
  • Detaillierte Erläuterung der MySQL-Cursor-Konzepte und -Verwendung
  • Detaillierte Erläuterung der gespeicherten Prozeduren, Cursor und Transaktionsbeispiele von MySQL
  • Beispiel für die Verwendung des Cursors in einer gespeicherten MySQL-Prozedur
  • Verschachtelte Schleife einer gespeicherten MySQL-Prozedur mit Cursor-Beispielcode
  • Beispiel für das Verlassen und Fortsetzen der Cursorschleife in gespeicherten MySQL-Prozeduren
  • MySQL-Cursorfunktionen und -Verwendung

<<:  Detaillierte Erklärung zum Festlegen des Änderungswerts innerhalb einer bestimmten Zeit in Zabbix

>>:  Vue implementiert Funktionen zum Hoch- und Herunterladen von Dateien

Artikel empfehlen

Eine kurze Diskussion über JavaScript-Drosselung und Anti-Shake

Inhaltsverzeichnis Drosselung und Anti-Shake Konz...

Implementierung des MySQL Shell import_table-Datenimports

Inhaltsverzeichnis 1. Einführung in import_table ...

Konfigurationshandbuch für den Lastenausgleich auf Ebene 4 von Nginx

1. Einführung in Layer 4 Load Balancing Was ist L...

Tabellen in HTML aufteilen und zusammenführen (colspan, rowspan)

Der Code demonstriert die horizontale Zusammenfüh...

Lösung für die Upload-Einschränkung von Element-ui-Uploaddateien

Frage Die Angabe des Typs der hochgeladenen Datei...

Untersuchung des Wertes des Positionsattributs in CSS (Zusammenfassung)

Das CSS-Positionsattribut gibt den Positionierung...

ElementUI implementiert kaskadierenden Selektor

In diesem Artikelbeispiel wird der spezifische Co...

Detaillierte Analyse des Unterschieds zwischen Ref und Reactive in Vue3.0

Inhaltsverzeichnis Ref und Reaktiv Referenz Reakt...

Vue setzt die Daten auf ihren ursprünglichen Zustand zurück

In einigen Fällen müssen die Daten in den Daten w...