1. 程式人生 > 其它 >mysql——儲存過程和函式

mysql——儲存過程和函式

技術標籤:mysqlmysql

儲存過程和函式

儲存過程和函式:類似於java中的方法
好處
1、提高程式碼的重用性
2、簡化操作

一、儲存過程

含義:一組預先編譯號的sql語句的集合,理解成批處理語句
好處
1、提高程式碼的重用性
2、簡化操作
3、減少了編譯次數並且減少了和資料庫伺服器的連線次數,提高效率

建立語法:
create procedure 儲存過程名(引數列表)
begin
儲存過程體(一組合法的sql語句)

end
注意:
1、引數列表包含三部分
引數模式 引數名 引數型別
舉例:
in stuname varchar(20)

引數模式:
in:該引數可以作為輸入,也就是該引數需求呼叫方傳入值
out:該引數可以作為輸出,也就是該引數可以作為返回值
inout:該引數既可以作為輸入又可以作為輸出,也就是該引數既需要傳入值,又可以返回值

如果儲存過程僅僅只有一句話,begin end 可以省略
儲存過程體中每條sql語句的結尾要求必須加分號
儲存過程的結尾可以使用delimiter重新設定

呼叫語法
call 儲存過程名(實參列表)
呼叫in模式的引數:call sp1(‘值’)
呼叫out模式的引數:set @name;call sp1(@name);
呼叫inout模式的引數:set @name=值; call sp1(@name);select @name

1)空參列表
案例1:插入到admin表中五條記錄
delimiter $
create procedure myp1()
begin
insert into admin(userName,‘password’)
values(‘jion’,‘123’),(‘rose’,‘123’),(‘jack’,‘123’);
end $

呼叫
call myp1() $

2)建立帶in模式引數的儲存過程
案例1:建立儲存過程實現,根據女神名,查詢對應的男神資訊
create procedure myp2(in beautyName varchar(20))
begin
select boys.* from boys

right join beauty b on boys.id = b.boyfriend_id
where b.name = beautyName;
end $

案例2:建立儲存過程實現,使用者是否登入成功
create procedure myp3(in userName varchar(20),in pwd varchar(20))
begin
declare result varchar(20) default ‘’;#宣告並初始化

select count(*) into result #賦值
from admin
where admin.userName = userName
and admin.pwd=pwd;

#select result;#使用
select if(result>0,'成功','失敗');#使用

end $

3)建立帶out模式的儲存過程
案例1:根據女神名,返回對應的男神名
create procedure myp4(in beatyName varchar(20),out boyName varchar(20))
begin
select boys.boyName into boysName
from boys
inner join beauty b on boys.id = b.boyfriend_id
where b.name=beautyName;
end$
set @bName
call myp5(‘小昭’,@bName)$
select @bName$

案例2:根據女神名,返回對的男神名和男神魅力值
create procedure myp5(in bName varchar(20),out boyName varchar(20),out cp int)
begin
select boys.boyName,boys.cp into boysName, cp
from boys
inner join beauty as b on b.boyfriend_id = boys.id
where b.name = bName;
end $
call myp5(‘小昭’,@bName,@cp)$

4)建立帶inout模式引數的儲存過程
案例1:傳入a和b兩個值,最終a和b都翻倍並返回
create procedure myp6 (inout a int, inout b int)
begin
set a = a2;
set b = b
2;
end $

set @m=10$
set @n=20$

call myp6(@m,@n)$
select @m,@n

刪除儲存過程:只能一次刪除一個
語法: drop procedure 儲存過程名

檢視儲存過程的資訊
show create procedure myp2(儲存過程名)

二、函式

含義:一組預先編譯好的sql語句的集合,理解成批處理語句
1、提高程式碼的重用性
2、簡化操作
3、減少了編譯次數並且減少了和資料庫伺服器的連線次數,提高效率

儲存過程:可以有0個返回,也可以有多個返回;適合做批量插入、批量更新
函式:有且僅有1個返回;適合做處理資料後返回一個結果

1、建立語法
create function 函式名(引數列表)returns 返回型別
begin
函式體
end
注意:
1)引數列表包含兩個部分:引數名、引數型別

2)函式體:肯定會有return語句,如果沒有會報錯
如果return語句沒有放在函式體的最後也不會報錯,但不建議

return值

3)函式體中僅有一句話,則可以省略begin end
4)使用delimiter語句設定結束標記

delimiter $;

2、呼叫語法
select 函式名(引數列表)

案例1:無參有返回,返回公司的員工個數
create function myf1() returns int
begin
declare c int default 0;#定義區域性變數
select count(*) into c#賦值
from employees;
return c;
end $

select myf1() $

案例2:有引數有返回,根據員工名,返回他的工資
create function myf2(empName varchar(20)) returns float
begin
set @sal=0;#定義使用者變數
select salary into @sal
from employees
where name = empName;
return @sal;
end$
select myf2(’’)$

