本文內容:
- 什麼是遊標
- 建立遊標
- 使用遊標
首發日期:2018-04-18mysql
什麼是遊標:
- 若是你前面看過mysql函數,會發現沒法使用返回多行結果的語句。但若是你又確實想要使用時,就須要使用到遊標,遊標能夠幫你選擇出某個結果(這樣就能夠作到返回單個結果)。
- 另外,使用遊標也能夠輕易的取出在檢索出來的行中前進或後退一行或多行的結果。
- 遊標能夠遍歷返回的多行結果。
補充:
- Mysql中游標只適用於存儲過程以及函數。
建立遊標:
- 語法:
- 1.定義遊標:declare 遊標名 cursor for select語句;
- 2.打開遊標:open 遊標名;
- 獲取結果:fetch 遊標名 into 變量名[,變量名];
- 關閉遊標:close 遊標名;
create procedure p1() begin declare id int; declare name varchar(15); -- 聲明遊標 declare mc cursor for select * from class; -- 打開遊標 open mc; -- 獲取結果 fetch mc into id,name; -- 這裏是爲了顯示獲取結果 select id,name; -- 關閉遊標 close mc; end;
create procedure p2() begin declare id int; declare name varchar(15); -- 聲明遊標 declare mc cursor for select * from class; -- 打開遊標 open mc; -- 獲取結果 loop -- 循環,將表的內容都轉移到class2中 fetch mc into id,name; -- 這裏是爲了顯示獲取結果 insert into class2 values(id,name); -- 關閉遊標 end loop; close mc; end;
使用遊標:
- 遊標每一次fetch都是獲取一行結果,能夠使用變量來獲取fetch到的每一列的值
create procedure p2() begin declare id int; declare name varchar(15); -- 聲明遊標 declare mc cursor for select * from class; -- 打開遊標 open mc; -- 獲取結果 loop -- 循環,將表的內容都轉移到class2中 fetch mc into id,name; -- 這裏是爲了顯示獲取結果 insert into class2 values(id,name); -- 關閉遊標 end loop; close mc; end;
上面的代碼會有一個報錯,不斷循環的話,始終會達到表的末尾,到了末尾就沒法繼續fetch,通常來講都要避免報錯,到了末尾前會有一個mysql定義的sql
create procedure p3() begin declare id int; declare name varchar(15); declare flag int default 0; -- 聲明遊標 declare mc cursor for select * from class; declare continue handler for not found set flag = 1; -- 打開遊標 open mc; -- 獲取結果 l2:loop fetch mc into id,name; if flag=1 then -- 當沒法fetch會觸發handler continue leave l2; end if; -- 這裏是爲了顯示獲取結果 insert into class2 values(id,name); -- 關閉遊標 end loop; close mc; end; call p3();-- 不報錯 select * from class2;