例項詳解MySql資料庫儲存過程

2021-09-01 09:40:22 字數 3180 閱讀 1253

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語句集,經編譯建立並儲存在資料庫中,使用者可通過指定儲存過程的名字並給定引數 需要時 來呼叫執行。儲存過...