MySQL_存儲過程PROCEDURE _筆記

存儲過程(Stored Procedure)是一種在數據庫中存儲複雜程序,以便外部程序調用的一種數據庫對象。

存儲過程是爲了完成特定功能的SQL語句集,經編譯創建並保存在數據庫中,用戶可通過指定存儲過程的名字並給定參數(需要時)來調用執行。

存儲過程思想上很簡單,就是數據庫 SQL 語言層面的代碼封裝與重用。

 

創建存儲過程語法:

delimiter $$
create procedure 過程名稱(參數列表 IN | OUT | INOUT)
begin
    SQL語句
end $$
delimiter $$

中間SQL語句一般會加入循環和判斷的方式來組成一個過程。

查看所有存儲過程

show procedure status \G;

查看指定存儲過程創建過程

show create procedure proc_name \G;

刪除存儲過程

DROP PROCEDURE proc_name;

正常一般都是通過工具直接查看吧,有一點是存儲過程、函數、視圖都是和表一樣,創建於當前庫的,應該也沒人會跑到另一個庫建吧。。

 

調用:

call 存儲過程名(參數)

 

先不用參數,做個簡單的實驗。

創建一張t1表

create table t1(id int,md5 vachar(50));

再創建一個存儲過程,只要調用這個過程就往t1表內插入20條數據。

\d $$
create procedure insert_t1()
BEGIN
    declare i int default 1;
    while(i<=20)do
        insert into t1 values(i,md5(i));
        set i=i+1;
    end while;
END$$
\d ;

declare:定義變量,i爲整數默認值爲1,只在這段BEGIN..END中生效

接下來while循環,在mysql中這一行中間不能有空格不然會語法錯誤

 

然後調用這個過程看看

call insert_t1();

 

 

接下來是存儲過程的參數,可以是IN,OUT,INOUT類型,函數的類型只能是IN。

存儲過程的參數形式:【IN | OUT | INOUT】參數名 數據類型

IN 輸入參數

OUT 輸出參數

INOUT 輸入輸出參數

 

還是用上面那張表,因爲第一個過程裏的數值寫死了,而正常一段程序裏很少會是寫死的,用起來很不方便,這樣就可以那個數值20改爲參數,通過參數傳參進去。

\d $$
create procedure insert_t2(IN a int)
BEGIN
    declare i int default 1;
    while(i<=a)do
        insert into t1 values(i,md5(i));
        set i=i+1;
    end while;
END$$
\d ;

調用這個過程的時候就必須使用它的參數了,不然會報錯

 

正確調用方式,定義的參數類型爲整數型,

call insert_t2(10);

 

 

在看看參數OUT

這個是輸出,還是用t1表實現

\d $$
create procedure insert_t3(OUT total int)
BEGIN
    select count(*) INTO total from t1;
END$$
\d ;

先看中間的語句,查詢t1表計數並把這個數值賦值給total這個變量裏,通過參數OUT傳參出來。

 

如上圖,@a本身是沒有值的,順帶一提這裏可以通過set @a= 賦予它當前會話變量

當然這裏沒有用到,這裏是調用剛創建的存儲過程來賦予它變量

CALL insert_t3(@a);

 

一般傳參出來的變量肯定是要給別的地方調用的。

 

兩個一起使用,下面有這樣一張表

 

創建一個存儲過程調用就可以得到某個部門的薪水總和並賦予@b。

\d $$
create procedure staff_num1(IN a1 varchar(20),OUT a2 int)
BEGIN
    select sum(salary) INTO a2 from staff where post=a1;
END$$
\d ;

 

 

最後是INOUT參數,直接建個過程示例

\d $$
create procedure test_inout(INOUT b1 int)
BEGIN
    if(b1 is not null)then
        set b1=b1+1;
    else
        select 10 into b1;
    end if;
END$$
\d ;

 

本身@c是空值,所以調用了上面的過程把@C傳參進去經過if判斷給它賦值了爲10,

當再次調用該存儲過程後則會滿足if判斷的另一個條件,自加1

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章