Definition Wir geraten häufig in die Situation, die Ergebnisse unserer Abfrage zu durchlaufen und jedes durchlaufene Datenelement zu verarbeiten. In diesem Fall wird ein Cursor verwendet. Die Rolle des CursorsFür die oben genannten Studenten müssen wir beispielsweise jeden Benutzer durchgehen und dann auf der Grundlage ihrer anderen Kommentare Punkte hinzufügen oder abziehen. Zu diesem Zeitpunkt müssen wir sämtliche Studierendendaten (inkl. Noten) abfragen. Wählen Sie Studenten-ID, Studentenname und Punktzahl der Studenten aus; Nach der Ausführung wird ein Satz von Studentendaten zurückgegeben. Wenn wir die Studentendaten einzeln durchlaufen und dann je nach spezifischer Situation Punkte hinzufügen müssen, müssen wir einen Cursor verwenden. Verwendung des Cursors
Hinweis: Die verwendeten temporären Felder müssen vor der Definition des Cursors deklariert werden. Deklarieren eines CursorsDECLARE Cursorname CURSOR FÜR Select-Anweisung; Deklarieren Sie einen Cursor. Sie können in einer Subroutine auch mehrere Cursor definieren, aber jeder Cursor in einem Block muss einen eindeutigen Namen haben. Nach dem Deklarieren eines Cursors handelt es sich ebenfalls um eine einzelne Operation, aber die SELECT-Anweisung kann keine INTO-Klausel enthalten. Cursor öffnenÖFFNEN Cursorname; Öffnet einen zuvor deklarierten Cursor. Durchlaufen von CursordatenFETCH Cursorname INTO Var_Liste; Diese Anweisung ruft die nächste Zeile (sofern vorhanden) unter Verwendung des angegebenen offenen Cursors ab und bewegt den Cursorzeiger weiter. Holen Sie sich das Ergebnis der aktuellen Zeile, fügen Sie das Ergebnis in die entsprechende Variable ein und richten Sie den Cursorzeiger auf die Daten der nächsten Zeile. Cursor schließenSCHLIESSEN Cursorname; Denken Sie daran, den Cursor zu schließen, wenn Sie ihn nicht mehr verwenden. Cursor-BeispielSchreiben Sie eine Funktion, die die Berechnung der Noten und Zusatzpunkte der Schüler beinhaltet Datengrundlage mysql> wähle * aus Studenten; +-----------+----------+----------+---------+ | Studenten-ID | Studentenname | Punktzahl | Klassen-ID | +-----------+----------+----------+---------+ | 1 | Marke | 97,5 | 1 | | 2 | Helene | 96,5 | 1 | | 3 | lyn | 96 | 1 | | 4 | Sol | 97 | 1 | | 5 | b1 | 81 | 2 | | 6 | b2 | 82 | 2 | | 7 | c1 | 71 | 3 | | 8 | c2 | 72,5 | 3 | | 9 | lala | 73 | 0 | | 10 | EIN | 99 | 3 | | 16 | test1 | 100 | 0 | | 17 | Auslöser2 | 107 | 0 | | 22 | Auslöser1 | 100 | 0 | +-----------+----------+----------+---------+ 13 Reihen im Set Schreiben von Funktionen mit Cursorn Die Anmerkungen hier sind sehr klar MySQL> /* Falls die Funktion existiert, löschen Sie sie */ Funktion löschen, wenn fun_test vorhanden ist; /* Das Ende der Anweisung ist $*/ TRENNUNGSZEICHEN $ /*Erstellen Sie eine Funktion, um jedem Schüler, der die Anforderungen erfüllt, Punkte hinzuzufügen. Die hinzugefügten Punkte dürfen den angegebenen Wert max_score nicht überschreiten*/ FUNKTION ERSTELLEN fun_test(max_score decimal(10,2)) RÜCKGABE int BEGINNEN /*Definieren Sie die Echtzeitvariable „StudentId“*/ DECLARE var_studentId int DEFAULT 0; /*Definieren Sie die Variable für den berechneten Score*/ DECLARE var_score dezimal(10,2) DEFAULT 0; /*Definieren Sie die Cursor-Endmarkierungsvariable*/ DECLARE var_done int DEFAULT FALSE; /*Cursor erstellen*/ DECLARE cur_test CURSOR FOR SELECT studentid, Punktzahl von Studenten, bei denen classid<>0 ist; /*Wenn der Cursor endet, wird var_done auf true gesetzt. Sie können var_done verwenden, um zu bestimmen, ob der Cursor später beendet wurde*/ DECLARE CONTINUE HANDLER FÜR NICHT GEFUNDEN SET var_done=TRUE; /*Cursor öffnen*/ ÖFFNEN Sie aktuellen_Test; /*Mithilfe von „Loop“ den Cursor durchlaufen*/ select_loop:SCHLEIFE /*Erst die Daten der aktuellen Zeile abrufen, dann die Daten der aktuellen Zeile in var_studentId, var_score einfügen. Wenn keine Datenzeile vorhanden ist, wird var_done auf true gesetzt*/ FETCH aktueller_test INTO var_studentId,var_score; /*Verwenden Sie var_done, um festzustellen, ob der Cursor beendet ist, und beenden Sie die Schleife*/ WENN var_done DANN VERLASSEN Sie select_loop; ENDE, WENN; /*Füge dem var_score-Wert einen zufälligen Wert hinzu, der die angegebene Punktzahl nicht überschreiten kann*/ setze var_score = var_score + LEAST(ROUND(rand()*10,0),max_score); Aktualisiere die Punktzahl der Studenten, setze sie = var_score, wobei studentId = var_studentId; ENDE DER SCHLEIFE; /*Cursor schließen*/ SCHLIESSEN Sie cur_test; /*Rückgabeergebnis: Sie können den erforderlichen Inhalt entsprechend der tatsächlichen Situation zurückgeben*/ RÜCKGABE 1; ENDE $ /*Endzeichen ist auf ; gesetzt*/ TRENNUNGSZEICHEN ; Abfrage OK, 0 Zeilen betroffen Aufrufen einer Funktion MySQL> /* Der Parameter ist 8, was bedeutet, dass die Obergrenze der Bonuspunkte 8 beträgt */ wähle fun_test(8); +-------------+ | Spaßtest(8) | +-------------+ | 1 | +-------------+ 1 Reihe im Set Ergebnisse anzeigen Beim Vergleich des ursprünglichen Punktewerts wird festgestellt, dass der Punktewert mit einem zufälligen Wert addiert wurde, aber den angegebenen Punktewert 8 nicht überschreitet. mysql> wähle * aus Studenten; +-----------+----------+----------+---------+ | Studenten-ID | Studentenname | Punktzahl | Klassen-ID | +-----------+----------+----------+---------+ | 1 | Marke | 105,5 | 1 | | 2 | Helene | 98,5 | 1 | | 3 | lyn | 97 | 1 | | 4 | Sol | 97 | 1 | | 5 | b1 | 89 | 2 | | 6 | b2 | 90 | 2 | | 7 | c1 | 76 | 3 | | 8 | c2 | 73,5 | 3 | | 9 | lala | 73 | 0 | | 10 | EIN | 100 | 3 | | 16 | test1 | 100 | 0 | | 17 | Auslöser2 | 107 | 0 | | 22 | Auslöser1 | 100 | 0 | +-----------+----------+----------+---------+ 13 Reihen im Set Anzeigen des Triggerprotokolls Es gibt 9 Daten, die die Bedingungen erfüllen und deren Punktzahl geändert wurde. Sie wurden alle durch den Auslöser im Protokoll aufgezeichnet. MySQL> /*Im vorherigen Artikel habe ich einen Trigger geschrieben, der die Protokollierung auslöst, wenn die Studententabelle geändert wird*/ Wählen Sie * aus dem Triggerprotokoll; +----+--------------+------------------+-----------------------------------------+ | ID | Auslösezeit | Auslöseereignis | Memo | +----+--------------+------------------+-----------------------------------------+ | 1 | nach | einfügen | Informationen zum neuen Studenten, ID:21 | | 2 | nach | aktualisieren | Studenteninfo aktualisieren, ID:21 | | 3 | nach | aktualisieren | löschen Studenteninfo,ID:21 | | 4 | nach | Update | von:Test2,101.00 bis:Trigger2,106.00 | | 5 | nach | Aktualisierung | von: Trigger2.106,00 bis: Trigger2.107,00 | | 6 | nach | aktualisieren | löschen Studenteninfo,ID:11 | | 7 | nach | Aktualisierung | von:Marke,97,50 auf:Marke,105,50 | | 8 | nach | Aktualisierung | von:helen,96.50 auf:helen,98.50 | | 9 | nach | Aktualisierung | von:lyn,96.00 bis:lyn,97.00 | | 10 | nach | Aktualisierung | von:sol,97.00 bis:sol,97.00 | | 11 | nach | Update | von:b1,81.00 bis:b1,89.00 | | 12 | nach | Aktualisierung | von:b2,82.00 bis:b2,90.00 | | 13 | nach | Aktualisierung | von:c1,71.00 bis:c1,76.00 | | 14 | nach | Aktualisierung | von:c2,72.50 auf:c2,73.50 | | 15 | nach | Aktualisierung | von:A,99.00 bis:A,100.00 | +----+--------------+------------------+-----------------------------------------+ 15 Reihen im Set Cursor-Ausführungsprozess Analysieren Sie anhand des obigen Beispiels den Ausführungsprozess dieses Cursors. Zusammenfassen 1. Der Cursor wird zum Durchlaufen der Abfrageergebnisse verwendet. Oben finden Sie eine detaillierte Analyse von MySQL-Cursorn. Weitere Informationen zu MySQL-Cursorn finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: CSS3 erzielt verschiedene Randeffekte
>>: So aktualisieren Sie v-for in Vue
Ein Bildlink <img src="" /> Ich m...
Vorwort: Lynis ist ein Sicherheitsprüfungs- und H...
Tatsächlich fragen wir uns jeden Tag, wann IE6 wi...
Beim Erstellen einer Website treten immer wieder P...
Vorwort Aus Sicherheitsgründen kann sich der Root...
Heute ist mir plötzlich eingefallen, dass es cool ...
Dies ist die Stilempfehlung der W3C-Organisation f...
Dieser Artikel zeichnet das Installations-Grafik-...
<br />In einem Jahr Bloggen habe ich persönl...
Inhaltsverzeichnis Was ist nodejs Installieren Si...
Das Unternehmen hat kürzlich einen DELL R730-Serv...
Ich habe meiner persönlichen Website vor Kurzem e...
Frage Als ich kürzlich ein praktisches Projekt mi...
Innerhalb der Zeilen können die hellen Rahmenfarb...
Wenn wir in einem Terminal oder einer Konsole arb...