Heim > Datenbank > MySQL-Tutorial > Hauptteil

Wozu dient der MySQL-Cursor?

青灯夜游
Freigeben: 2022-06-27 11:20:44
Original
4209 Leute haben es durchsucht

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.

Wozu dient der MySQL-Cursor?

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 游标名称;

2 : 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 ab

5. 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.

Beispiel

-  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  -
Nach dem Login kopieren

Beispiel 2:

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();
Nach dem Login kopieren

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;
Nach dem Login kopieren
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;
Nach dem Login kopieren
Also wird der Schleife der folgende Code hinzugefügt:

--判断游标的循环是否结束  if done then  
    leave read_loop;    --跳出游标循环  end if;
Nach dem Login kopieren
Wenn der Wert von done wahr ist, wird die Schleife beendet. Führen Sie den folgenden Code weiter aus
  • Verwendung

    Es gibt drei Möglichkeiten, Cursor zu verwenden:
  • Die erste ist die obige Implementierung unter Verwendung der Schleifenschleife;

Die zweite Möglichkeit ist wie folgt unter Verwendung der while-Schleife :

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();
Nach dem Login kopieren
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();
Nach dem Login kopieren

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();
Nach dem Login kopieren
Das Obige dient der Implementierung einer verschachtelten Schleife. Natürlich ist dieses Beispiel weit hergeholt. Mal schauen.

Dynamisches SQL

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;
Nach dem Login kopieren
🎜[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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage