MySQL自定義函數(shù)(二)- 進(jìn)階篇

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)用即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容