遊標主要用於交互式應用,滾動屏幕上的數據,並對數據進行瀏覽或作出更改fetch
看一下下面的例子:spa
drop procedure IF EXISTS processorders; create procedure processorders( out ordernum int ) begin select order_num from orders into ordernum; end; call processorders(@ordernum); select ordernum;
輸出:code
因爲結果爲多行沒法顯示,這時咱們就須要使用遊標來操做blog
(1)建立遊標class
create procedure processorders() begin declare ordernums cursor for select order_num from orders; end;
(2)打開遊標select
open ordernums;
(3)關閉遊標循環
close ordernums;
在一個遊標關閉後,若是沒有從新打開,則不能使用它。sso
使用申明過的遊標不須要再次聲明,用open語句打開它就能夠了。方法
drop procedure IF EXISTS processorders; create procedure processorders( out numbers int, out custid int ) begin #聲明遊標 declare ordernums cursor for select order_num,cust_id from orders; #打開遊標 open ordernums; #用來檢索當前行的order_num(自動從第一行開始) fetch ordernums into numbers, custid; #關閉遊標 close ordernums; end; call processorders(@numbers,@custid); select @numbers,@custid;
會看到只輸出了第一行的order_num和cust_id:im
繼續,接下來將循環檢索數據,從第一行到最後一行:
drop procedure IF EXISTS processorders; create procedure processorders( out numbers int, out custid int ) begin declare done boolean default 0; #聲明遊標 declare ordernums cursor for select order_num,cust_id from orders; #聲明CONTINUE HANDLER declare CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; #打開遊標 open ordernums; #開始循環 REPEAT #用來檢索當前行的order_num(自動從第一行開始) fetch ordernums into numbers, custid; #.....這裏能夠對每次檢索出來的數據進行處理 #結束循環 UNTIL done END REPEAT; #關閉遊標 close ordernums; end; call processorders(@numbers,@custid); select @numbers,@custid;
咱們會看出輸出最後一行的order_num和cust_id
這樣就實現了數據的循環檢索,咱們能夠在 (#.....這裏能夠對每次檢索出來的數據進行處理)註釋處對每次檢索出來的數據進行處理
注意:上面咱們定義了一個COUNtINUE HANDLEr,它是在條件出現時執行的代碼,它指出SQLSTATE '02000'出現時set done = 1,最開始SQLSTATE '02000'是一個未找到的條件,只有當repeat沒有更多的行供循環時纔會出現SQLSTATE '02000'