1. 程式人生 > >mysql儲存過程中使用遊標

mysql儲存過程中使用遊標

使用者變數一般以@開頭,作用於全域性範圍

區域性變數需用 declare 定義格式為 declare 變數名 資料型別 [default value];

mysql 資料型別有 int ,float,date,varchar(length)等

宣告的順序必須是 先宣告變數,再宣告遊標、最後宣告handler。

同一個儲存過程中,一個遊標的使用和兩個遊標的使用是一樣的。

呼叫儲存過程 call sp_name();

查詢某資料庫中全部儲存過程 :

select name from mysql.proc where db='資料庫名';

select routine_name from information_schema.routines where routine_schema='資料庫名';

show procedure status where db='資料庫名';

檢視單個儲存過程: show create procedure 資料庫.儲存過程名;

刪除儲存過程 :drop procedure 儲存過程名

儲存過程建立語句:

delimiter $$                                                          -- 定義語句結束標誌為 $$, 預設結束標誌是;

drop procedure if exists test.sp_example$$           -- 建立儲存過程關鍵字  

create procedure test.sp_example()                     -- 建立儲存過程具體內容:

begin                                                                     -- 儲存過程內容以begin開始,end 結束。

declare _inner_code int;                                       --  宣告 區域性變數 及變數型別

declare _writedate date;

declare _done int default 1;                                  -- 宣告 區域性變數 、變數型別  及 變數預設值

declare c_cursor cursor for select inner_code,writedate from test.example group by inner_code,writedate;

                                                                             -- 宣告遊標名、遊標所儲存資料

-- 此處可繼續申明第二個遊標 : declare a_cursor cursor for select  ... from ...;

declare continue handle for not found set _done=0; --  當出現 not found 的錯誤時 continue 並將變數_done的值設定為0

start transaction;

open c_cursor;                                                     -- 開啟遊標

fetch c_cursor into _inner_code,_writedate;            

-- 獲取當前遊標指向的資料行賦值給變數_inner_code,_writedate,並將遊標指向下一行

while _done do 

功能語句塊

 fetch c_cursor into _inner_code,_writedate;

/* 獲取當前遊標指向的資料行賦值給變數_inner_code,_writedate,並將遊標指向下一行,當遊標已經指向最後一行時會造成遊標溢位. mysql 中游標溢位時會引發mysql預定義的not found 錯誤,在上面定義了一個continue屬性的操作handle,當出現not found 錯誤時 繼續,並修改_done變數的值為0,使迴圈結束*/

end while ;

close c_cursor ;                                                  --  關閉遊標

end $$

delimiter ;                                                           -- 將結束標誌定義回;

遊標巢狀

在mysql中同一個error事件只能定義一次,如果多定義的話在編譯時會提示 duplicate handler declared in the same block.

每個begin end 塊都是一個獨立的scope 區域,巢狀的遊標可用begin end 包裹。

drop procedure if exists nest_use;

create procedure nest_use()

begin 

declare _n varchar(20);

declare done int default false;

declare cur cursor for select age from store group by age;

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 =tatal + 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;  

end loop;

close cur;

end ;