1、mysql儲存過程建立
通過以下簡單的例子,來簡單學習並建立乙個簡單的儲存過程,從執行結果中可以得到table_name的最大id。
drop procedure if exists proc_name;
delimiter //
create procedure proc_name() -- 建立儲存過程 引數([in|out|inout] 引數 datatype) 本例子不涉及in 和 out 引數
begin
declare maxid int(10) default 0; -- 宣告變數 maxid
select max(id) into maxid from table_name; -- 從表中查詢最大的id 放到變數maxid中
select maxid; -- 輸入maxid的值
end //
delimiter ;
2、游標的使用
我們從t_user表中查詢status為cancel的,刪除所有t_user_history對應的資料
drop procedure if exists proc_del_userhistory;
delimiter //
create procedure proc_del_userhistory() -- 建立儲存過程數
begin
declare userid int(10) default 0; -- 宣告變數 userid
declare userstatus char(10) default ''; -- 宣告變數 userstatus
declare deletestatus char(10) default 'cancel'; -- 宣告要刪除狀態的值
declare stopflag int(1) default 0; -- 迴圈停止標誌,可以不宣告
declare user_cursor cursor for select id,status from t_user; -- 宣告游標user_cursor
set deletestatus = 'cancel'; -- 如果default沒設值,這裡也可以設定哦。
open user_cursor; -- 開啟游標
repeat -- 這裡採用repeat迴圈游標
fetch user_cursor into userid,userstatus ; -- fetch取值 把當前的值放到userid中
if stopflag <> 1 then -- 判斷是否還有資料 防止多迴圈一次
-- 這裡為了學習,把狀態的判斷放到if 語句中,同學們自己寫**時,一定要放到where 語句中哦。。
if userstatus = deletestatus then
delete from t_user_history where user_id = userid;
end if;
end if;
until stopflag=1 end repeat; -- 迴圈結束條件
close user_cursor; -- 關閉游標
end //
delimiter ;
我想經過這個例子,大家一般的儲存過程都可以寫了。接下來,我分享一下自己在儲存過程中遇到的比較難以解決的問題
3、游標迴圈次數多一次
主要是迴圈的時候,條件判斷的問題,可參考上面例子的處理方式(if stopflag <> 1 then -- 判斷是否還有資料 防止多迴圈一次)
4、游標迴圈次數比預期少(針對次數少的情況)
這種情況出現一般出現的迴圈游標中,存在select操作,由於概念不清導致的。參考
部分**:
declare flag boolean;
declare continue handler for not found set flag = false; -- 每次fetch操作,mysql都判斷根據 not found 異常,如果傳送則設定為flag = false
set flag = true;
open cur;
fetch cur into userid;
while flag do
select id into accountid from t_user_account where id = userid; -- 這裡如果沒有取到資料,亦會報not found 異常把 flag 設為false,導致迴圈提前退出
if accountid is not null then
do coding....
end if;
fetch cur into userid;
select fetchok;
end while;
解決方法,再迴圈體內部,保留flag值
declare flag boolean;
declare falg_temp boolean;
declare continue handler for not found set flag = false; -- 每次fetch操作,mysql都判斷根據 not found 異常,如果傳送則設定為flag = false
set flag = true;
open cur;
fetch cur into userid;
while flag do
set flag_temp = flag; -- 設定flag_temp 為當前flag值
select id into accountid from t_user_account where id = userid; -- 這裡如果沒有取到資料,亦會報not found 異常把 flag 設為false,導致迴圈提前退出
if accountid is not null then
do coding....
end if;
set flag = flag_temp; -- 還原flag值
fetch cur into userid;
select fetchok;
end while;
mysql資料庫存過例項
create procedure bb test updatedb begin declare test i int default 0 declare test char varchar 255 default test insertdb while test i 50 do set test c...
MySQL資料庫儲存引擎詳解
儲存引擎是什麼?mysql中的資料用各種不同的技術儲存在檔案 或者記憶體 中。這些技術中的每一種技術都使用不同的儲存機制 索引技巧 鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。例如,如果你在研究大量的臨時資料,你也許需要使...
MySQL資料庫儲存過程詳解
mysql資料庫儲存過程詳解 一 儲存過程 1 概念 儲存過程 stored procedure 是一種在資料庫中儲存複雜程式,以便外部程式呼叫的一種資料庫物件。儲存過程是為了完成特定功能的sql語句集,經編譯建立並儲存在資料庫中,使用者可通過指定儲存過程的名字並給定引數 需要時 來呼叫執行。儲存過...