一、存儲過程介紹
存儲過程是事先經(jīng)過編譯并存儲在數(shù)據(jù)庫中的一段SQL 語句的集合,調(diào)用存儲過程可以簡化應(yīng)用開發(fā)人員的很多工作,減少數(shù)據(jù)在數(shù)據(jù)庫和應(yīng)用服務(wù)器之間的傳輸,對于提高數(shù)據(jù)處理的效率是有好處的。 存儲過程思想上很簡單,就是數(shù)據(jù)庫SQL 語言層面的代碼封裝與重用。
特點(diǎn)
- 封裝,復(fù)用
- 可以接收參數(shù),也可以返回?cái)?shù)據(jù)
- 減少網(wǎng)絡(luò)交互,效率提升
二、存儲過程的基本語法
2.1? 創(chuàng)建
CREATE PROCEDURE 存儲過程名稱( [參數(shù)列表] )
BEGIN
SQL 語句
END;
2.2? 調(diào)用
CALL 名稱 ( [參數(shù)])
2.3? 查看
--查詢指定數(shù)據(jù)庫的存儲過程及狀態(tài)信息
SELECT* FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = '對應(yīng)的數(shù)據(jù)庫名稱'
--查詢某個(gè)存儲過程的定義
SHOW CREATE PROCEDURE 存儲過程名稱
2.4? 刪除
DROP PROCEDURE [ IFEXISTS ] 存儲過程名稱
三、存儲過程中的變量
3.1? 系統(tǒng)變量
系統(tǒng)變量是MySQL服務(wù)器提供,不是用戶定義的,屬于服務(wù)器層面。分為全局變量(GLOBAL)、會話變量(SESSION)。
--查看系統(tǒng)變量
SHOW [SESSION | GIOBAL ] VARIABLFS ;? ? ? ? ?--查看所有系統(tǒng)變景
SHOW [SESSION |GLOBAL] VARUABLES LIKE ..…. ;? ? ? ?--可以通過UKL模糊匹配方式查找變量
SELECT @@[SESSION |?GLOBAL] 系統(tǒng)變量名;? ? ? ?--查看指定變量的值
--設(shè)置系統(tǒng)變量
SET [ SESSION| GLOBAL] 系統(tǒng)變量名 = 值;
SET @@[SESSION | GLOBAL] 系統(tǒng)變量名 = 值;
注意:
如果沒有指定SESSION/GLOBAL,默認(rèn)是SESSION,會話變量。
mysql服務(wù)重新啟動之后,所設(shè)置的全局參數(shù)會失效,要想不失效,可以在/etc/my.cnf 中配置。
?
3.2? 用戶自定義變量
用戶定義變量是用戶根據(jù)需要自己定義的變量,用戶變量不用提前聲明,在用的時(shí)候直接用“@變量名”使用就可以。其作用域?yàn)楫?dāng)前連接。
--賦值
SET @var_name = expr [,@var_name = expr ]... ;
SET @var_name := expr [,@var_name := exprl] ... ;
SELECT @var_name :=expr [,@var_name :=expr ] ..- ;
SELECT字段名INTO@var_name FROM表名;
--使用
SELECT @var_name ;
?
注意:
用戶定義的變量無需對其進(jìn)行聲明或初始化,如果沒有進(jìn)行聲明或初始化,將會獲取到的值為NULL。如下所示:@abc沒有聲明,查看自定義變量@abc將會獲取到null。
3.3? 局部變量
局部變量是根據(jù)需要定義的在局部生效的變量,訪問之前,需要DECLARE聲明??捎米鞔鎯^程內(nèi)的局部變量和輸入?yún)?shù),局部變量的范圍是在其內(nèi)聲明的BEGIN.... END塊。
聲明
DECLARE? 變量名? 變量類型? [DEFAULT...];
變量類型就是數(shù)據(jù)庫字段類型:INT、BIGINT、CHAR.VARCHAR.DATE、TIME等。
賦值
SET 變量名 = 值;
SET 變量名 := 值;
SELECT 字段名 INTO 變量名 FROM 表名....;
四、存儲過程--流程控制
4.1? 存儲過程-if判斷
語法:
IF 條件1 THEN
ELSEIF 條件2 THEN????????--可選
ELSE????????--可選
END IF;
?
定義存儲過程,完成如下需求:
根據(jù)定義的分?jǐn)?shù)scre變量,判定當(dāng)前分?jǐn)?shù)對應(yīng)的分?jǐn)?shù)等級。
1.score >=85分,等級為優(yōu)秀。
2.score >=60分且score <85分,等級為及格。
3.score<60分,等級為不及格。
4.2? 存儲過程-參數(shù)
用法:
CREATE PROCEDURE 存儲過程名稱 ([ IN/OUT/INOUT參數(shù)名參數(shù)類型 ])
BEGIN
????????--SQL語句
END ;
?
定義存儲過程,完成如下需求:
1.根據(jù)傳入?yún)?shù)score,判定當(dāng)前分?jǐn)?shù)對應(yīng)的分?jǐn)?shù)等級,并返回。
①score >=85分,等級為優(yōu)秀。
②score >= 60分且score <85分,等級為及格。
③score<60分,等級為不及格。
?2.將傳入的200分制的分?jǐn)?shù),進(jìn)行換算,換算成百分制,然后返回。
4.3? case
定義存儲過程,完成如下需求:
根據(jù)傳入的月份,判定月份所屬的季節(jié)(要求采用case結(jié)構(gòu))。
1. 1-3月份,為第一季度
2. 4-6月份,為第二季度
3. 7-9月份,為第三季度
4. 10-12月份,為第四季度
? ?
五、存儲過程-循環(huán)
5.1??循環(huán)-while
定義存儲過程,完成如下需求:
計(jì)算從1累加到n的值,n為傳入的參數(shù)值。
5.2??循環(huán)-repeat
repeat循環(huán)控制語句至少會執(zhí)行一次,滿足條件則退出。
定義存儲過程,完成如下需求:
計(jì)算從1累加到n的值,n為傳入的參數(shù)值。
?
5.3??循環(huán)-loop
LOOP實(shí)現(xiàn)簡單的循環(huán),如果不在sQL邏輯中增加退出循環(huán)的條件,可以用其來實(shí)現(xiàn)簡單的死循環(huán)。LOOP可以配合一下兩個(gè)語句使用:
① LEAVE: 配合循環(huán)使用,退出循環(huán)。
② ITERATE: 必須用在循環(huán)中,作用是跳過當(dāng)前循環(huán)剩下的語句,直接進(jìn)入下一次循環(huán)。
語法:
[begin_label:] LOOP
????????SQL邏輯..
END LOOP [end_ label];
LEAVE label; ????????--退出指定標(biāo)記的循環(huán)體
ITERATE label; ????????--直接進(jìn)入下一次循環(huán)
定義存儲過程,完成如下需求:
1.計(jì)算從1累加到n的值,n為傳入的參數(shù)值。
2.計(jì)算從1到n之間的偶數(shù)累加的值,n為傳入的參數(shù)值。
六、存儲過程-游標(biāo)-cursor
游標(biāo)(CURSOR)是用來存儲查詢結(jié)果集的數(shù)據(jù)類型,在存儲過程和函數(shù)中可以使用游標(biāo)對結(jié)果集進(jìn)行循環(huán)的處理。游標(biāo)的使用包括游標(biāo)的聲明、OPEN、FETCH和CLOSE,其語法分別如下。
?
聲明游標(biāo)
DECLARE? 游標(biāo)名稱? CURSOR? FOR? 查詢語句;
打開游標(biāo)
OPEN? 游標(biāo)名稱;
獲取游標(biāo)記錄
FETCH? 游標(biāo)名稱? INTO? 變量 [,變量];
關(guān)閉游標(biāo)
CLOSE? 游標(biāo)名稱;
?
定義存儲過程,完成如下需求:
根據(jù)傳入的參數(shù)uage,來查詢用戶表tb_user中,所有的用戶年齡小于等于uage的用戶姓名(name)和專業(yè)(profession),并將用戶的姓名和專業(yè)插入到所創(chuàng)建的一張新表tb_user_pro
(id,name,profession)中。
--邏輯:
①聲明游標(biāo),存儲查詢結(jié)果集
②準(zhǔn)備:創(chuàng)建表結(jié)構(gòu)
③開啟游標(biāo)
④獲取游標(biāo)中的記錄
⑤插入數(shù)據(jù)到新表中
⑥關(guān)閉游標(biāo)
完整的存儲過程語句如下:?
create procedure p1l(in uage int)
begin
declare uname varchar(100);
decLare upro varchar(100);
declare u_cursor cursor for select name,profession from tb_user where age <= uage;
當(dāng) 條件處理程序的處理的狀態(tài)碼為02000的時(shí)候,就會退出。
declare exit handler for SQLSTATE '02000'close u_cursor;
drop table if exists tb_user_pro;
create table if not exists tb_user_pro(
id int primary key auto_increment,
name varchar(100),
profession varchar(100)
);
open u_cursor;
while true do
fetch u_cursor into uname,Upro;
insert into tb_user_pro values(null,uname,Upro);
end while;
close u_cursor;
end;
七、存儲過程-條件處理程序-handle
八、存儲函數(shù)
定義存儲函數(shù),完成如下需求:文章來源:http://www.zghlxwxcb.cn/news/detail-691033.html
計(jì)算從1累加到n的值,n為傳入的參數(shù)值。文章來源地址http://www.zghlxwxcb.cn/news/detail-691033.html
到了這里,關(guān)于數(shù)據(jù)庫(MySQL)的存儲過程的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!