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 ;