MySQL自定義函數(shù):
使用自定義函數(shù),可以簡化很多的操作,在上一回,我們練習(xí)了無參函數(shù),有參函數(shù),其實(shí)在函數(shù)中,還可以完成很多復(fù)雜的功能,這里我們繼續(xù)了解下。
在函數(shù)中執(zhí)行多條SQL
上一篇,我們只是簡單的使用return 返回了字符串,其實(shí),這里是可以執(zhí)行多條SQL的。
create function do_some_delete(p_emp_no int) returns varchar(20)
begin
delete from titles where emp_no=p_emp_no;
delete from employees where emp_no=p_emp_no;
return 'ok';
end
當(dāng)我們有多條SQL要執(zhí)行的時(shí)候,需要使用begin ... end,將多條SQL寫在里面,這個(gè)函數(shù)通過傳入的emp_no,刪除了2張表中的數(shù)據(jù),就是說函數(shù)中封裝了我們想要執(zhí)行的一系列SQL。
變量的使用
關(guān)于變量,以前寫了篇文章,可以看考下:MySQL-變量的使用
MySQL中的變量和其他編程語言中的變量差不多,可以理解成臨時(shí)存儲(chǔ)數(shù)據(jù)的
begin
declare total_record int;
select count(1) from titles into total_record;
return concat('total record of table titles is ',total_record);
end
使用變量的時(shí)候,需要提前聲明,使用declare 變量名 類型
......
我想錯(cuò)了,并不需要提前定義,直接去給變量賦值也是可以的,比如這樣:
drop function if exists query_total_record;
create function query_total_record() returns varchar(100) charset utf8
begin
select count(1) from titles into @total_record_titles;
select count(1) from employees into @total_record_employees;
return concat('titles表總記錄數(shù)為: ',@total_record,' , employees表總記錄數(shù)為:',@total_record_employees);
end
注意一下,我這里使用了@變量名,這個(gè)是比較標(biāo)準(zhǔn)的用戶自定義變量定義,而且使用@變量名的時(shí)候,可以不用提前聲明,但是如果不適用@的話,直接使用變量名,是沒有辦法不聲明就使用的,這一點(diǎn)大家注意下。
就是說,下面這種寫法是會(huì)報(bào)錯(cuò)的:
create function query_total_record() returns varchar(100) charset utf8
begin
select count(1) from titles into total_record_titles;
select count(1) from employees into total_record_employees;
return concat('titles表總記錄數(shù)為: ',total_record,' , employees表總記錄數(shù)為:',total_record_employees);
end
所以后面,標(biāo)準(zhǔn)起見,我們就使用@變量名的方式了。
上面,我們使用select xxx into 變量的方式,給變量初始化,我們還可以使用 set 的方式給變量賦值。
create function do_some_add(p_1 int) returns varchar(100)
begin
set @a=10;
set @b=10,@c=20;
set @d=@a+@b-@c+p_1;
return concat(@a,' + ',@b,' - ',@c,' + ',p_1,' = ',@d);
end
IF語句
在begin end里面,我們還可以使用流程控制語句,我們先從IF 說起
create function parse_age(age int ) returns varchar(100) charset utf8
begin
if age<=20 then set @msg='嘿,你還不到20歲';
else set @msg='嘿,你超過20歲了!';
end if;
return @msg;
end
我們還可以使用 elseif做多重判斷
create function parse_age(age int ) returns varchar(100) charset utf8
begin
if age<=20 then set @msg='嘿,你還不到20歲';
ELSEIF age<=30 then set @msg=concat(@msg,'嘿,你20多歲了');
else set @msg='嘿,你超過20歲了!';
end if;
return @msg;
end
記得在結(jié)尾使用end if
case 語句
這個(gè)和我們平時(shí)使用的case when類似,結(jié)尾需要使用 end case;
create function parse_age(age int ) returns varchar(100) charset utf8
begin
case
when age<=20 then set @msg='嘿,你還不到20歲';
when age<=30 then set @msg='嘿,你20多歲了';
else set @msg='嘿,你超過20歲了!';
end case;
return @msg;
end
while 循環(huán)
函數(shù)里面也是可以寫循環(huán)的,我們先來看while循環(huán)方式。
create function while_demo(num int) returns int
begin
set @count=0;
while num>0 do
set @count=@count+num;
set num=num-1;
end while;
return @count;
end
本來還在想這個(gè)傳入的參數(shù)能不能修改,試了下,也是一樣的,就是個(gè)傳入變量,這里就是做了一個(gè)累加
repeat語句
這個(gè)和while類似,只是個(gè)repeat是先執(zhí)行循環(huán)體,滿足條件后就退出
create function repeat_demo(num int) returns int
begin
set @count=0;
repeat
set @count=@count+num;
set num=num-1;
until num=0
end repeat;
return @count;
end
Loop語句
這是一個(gè)基本的循環(huán)語句,用來執(zhí)行循環(huán)內(nèi)容,但是Loop本身沒有退出循環(huán)的方法,需要借助其他的方式,比如 LEAVE,或者ITERATE
create function loop_demo(num int) returns int
begin
set @count=0;
loop1:Loop
set @count=@count+num;
set num=num-1;
if num=0 then LEAVE loop1; end if;
end Loop loop1 ;
return @count;
end
像上面的代碼一樣,我們要通過自己寫邏輯判斷來跳出Loop循環(huán)
好了,進(jìn)階篇,也到這里位置,這里介紹了變量和一些控制語句的使用,在實(shí)際使用中靈活運(yùn)用即可。