In MySQL fungieren Cursor als Zeiger und werden hauptsächlich zum Durchlaufen der Datensatzergebnismenge verwendet, die durch Abfragen der Datenbank zurückgegeben wird, um entsprechende Vorgänge auszuführen. Ein Cursor ist eigentlich ein Mechanismus, der jeweils einen Datensatz aus einer Ergebnismenge extrahiert, die mehrere Datensätze enthält. Das relationale Datenbankverwaltungssystem ist im Wesentlichen satzorientiert. In MySQL gibt es keine Ausdrucksform zur Beschreibung eines einzelnen Datensatzes in der Tabelle, es sei denn, die WHERE-Klausel wird verwendet, um die Auswahl nur eines Datensatzes zu beschränken um einen einzelnen Datensatz auszuwählen.
Die Betriebsumgebung dieses Tutorials: Windows7-System, MySQL8-Version, Dell G3-Computer.
MySQL-Cursor (Cursor)
Ein Cursor ist eigentlich ein Mechanismus, der jeweils einen Datensatz aus einem Ergebnissatz extrahieren kann, der mehrere Datensätze enthält.
Der Cursor fungiert als Zeiger.
Obwohl der Cursor alle Zeilen im Ergebnis durchlaufen kann, zeigt er jeweils nur auf eine Zeile.
Die Funktion des Cursors besteht darin, die durch Abfragen der Datenbank zurückgegebenen Datensätze zu durchlaufen, um entsprechende Vorgänge auszuführen.
Das relationale Datenbankverwaltungssystem ist im Wesentlichen satzorientiert. In MySQL gibt es keine Ausdrucksform zur Beschreibung eines einzelnen Datensatzes in der Tabelle, es sei denn, eine WHERE-Klausel wird verwendet, um die Auswahl nur eines Datensatzes zu beschränken. Daher müssen wir manchmal Cursor verwenden, um Daten in einem einzelnen Datensatz zu verarbeiten.
Im Allgemeinen wird der Cursor verwendet, um eine bestimmte Zeile des Ergebnissatzes zu finden und die Daten zu ändern.
Verwendung des Cursors
1. Deklarieren Sie einen Cursor: deklarieren Sie den Cursornamen CURSOR für die Tabelle;
(die Tabelle hier kann jede Sammlung sein, die Sie abfragen)declare 游标名称 CURSOR for table;
(这里的table可以是你查询出来的任意集合)
2、打开定义的游标:open 游标名称;
3、获得下一行数据:FETCH 游标名称 into testrangeid,versionid;
4、需要执行的语句(增删改查):这里视具体情况而定
5、释放游标:CLOSE 游标名称;
open Cursor Name;
3. Holen Sie sich die nächste Datenzeile: FETCH Cursor Name into testrangeid,versionid;
Anweisungen, die ausgeführt werden müssen (add , löschen, ändern, prüfen) ): Dies hängt von der jeweiligen Situation ab5. Lassen Sie den Cursor los: Cursorname schließen;
Hinweis: Jeder Satz der gespeicherten MySQL-Prozedur muss mit beendet werden; , und die verwendeten temporären Felder müssen verwendet werden, bevor der Cursor definiert wird.
- BEGIN --定义变量 declare testrangeid BIGINT; declare versionid BIGINT; declare done int; --创建游标,并存储数据 declare cur_test CURSOR for select id as testrangeid,version_id as versionid from tp_testrange; --游标中的内容执行完后将done设置为1 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; --打开游标 open cur_test; --执行循环 posLoop:LOOP --判断是否结束循环 IF done=1 THEN LEAVE posLoop; END IF; --取游标中的值 FETCH cur_test into testrangeid,versionid; --执行更新操作 update tp_data_execute set version_id=versionid where testrange_id = testrangeid; END LOOP posLoop; --释放游标 CLOSE cur_test; END -
Wir werden nun eine gespeicherte Prozedur verwenden, um eine Funktion zu erstellen, die den Gesamtbestand an iPhones zählt und die Gesamtsumme an die Konsole ausgibt.
--在windows系统中写存储过程时,如果需要使用declare声明变量,需要添加这个关键字,否则会报错。 delimiter // drop procedure if exists StatisticStore; CREATE PROCEDURE StatisticStore() BEGIN --创建接收游标数据的变量 declare c int; declare n varchar(20); --创建总数变量 declare total int default 0; --创建结束标志变量 declare done int default false; --创建游标 declare cur cursor for select name,count from store where name = 'iphone'; --指定游标循环结束时的返回值 declare continue HANDLER for not found set done = true; --设置初始值 set total = 0; --打开游标 open cur; --开始循环游标里的数据 read_loop:loop --根据游标当前指向的一条数据 fetch cur into n,c; --判断游标的循环是否结束 if done then leave read_loop; --跳出游标循环 end if; --获取一条数据时,将count值进行累加操作,这里可以做任意你想做的操作, set total = total + c; --结束游标循环 end loop; --关闭游标 close cur; --输出结果 select total; END; --调用存储过程 call StatisticStore();
fetch dient dazu, die Datenzeile abzurufen, auf die der Cursor aktuell zeigt, und den Zeiger auf die nächste Zeile zu verweisen. Wenn der Cursor bereits auf die letzte Zeile zeigt, führt dies zu einem Überlauf des Cursors.
Bei Verwendung eines Schleifencursors wird nicht überwacht, ob das letzte Datenelement erreicht wurde. Das Schreiben des Codes wie folgt führt zu einer Endlosschleife.read_loop:loop fetch cur into n,c; set total = total+c; end loop;Wenn der Cursor in MySql überläuft, wird die MySQL-Voreinstellung ausgelöst NOT FOUND-Fehler, daher wird der folgende Code oben verwendet, um ein Fortsetzungsereignis anzugeben, wenn ein „Nicht gefunden“-Fehler ausgelöst wird, und um den Wert der Done-Variablen zu ändern, wenn dieses Ereignis auftritt.
declare continue HANDLER for not found set done = true;Also wird der Schleife der folgende Code hinzugefügt:
--判断游标的循环是否结束 if done then leave read_loop; --跳出游标循环 end if;Wenn der Wert von done wahr ist, wird die Schleife beendet. Führen Sie den folgenden Code weiter aus
drop procedure if exists StatisticStore1; CREATE PROCEDURE StatisticStore1() BEGIN declare c int; declare n varchar(20); declare total int default 0; declare done int default false; declare cur cursor for select name,count from store where name = 'iphone'; declare continue HANDLER for not found set done = true; set total = 0; open cur; fetch cur into n,c; while(not done) do set total = total + c; fetch cur into n,c; end while; close cur; select total; END; call StatisticStore1();Der dritte Weg ist die wiederholte Ausführung:
drop procedure if exists StatisticStore2; CREATE PROCEDURE StatisticStore2() BEGIN declare c int; declare n varchar(20); declare total int default 0; declare done int default false; declare cur cursor for select name,count from store where name = 'iphone'; declare continue HANDLER for not found set done = true; set total = 0; open cur; repeat fetch cur into n,c; if not done then set total = total + c; end if; until done end repeat; close cur; select total; END; call StatisticStore2();
Cursor-Verschachtelung
In MySQL ist jeder Anfangs-End-Block ein unabhängiger Bereichsbereich, da dasselbe Fehlerereignis in MySQL nur einmal definiert werden kann. Wenn mehrere Definitionen vorhanden sind, werden Sie während der Kompilierung aufgefordert, den im selben Block deklarierten Handler zu duplizieren.
drop procedure if exists StatisticStore3; CREATE PROCEDURE StatisticStore3() BEGIN declare _n varchar(20); declare done int default false; declare cur cursor for select name from store group by name; declare continue HANDLER for not found set done = true; open cur; read_loop:loop fetch cur into _n; if done then leave read_loop; end if; begin declare c int; declare n varchar(20); declare total int default 0; declare done int default false; declare cur cursor for select name,count from store where name = 'iphone'; declare continue HANDLER for not found set done = true; set total = 0; open cur; iphone_loop:loop fetch cur into n,c; if done then leave iphone_loop; end if; set total = total + c; end loop; close cur; select _n,n,total; end; begin declare c int; declare n varchar(20); declare total int default 0; declare done int default false; declare cur cursor for select name,count from store where name = 'android'; declare continue HANDLER for not found set done = true; set total = 0; open cur; android_loop:loop fetch cur into n,c; if done then leave android_loop; end if; set total = total + c; end loop; close cur; select _n,n,total; end; begin end; end loop; close cur; END; call StatisticStore3();Das Obige dient der Implementierung einer verschachtelten Schleife. Natürlich ist dieses Beispiel weit hergeholt. Mal schauen. MySQL unterstützt die Funktion von dynamischem SQL🎜
set @sqlStr='select * from table where condition1 = ?'; prepare s1 for @sqlStr; --如果有多个参数用逗号分隔 execute s1 using @condition1; --手工释放,或者是 connection 关闭时, server 自动回收 deallocate prepare s1;🎜[Verwandte Empfehlungen: 🎜MySQL-Video-Tutorial🎜]🎜
Das obige ist der detaillierte Inhalt vonWozu dient der MySQL-Cursor?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!