Rumah >pangkalan data >tutorial mysql >Apakah kegunaan kursor mysql?

Apakah kegunaan kursor mysql?

青灯夜游
青灯夜游asal
2022-06-27 11:20:444248semak imbas

Dalam MySQL, kursor berfungsi sebagai penunjuk dan digunakan terutamanya untuk melintasi set keputusan rekod yang dikembalikan dengan menanyakan pangkalan data untuk melaksanakan operasi yang sepadan. Kursor sebenarnya ialah mekanisme yang mengekstrak satu rekod pada satu masa daripada set hasil yang mengandungi berbilang rekod data. Sistem pengurusan pangkalan data relasi pada asasnya berorientasikan set Dalam MySQL, tiada bentuk ungkapan untuk menerangkan satu rekod dalam jadual, melainkan klausa WHERE digunakan untuk mengehadkan hanya satu rekod untuk dipilih, jadi kadangkala kursor mesti digunakan untuk memilih satu rekod pemprosesan data.

Apakah kegunaan kursor mysql?

Persekitaran pengendalian tutorial ini: sistem windows7, versi mysql8, komputer Dell G3.

MySQL Cursor (Kursor)

Kursor sebenarnya ialah kaedah yang boleh mengekstrak satu rekod pada satu masa daripada set hasil yang merangkumi berbilang mekanisme rekod data.

Kursor bertindak sebagai penunjuk.

Walaupun kursor boleh melintasi semua baris dalam hasil carian, ia hanya menghala ke satu baris pada satu masa.

Fungsi kursor adalah untuk melintasi rekod yang dikembalikan dengan menanyakan pangkalan data untuk melaksanakan operasi yang sepadan.

Sistem pengurusan pangkalan data hubungan pada asasnya berorientasikan set Dalam MySQL, tiada ungkapan untuk menerangkan satu rekod dalam jadual, melainkan klausa WHERE digunakan untuk mengehadkan hanya satu rekod untuk dipilih. . Jadi kadangkala kita mesti menggunakan kursor untuk memproses data pada satu rekod.

Secara amnya, kursor digunakan untuk mencari baris tertentu set hasil untuk mengubah suai data.

Penggunaan kursor

1. Isytiharkan kursor: declare 游标名称 CURSOR for table;(Jadual di sini boleh menjadi sebarang koleksi yang anda tanya)

2. Buka kursor yang ditakrifkan: open 游标名称;

3 Dapatkan baris data seterusnya: FETCH  游标名称 into testrangeid,versionid;

4. semak): di sini Ia bergantung pada situasi tertentu

5. Lepaskan kursor: CLOSE 游标名称;

Nota: Setiap ayat prosedur tersimpan mysql mesti diakhiri dengan;, dan medan sementara yang digunakan perlu diisytiharkan sebelum menentukan kursor.

Contoh

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

Contoh 2:

Kami kini akan menggunakan prosedur tersimpan untuk membuat fungsi untuk mengira iPhone Berapakah jumlah inventori dan keluarkan jumlahnya kepada konsol.

--在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 adalah untuk mendapatkan baris data yang dihalakan oleh kursor pada masa ini dan halakan penuding ke baris seterusnya Meneruskan pelaksanaan apabila kursor sudah menghala ke baris terakhir akan menyebabkan limpahan kursor.
Apabila menggunakan kursor gelung, ia tidak akan memantau sama ada ia telah mencapai sekeping data terakhir seperti berikut akan menyebabkan gelung tak terhingga; ralat NOT FOUND pratakrif MySQL kursor akan dicetuskan apabila limpahan berlaku, jadi kod berikut digunakan di atas untuk menentukan acara berterusan apabila ralat tidak ditemui dicetuskan dan untuk mengubah suai nilai pembolehubah yang dilakukan apabila peristiwa ini berlaku.

read_loop:loop  
fetch cur into n,c;  
set total = total+c;  
end loop;

Jadi kod berikut ditambah pada gelung:

declare continue HANDLER for not found set done = true;

Jika nilai selesai adalah benar, tamatkan gelung. Teruskan melaksanakan kod berikut

--判断游标的循环是否结束  if done then  
    leave read_loop;    --跳出游标循环  end if;
Penggunaan

Terdapat tiga cara untuk menggunakan kursor:

Yang pertama ialah pelaksanaan di atas, menggunakan gelung gelung;
  • Cara kedua adalah seperti berikut, menggunakan gelung sementara:
  • Cara ketiga ialah menggunakan pelaksanaan ulangan:
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();

Sarang kursor
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();

Dalam mysql, setiap blok permulaan permulaan ialah kawasan skop bebas Memandangkan peristiwa ralat yang sama dalam MySql hanya boleh ditakrifkan sekali, jika ada adalah berbilang takrifan, ia akan menggesa Pengendali Pendua diisytiharkan dalam blok yang sama semasa penyusunan.

Perkara di atas adalah untuk melaksanakan gelung bersarang Sudah tentu, contoh ini tidak masuk akal. Lihat sahaja.

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();

SQL Dinamik

Mysql menyokong fungsi SQL dinamik

[Cadangan berkaitan:

tutorial video mysql
set @sqlStr='select * from table where condition1 = ?';  
prepare s1 for @sqlStr;  
--如果有多个参数用逗号分隔  execute s1 using @condition1;  
--手工释放,或者是 connection 关闭时, server 自动回收  deallocate prepare s1;
]

Atas ialah kandungan terperinci Apakah kegunaan kursor mysql?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Apakah split-brain dalam MySQL?Artikel seterusnya:Apakah split-brain dalam MySQL?