含義:一組預(yù)先編譯好的SQL語句的集合烤镐,理解成批處理語句
好處:
??1婉商、如果每次都要執(zhí)行3個(gè)語句苞也,那使用存儲過程包裝就可以一次性完成了级野,提高代碼重用性
??2、如果編譯過了這個(gè)存儲過程檩互,第二次調(diào)用就不用編譯了
??3特幔、減少了和數(shù)據(jù)庫服務(wù)器的連接次數(shù),提高了效率
一闸昨、創(chuàng)建語法
create procedure 存儲過程名(參數(shù)列表)
begin
存儲過程體(一組合法的SQL語句)
end
注意:
1蚯斯、參數(shù)列表包含三部分:參數(shù)模式 參數(shù)名 參數(shù)類型
舉例:
IN stuname varchar(20)
參數(shù)模式:
IN 進(jìn)口,該參數(shù)可以作為輸入饵较,需要調(diào)用方傳入值
OUT 出口拍嵌,該參數(shù)可以作為輸出,也就是這個(gè)參數(shù)可以作為返回值循诉,不像函數(shù)一樣有return
INOUT 進(jìn)出口横辆,該參數(shù)即可以作為輸入又可以作為輸出,即要傳入值茄猫,又可以返回值
2狈蚤、如果存儲過程體僅僅只有一句話,BEGIN END 可以省略(和函數(shù)一樣划纽,只有一條可以圣洛大括號)
??存儲過程體中每條SQL語句的結(jié)尾要求必須加分號脆侮,存儲過程的結(jié)尾可以使用 DELIMITER 重新設(shè)置
語法:
DELIMITER 結(jié)束標(biāo)記
DELIMITER $
二、調(diào)用語法
# 使用位置參數(shù)
CALL 存儲過程名(實(shí)參列表) 結(jié)束符號
三勇劣、具體使用
1靖避、空參列表
#案例:插入到 admin 表中5條記錄
create table admin( id int, username varchar(30), `password` varchar(30) );
# 注意這個(gè)$ 定義為了結(jié)束符,調(diào)用的時(shí)候也需要寫上
DELIMITER $ create procedure myp1()
BEGIN
insert into admin(username,`password`)
values('join1','000'),('join2','000'),('join3','000'),('join4','000'),('join5','000');
END $
上面到sql窗口運(yùn)行后就可以生成存儲過程了比默,并且可以在 workbench 中查到幻捏。
執(zhí)行調(diào)用后在 admin 表就有5條數(shù)據(jù)了
call myp1()$
注意這個(gè)結(jié)束符號也變成 $ 了,再用分號會查不出來語句退敦。
2粘咖、創(chuàng)建一個(gè)帶 in 模式參數(shù)的存儲過程
要求1:根據(jù)學(xué)生信息,查找學(xué)生的全部信息以及成績侈百、
create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10));
insert into Student values('01' , '趙雷' , '1990-01-01' , '男');
insert into Student values('02' , '錢電' , '1990-12-21' , '男');
insert into Student values('03' , '孫風(fēng)' , '1990-05-20' , '男');
insert into Student values('04' , '李云' , '1990-08-06' , '男');
insert into Student values('05' , '周梅' , '1991-12-01' , '女');
insert into Student values('06' , '吳蘭' , '1992-03-01' , '女');
insert into Student values('07' , '鄭竹' , '1989-07-01' , '女');
insert into Student values('09' , '張三' , '2017-12-20' , '女');
insert into Student values('10' , '李四' , '2017-12-25' , '女');
insert into Student values('11' , '李四' , '2017-12-30' , '女');
insert into Student values('12' , '趙六' , '2017-01-01' , '女');
insert into Student values('13' , '孫七' , '2018-01-01' , '女');
create table SC(SId varchar(10),CId varchar(10),score decimal(18,1));
insert into SC values('01' , '01' , 80);
insert into SC values('01' , '02' , 90);
insert into SC values('01' , '03' , 99);
insert into SC values('02' , '01' , 70);
insert into SC values('02' , '02' , 60);
insert into SC values('02' , '03' , 80);
insert into SC values('03' , '01' , 80);
insert into SC values('03' , '02' , 80);
insert into SC values('03' , '03' , 80);
insert into SC values('04' , '01' , 50);
insert into SC values('04' , '02' , 30);
insert into SC values('04' , '03' , 20);
insert into SC values('05' , '01' , 76);
insert into SC values('05' , '02' , 87);
insert into SC values('06' , '01' , 31);
insert into SC values('06' , '03' , 34);
insert into SC values('07' , '02' , 89);
insert into SC values('07' , '03' , 98);
create procedure myp2(in stuName varchar(20))
begin
select
s.*,
c.*
from student s
inner join sc c
on s.sid=c.sid
where s.name=stuname;
end $
# 調(diào)用
call myp2('趙雷')$
要求2:傳入多個(gè)參數(shù)
create procedure myp3(in sex varchar(20),in sage varchar(20))
begin
declare result varchar(20) default '';# 聲明變量并初始化
select
count(1) into result # 賦值給變量
from student s
where s.ssex=sex
and s.sage>sage;
select result; #使用變量
end $
# 調(diào)用存儲過程
call myp3('男','1989-01-01')$
3瓮下、創(chuàng)建一個(gè)帶 out 模式參數(shù)的存儲過程
要求:根據(jù)性別,返回對應(yīng)學(xué)生名字
DELIMITER $
drop procedure myp5$
create procedure myp5(in name varchar(20),out sex varchar(20))
begin
select
s.ssex into sex
from student s
where s.sname=name;
end $
# 定義用戶變量钝域,并且在調(diào)用函數(shù)的參數(shù)里面接收
call myp5('趙雷',@bsex)$
select @bsex$
drop procedure myp6$
create procedure myp6(in sex varchar(20),out sname varchar(20))
begin
select
s.sname into sname
from student s
where s.ssex=sex;
end $
# 如果有多個(gè)值會報(bào)錯(cuò)
call myp6('男',@sname)$
select @sname$
要求:使用多個(gè) out 值讽坏,要求根據(jù)姓名返回性別和年齡
# 注意賦值的寫法,不能是 s.ssex into sex , s.sage into age
create procedure myp7(in name varchar(20),out sex varchar(20),out age varchar(20))
begin
select
s.ssex ,s.sage into sex,age
from student s
where s.sname=name;
end $
# 定義用戶變量例证,并且在調(diào)用函數(shù)的參數(shù)里面接收
call myp7('趙雷',@bsex,@age)$
select @bsex,@age$
4路呜、創(chuàng)建一個(gè)帶 inout 模式參數(shù)的存儲過程
要求:傳入 a、b 兩個(gè)值织咧,最終 a 和 b 都翻倍并返回
# a胀葱、b 是局部變量,不用加 @
create procedure myp8(inout a int,inout b int)
begin
set a=a*2;
set b=b*b;
end $
# 調(diào)用并傳入笙蒙,不能直接傳抵屿,需要定義變量并傳入,這樣變量的內(nèi)容傳入后再接收返回的值
set @m=10$
set @n=20$
call myp8(@m,@n)$
select @m,@n$
四捅位、存儲過程的刪除
# 注意一次只能刪除一個(gè)
drop procedure myp1;
五轧葛、存儲過程的查看
# 查看存儲過程的信息
show create procedure myp2;
注意存儲過程不能修改里面的邏輯,要修改也只能是一些參數(shù)