【數(shù)據(jù)庫】存儲過程(procedure)

存儲過程(procedure)

概念

存儲過程是數(shù)據(jù)庫中的一個對象
存儲在服務(wù)端
用來封裝多條SQL語句帶有邏輯性
可以實(shí)現(xiàn)一個功能
由于它在創(chuàng)建時,就已經(jīng)對SQL進(jìn)行了編譯
所以執(zhí)行效率高,而且可以重復(fù)調(diào)用
類似于Java中的方法

語法:

DELIMITER $$
CREATE
    PROCEDURE `數(shù)據(jù)庫名`.`存儲過程名`(參數(shù))
  
    BEGIN
        -- 存儲過程 代碼塊
    END$$

DELIMITER ;

在這里本人對上述的語法進(jìn)行下解釋:
解釋

  • 創(chuàng)建存儲過程需要管理員 分配權(quán)限
  • delimiter是mysql定義的存儲過程的結(jié)束標(biāo)記
    (在mysql客戶端結(jié)束標(biāo)記默認(rèn)是分號)
  • $$ 表示 mysql語句結(jié)束
    過程結(jié)束后肯定會有一句,表示恢復(fù)成默認(rèn)的

參數(shù)

  • 格式:
參數(shù)使用種類 參數(shù)名稱 參數(shù)類型
  • 參數(shù)使用種類
  1. in —— 輸入參數(shù)
  2. out —— 輸出參數(shù)
  3. inout —— 輸入輸出參數(shù)
  • 注意:out與inout種類的參數(shù),在最后設(shè)置值時,要用如下格式:
    數(shù)值 into 參數(shù)名

例如:

DELIMITER $$

CREATE
    PROCEDURE `performance_schema`.`myTestPro`(IN num INT,OUT r INT)
    BEGIN
    DELETE FROM emp WHERE empno=num;
    SELECT COUNT(*) FROM emp INTO r;
    END$$

DELIMITER ;

調(diào)用存儲過程 call:

語法

call 存儲過程名稱(參數(shù))

參數(shù)

  1. 直接將數(shù)值作為參數(shù)
  2. 通過變量來設(shè)置參數(shù):
    @變量名稱

查詢變量的值

select @變量名

例如:

-- 調(diào)用存儲過程
call myTestPro(9527,@rr);
--查詢變量rr的值
select @rr

刪除存儲過程 drop:

語法

drop procedure 存儲過程名;

例如:

drop procedure myPro;

查看存儲過程 show:

語法

-- 查看 所有的存儲過程狀態(tài)
show procedure status\G;
-- 查看 創(chuàng)建存儲過程的語句
show create procedure 存儲過程名字\G;

帶有IF邏輯的存儲過程 if then:

語法

IF 條件1 THEN
    所執(zhí)行的代碼塊1;
ELSEIF 條件2 THEN     --注意elseif 是連在一起的
    所執(zhí)行的代碼塊2;           
ELSE
    所執(zhí)行的代碼塊3;
END IF;             -- 注意要結(jié)束 if 的后面有分號

例如:

DELIMITER $$
CREATE PROCEDURE pro_testIf(IN num INT,OUT str VARCHAR(20))
BEGIN
    IF num=1 THEN
        SET str='星期一';
    ELSEIF num=2 THEN
        SET str='星期二';
    ELSEIF num=3 THEN
        SET str='星期三';             -- 注意要用分號結(jié)束
    ELSEIF num=4 THEN
        SET str='星期四';
    ELSEIF num=5 THEN
        SET str='星期五';
    ELSEIF num=6 THEN
        SET str='星期六';
    ELSEIF num=7 THEN
        SET str='星期日';
    ELSE
        SET str='輸入錯誤';
    END IF;
END$$

DELIMITER ;

帶有循環(huán)的存儲過程 while do:

語法

WHILE 條件 DO
    代碼塊;
END WHILE;  -- 要記得結(jié)束循環(huán)

例如:

DELIMITER $
CREATE PROCEDURE pro_testWhile(IN num INT,OUT result INT)
BEGIN
    -- 定義一個局部變量
    DECLARE i INT DEFAULT 1;
    DECLARE vsum INT DEFAULT 0;
    WHILE i<=num DO
          SET vsum = vsum+i;
          SET i=i+1;
    END WHILE;  -- 要記得結(jié)束循環(huán)
    SET result=vsum;
END$$

DELIMITER ;

其他循環(huán)

REPEAT 循環(huán):

語法

REPEAT
    要循環(huán)的代碼塊;
UNTIL 終止條件
END REPEAT;

例如:

DELIMITER $$
CREATE PROCEDURE proRepeat(OUT outnum INT)
BEGIN
    DECLARE i INT DEFAULT 0;
    REPEAT
        SET i=i+1;
    UNTIL i>=5  -- 注意這里不要加分號,不然語法報錯 UNTIL 結(jié)束條件
    END REPEAT; -- 記著結(jié)束
    SET outnum=i;
END$$
DELIMITER ;

loop 循環(huán):

語法

循環(huán)的名稱:LOOP
    循環(huán)的代碼塊;
    IF 條件1 THEN
        LEAVE 循環(huán)的名稱;  -- 中斷循環(huán)
    END IF;
    IF 條件2 THEN
        ITERATE 循環(huán)的名稱;  -- 跳過本次循環(huán),執(zhí)行下一次循環(huán)
    END IF;
END LOOP;

本人對上面的兩個關(guān)鍵字做下解釋:
解釋

  • leave 相當(dāng)于java中的 break
  • iterate相當(dāng)于java中的continue

例如:

DELIMITER $$
CREATE PROCEDURE proRepeat(OUT outnum INT)
BEGIN
    DECLARE i INT DEFAULT 0;
    myloop:LOOP    -- 這里的myloop 是我給循環(huán)起的一個標(biāo)號或者說名字,這是語法要求,不起就會報錯
        SET i=i+1;
        IF i>=5 THEN
            LEAVE myloop;  -- 根據(jù)我的循環(huán)標(biāo)號中斷循環(huán) leave 是中斷循環(huán)的意思
        END IF;
    END LOOP;
    SET outnum=i;
END$$
DELIMITER ;

變量:

  1. 全局變量

全局變量(內(nèi)置變量):可以在多個會話中去訪問它

那么,對于全局變量,有很多語句和方法可以去查看或更改:
常用語句

  • show variables;
    查看所有全局變量
  • select @@變量名;
    查看某個全局變量
  • set 變量名=新值;
    修改全局變量
  1. 會話變量

只存在于 當(dāng)前客戶端 與 數(shù)據(jù)庫服務(wù)器端一次連接當(dāng)中
如果連接斷開,那么會話變量全部丟失

常用語句

  • set @變量名=值
    定義會話變量
  • select @變量名
    查看會話變量
  1. 局部變量

在存儲過程中使用的變量就叫局部變量。
只要存儲過程執(zhí)行完畢,局部變量就丟失!!

常用語句:

  • DECLARE 變量名 變量類型 DEFAULT 變量值;
    定義局部變量
  • set 變量名=變量值;
    給變量設(shè)置值

那么,本篇博文的知識點(diǎn)在這里就講解完畢了。
(請觀看本人博文 —— 《數(shù)據(jù)庫 —— 專欄總集篇》)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容