存儲過程(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