MySQL 5.0以上版本已經(jīng)支持存儲(chǔ)過程。
存儲(chǔ)過程是一個(gè)可編程的函數(shù),在數(shù)據(jù)庫(kù)中創(chuàng)建并保存。它有SQL語(yǔ)句和一些特殊的控制結(jié)構(gòu)組成。
MySQL存儲(chǔ)過程的創(chuàng)建和調(diào)用
語(yǔ)法格式:
CREATE PROCEDURE 過程名([[IN|OUT|INOUT] 參數(shù)名 數(shù)據(jù)類型[,[IN|OUT|INOUT] 參數(shù)名 數(shù)據(jù)類型…]]) [特性 …] 過程體
DELIMITER //
CREATE PROCEDURE my_pro(OUT s int)
BEGIN
SELECT COUNT(*) INTO s FROM demo;
END //
DELIMITER ;
MySQL默認(rèn)以";"為分隔符,如果沒有聲明分割符,則編譯器會(huì)把存儲(chǔ)過程當(dāng)成SQL語(yǔ)句進(jìn)行處理,因此編譯過程會(huì)報(bào)錯(cuò),所以要事先用“DELIMITER //”聲明當(dāng)前段分隔符,讓編譯器把兩個(gè)"http://"之間的內(nèi)容當(dāng)做存儲(chǔ)過程的代碼,不會(huì)執(zhí)行這些代碼;“DELIMITER ;”的意思是把分隔符還原。除了\符號(hào)外,任何字符都可以用于語(yǔ)句分隔符。記得在使用新的符號(hào)作為結(jié)束分隔符后,要記得還原。
存儲(chǔ)過程根據(jù)需要可能會(huì)有輸入、輸出、輸入輸出參數(shù),如果有多個(gè)參數(shù)用","分割開。MySQL存儲(chǔ)過程的參數(shù)用在存儲(chǔ)過程的定義,共有三種:IN,OUT,INOUT。
IN 輸入?yún)?shù)
表示該參數(shù)的值必須在調(diào)用存儲(chǔ)過程時(shí)指定,在存儲(chǔ)過程中修改該參數(shù)的值不能被返回,為默認(rèn)值
OUT 輸出參數(shù)
該值可在存儲(chǔ)過程內(nèi)部被改變,并可返回
INOUT 輸入輸出參數(shù)
調(diào)用時(shí)指定,并且可被改變和返回
存儲(chǔ)過程過程體的開始與結(jié)束使用BEGIN與END進(jìn)行標(biāo)識(shí)。
執(zhí)行存儲(chǔ)過程(調(diào)用)
Call關(guān)鍵字:Call接受存儲(chǔ)過程的名字以及需要傳遞給他的任意參數(shù)。存儲(chǔ)過程可以顯示結(jié)果,也可以不顯示結(jié)果。
以下是MySQL實(shí)例使用各種類型的語(yǔ)句說明存儲(chǔ)過程的使用。
1、條件語(yǔ)句if-then-else
delimiter // //解釋使用新的符號(hào)//作為結(jié)束分隔符
DROP PROCEDURE IF EXISTS discounted_price;
CREATE PROCEDURE discounted_price
(
IN normal_price NUMERIC(8,2),
OUT discounted_price NUMERIC(8,2)
)
BEGIN
IF (normal_price > 500) and (normal_price < 1000) THEN
SET discounted_price = normal_price * .8;
ELSEIF (normal_price >=1000) THEN
SET discounted_price = normal_price * .9;
ELSE
SET discounted_price = normal_price;
END IF;
END// // 結(jié)束用新的分隔符
delimiter ; //重新還原默認(rèn)的分號(hào)分隔符
調(diào)用存儲(chǔ)過程
CALL discounted_price(800,@disprice);
SELECT @disprice;
2、case語(yǔ)句
delimiter //
create procedure pro_insert(in param int)
begin
case param
when 0 then
insert into student3(studentname) VALUES('利玉3');
when 1 then
insert into student3(studentname) VALUES('利玉4');
else
insert into student3(studentname) VALUES('default');
end case;
end//
delimiter;
調(diào)用存儲(chǔ)過程
call pro_insert(2);
3、循環(huán)語(yǔ)句while-end while
delimiter //
create procedure pro_insert2(in param int)
begin
while param<10 do
insert into student3(studentname) VALUES('小豬');
set param=param+1;
end while;
end//
delimiter;
調(diào)用存儲(chǔ)過程
call pro_insert2(6);
delimiter //
CREATE PROCEDURE simple_while(out counter int)
BEGIN
SET counter = 0;
while counter != 10 DO
set counter = counter + 1;
end while;
END//
delimiter;
調(diào)用存儲(chǔ)過程
CALL simple_while(@counter);
SELECT @counter;
4、repeat...end repeat
它在執(zhí)行操作后檢查結(jié)果,而while則是執(zhí)行前進(jìn)行檢查。相當(dāng)于do...while
until表示滿足后邊的條件才繼續(xù)循環(huán)
delimiter //
create procedure pro_insert3(in param int)
begin
repeat
insert into student3(studentname) VALUES('demo');
set param=param+1;
until param>10
end repeat;
end//
delimiter;
調(diào)用存儲(chǔ)過程
call pro_insert3(8);
5、loop...end loop語(yǔ)句
delimiter//
CREATE PROCEDURE simple_loop(OUT counter INT)
BEGIN
SET counter = 0;
my_simple_loop:LOOP
SET counter = counter +1;
if counter = 10 THEN
LEAVE my_simple_loop;
end if;
end LOOP my_simple_loop;
END //
delimiter;
調(diào)用存儲(chǔ)過程
CALL simple_loop(@counter);
SELECT @counter;
檢查存儲(chǔ)過程相關(guān)語(yǔ)句:
刪除存儲(chǔ)過程
DROP PROCEDURE 存儲(chǔ)過程名稱;
輸出創(chuàng)建存儲(chǔ)過程的語(yǔ)句
SHOW CREATE PROCEDURE 存儲(chǔ)過程名稱;
獲取存儲(chǔ)過程的詳細(xì)信息,包括何時(shí),由誰創(chuàng)建等信息,輸出的為數(shù)據(jù)庫(kù)中所有的存儲(chǔ)過程
SHOW PROCEDURE STATUS;
關(guān)鍵字LIKE限制過程輸出,輸出指定的存儲(chǔ)過程
SHOW PROCEDURE STATUS LIKE ‘ 存儲(chǔ)過程名稱’;