create function myf3(deptName varchar(20)) returns double
begin
set @sal = 0;
select avg(salary) into @sal
from employees as e
inner join department d on d.id=e.department_id
where d.department_name = deptName;
return @sal;
end $

3、檢視函式
show create function myf3;

4、刪除函式
drop funtion myf3;

三、流程控制結構

順序結構:程式從上往下依次執行
分支結構:程式從兩條或多條路徑中選擇一條去執行
迴圈結構:程式在滿足一定條件的基礎上,重複執行一段程式碼

1、分支結構
if函式
功能:實現簡單的雙分支
語法:
if(表示式1,表示式2,表示式3)
執行順序:如果表示式1 成立,則if函式返回表示式2的值,否則返回表示式3的值
應用:任何地方

2、case結構
情況1:類似於java中的switch語句,一般用於實現等值判斷
語法:
case 變數、表示式、欄位
when 要判斷的值 then 返回的值1或語句1;
when 要判斷的值 then 返回的值2或語句2;
···
else 要返回的值n或語句n;
end case;

情況2:類似於java中的多重if語句,一般用於實現區間判斷
語法:
case
when 要判斷的條件1 then 返回的值1或語句1;
when 要判斷的條件2 then 返回的值2或語句2;
···
else 要返回的值n或語句n;
end case;

特點:

可以作為表示式,巢狀在其他語句中使用,可以放在任何地方,begin end中或begin end 的外面
可以作為獨立的語句去使用,只能放在begin end中

如果when中的值滿足或條件成立,則執行對應的then後面的語句,並且結束case
如果都不滿足,則執行else中的語句或值
③else可以省略,如果省略了,並且所有when條件都不滿足,則返回null
案例:建立儲存過程,根據傳入的成績,來顯示等級,比如傳入的成績:90-100顯示A,顯示80-90顯示B,顯示60-80顯示C,否則顯示D
create procedure test_case(in score int)
begin
case
when score>=90 and score<=100 then select ‘A’;
when score>=80 then select ‘B’;
when score>=60 then sekect’C’;
else select ‘D’;
end case;
end $

call test_case(95)$

功能:實現多重分支
語法:
if 條件1 then 語句1;
elseif 條件2 then 語句2;
···
else 語句n
endif
應用在 begin end 中
案例:根據傳入的成績,來顯示等級,比如傳入的成績:90-100顯示A,顯示80-90顯示B,顯示60-80顯示C,否則顯示D

create function test_if(score int) returns char
begin
if score >=90 and score <=100 then return ‘A’;
elseif score>=80 then return ‘B’;
elseif score>=60 then return ‘C’;
else return ‘D’;
end if;
end

3、迴圈結構
分類
while、loop、repeat
迴圈控制:
iterate類似於continue,繼續,結束本次迴圈,續集下一次
leave類似於break,跳出,結束當前所在的迴圈

1)while
語法:
【標籤:】while 迴圈條件 do
迴圈體
end while【標籤】

2)loop
語法
【標籤:】loop
迴圈體
end loop 【標籤】
可以用來模擬簡單的死迴圈

3)repeat
語法:
【標籤:】repeat
迴圈體
until 結束迴圈的條件
end repeat【標籤】

1)沒有新增迴圈控制語句
案例:批量插入,根據次數插入到admin表中的多條記錄

create procedure pro_while(in inserCount int)
begin
declare i int deafult 1;
while i<=inserCount do
insert into admin(userName,pwd)values(concat(‘Roes’,i),‘123’)
set i=i+1;
end while;
end $
call pro_while(100)$

2)新增leave語句
案例:批量插入,根據次數插入到admin表中的多條記錄,如果次數大於20則停止
create procedure test_while (int insertCount int)
begin
declare i int default 1;
a:while i<=insertCount do
inser t into admin(userName,pwd) values(concat(‘xiaohua’,i),‘123’);
if i>=20 then leave a;
end if
set i=i+i;
end while a
end $
call test_while(100)$

3)新增
create procedure test_while (int insertCount int)
begin
declare i int default 0;
a:while i<=insertCount do
set i=i+1;
if mod(i,2)!=0 then iterate a;
end if;
inser t into admin(userName,pwd) values(concat(‘xiaohua’,i),‘123’);
end while a
end $

CREATE PROCEDURE test_randstr_insert(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;#定義一個迴圈變數i,表示插入的次數
DECLARE str VARCHAR(20) DEFAULT ‘asdasdasd’;
DECLARE startIndex INT DEFAULT 1;#代表起始索引
DECLARE len INT DEFAULT 1;
WHILE i <=inserCount DO
SUBSTR(str,startIndex)
SET len = FLOOR(RAND()*(26-startIndex+1)+1))#產生一個隨機的整數,代表擷取長度,
SET startIndex=RAND()*20+1;#產生一個隨機的整數,代表起始索引1-20
INSERT INTO stringcontet(content) VALUES(SUBSTR(str,startIndex,len));
SET i=i+1;#迴圈變數更新

AND $