MySQL 存儲(chǔ)過程

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ǔ)過程名稱’;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容