7 Mysql自定義函式

2021-08-04 22:35:43 字數 2750 閱讀 9264

上一節課主要講了內建函式,對於系統函式,完成我們常規的操作就足夠了,但是有些情況下不能滿足則需要使用自定義函式。

自定義函式,使用者自定義函式(user-defined function,udf)是一種對mysql擴充套件的途徑,其用法與內建函式相同。我們這裡回憶一下內建函式是如何使用的?首先它要有個名字,第二函式我們在呼叫的時候都可以發現後面帶有了乙個小括號,小括號當中所寫的資料我們稱之為引數,當這個函式正常執行以後往往會得到乙個資訊,而這個資訊我們則稱之為返回值。

1.自定義函式的兩個必要條件

a.引數

b.返回值

不僅是自定義函式存在這兩個必要條件,我們之前學到的系統函式也存在這兩個必要的條件,當然引數並不是我們任何乙個函式所必備的要件,例如select version(),就是沒有引數但是有返回值。

函式的引數與返回值之間,沒有必然的聯絡,我們某乙個函式可以不存在引數,但是有返回值。我們在實際的應用當中,不存在某個函式沒有返回值的情況,所有的函式都有返回值但不一定有引數。

函式可以返回任意型別的值,同樣可以接收這些型別的引數。通過這句話我們可以發現,函式的引數以及返回值可以為我們前面所學到的任意資料型別。

如果說要建立函式,函式的引數理論上來說可以到達多少呢?mysql當中規定,引數數量理論上來講不能超過1024個,這對於我們常規的開發,基本上足夠了。

2.建立自定義函式

returns

routine_body

returns 指的是返回值的型別,routine_body指的是當前的函式體

3.關於函式體–routine_body

(1)函式體由合法的sql語法構成;

(2)函式體可以是簡單的select或insert語句;

(3)函式體如果為復合結構則使用begin…end語句;

(4)復合結構可以包括宣告,迴圈,控制結構。

set names gbk;它只影響你客戶端的編碼,不會影響你伺服器端的編碼。

select now()返回的是時間,如果我們不想用預設的格式來顯示時間,而是用中文的格式,就需要使用date_format()方法來實現,對now進行格式化,select date_format(now(),'%y年%m月%d日 %h點:%i分:%s秒'),這樣返回的時間就是漢字格式了,我們發現每次這麼寫的話我們會很麻煩,那麼可不可以把這個過程封裝成乙個自定義函式呢?答案是肯定的。在這裡我們發現我們並不要乙個引數,我們可以這樣寫:

create function f1() returns varchar(30)

return date_format(now(),'%y年%m月%d日 %h點:%i分:%s秒');

此時再呼叫新的函式時結果一致,中文顯示,這就是我們當前的不帶有引數的自定義函式。

我們也可以建立帶有函式的引數,假設我們現在寫乙個函式,它可以計算兩個數的平均值

create function f2(num1 smallint unsigned, num2 smallint unsigned)

returns float(10,2) unsigned

return (num1+num2)/2;

desc 表名;輸出其描述資訊,desc是描述的縮寫,小寫desc是降序的意思。

這裡我們的新函式想實現的是,往資料表裡插入一條記錄並且返回該記錄所屬的id值,先按照以前的想法寫出來,看看會提示什麼:

create function adduser(username varchar(20))

returns smallint unsigned

return insert t6(username) values (username);

回車之後報錯,因為分號代表著結束,而檢視這個函式可以發現我們根本沒有返回id的值,也就是沒有smallint型別的結果輸出。

這時我們要用delimiter 修改斜線delimiter //,這兩條斜線指的是什麼意思,以後你所有的命令都需要用兩條斜線來結束,這樣就能避免剛才的分號被判斷為函式結尾了。此時我們就可以修改我們之前的函式了,由於之前是沒有smallint型別的值結尾,我們加上last_insert_id();//,結果還是報錯。因為我們是需要兩個語句來執行,此時就需要新增begin…end語句,構成乙個聚合體。

最終的完成體函式:

create function adduser(username varchar(20))

returns smallint unsigned

begin

insert t6(username) values (username);

return last_insert_id();

end

//

此時測驗正常使用。再用delimiter;修改回原來的分號結尾,依舊可以正常使用。這些就是我們最簡單的自定義函式,在這其中可以包含宣告,迴圈以及流程控制,關於什麼是迴圈和流程控制我們在之後會講。實際的開發當中我們用自定義函式實際應用的並不是特別多,當然我們只需要了解如何實現標準的自定義函式就可以了。最後如果我們想把這些函式刪除掉,我們就可以使用drop function [if exists] function_name就可以了。

mysql自定義函式優點 MySQL自定義函式

在使用 mysql 的過程中,mysql 自帶的函式可能完成不了我們的業務需求,這時候就需要自定義函式。自定義函式是一種與儲存過程十分相似的過程式資料庫物件。它與儲存過程一樣,都是由 sql 語句和過程式語句組成的 片段,並且可以被應用程式和其他 sql 語句呼叫。自定義函式與儲存過程之間存在幾點區...

mysql自定義函式命名 MySQL自定義函式

在使用 mysql 的過程中,mysql 自帶的函式可能完成不了我們的業務需求,這時候就需要自定義函式。自定義函式是一種與儲存過程十分相似的過程式資料庫物件。它與儲存過程一樣,都是由 sql 語句和過程式語句組成的 片段,並且可以被應用程式和其他 sql 語句呼叫。自定義函式與儲存過程之間存在幾點區...

mysql 自定義函式

今天要做乙個排序,有中文和英文的,資料庫採用utf8編碼,排除來的不對,所以需要將中文轉換成中文的第乙個字母,然後來排序 先小小的看一下mysql的自定義函式 drop function if exists fntable 如果存在就刪除 delimiter 函式開始 create function...