存儲過程(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ù)使用種類:
- in —— 輸入參數(shù)
- out —— 輸出參數(shù)
- 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ù):
- 直接將數(shù)值作為參數(shù)
- 通過變量來設(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 ;
變量:
- 全局變量:
全局變量(內(nèi)置變量):可以在多個會話中去訪問它
那么,對于全局變量,有很多語句和方法可以去查看或更改:
常用語句:
- show variables;
查看所有全局變量- select @@變量名;
查看某個全局變量- set 變量名=新值;
修改全局變量
- 會話變量:
只存在于 當(dāng)前客戶端 與 數(shù)據(jù)庫服務(wù)器端 的 一次連接當(dāng)中
如果連接斷開,那么會話變量全部丟失!
常用語句:
- set @變量名=值
定義會話變量- select @變量名
查看會話變量
- 局部變量:
在存儲過程中使用的變量就叫局部變量。
只要存儲過程執(zhí)行完畢,局部變量就丟失!!
常用語句:
- DECLARE 變量名 變量類型 DEFAULT 變量值;
定義局部變量- set 變量名=變量值;
給變量設(shè)置值
那么,本篇博文的知識點(diǎn)在這里就講解完畢了。
(請觀看本人博文 —— 《數(shù)據(jù)庫 —— 專欄總集篇》)