mysql自定義函式詳解

2021-09-29 07:54:06 字數 4433 閱讀 5934

mysql 5.0開始支援函式,函式是存在資料庫中的一段sql集合,呼叫函式可以減少很多任務作量,

減少資料在資料庫和應用伺服器上的傳輸,對於提高資料處理的效率。引數型別為in型別,函式必須有返回值,

與oracle等其他庫函式引數型別有區別,如果做資料遷移,或許需要將函式改變成儲存過程,

因為mysql的儲存過程引數包括in,out,inout三種模式。

建立函式語法:

create function fn_name(func_parameter[,...])

returns type

[characteristic...]

routine_body

引數代表含義:

func_parameter:  param_name type

type: 任何mysql支援的型別

characteristic:

language sql | [not]deterministic

| | sql security

| comment 'string'

routine_body: 函式體

更改函式語法:

alter function fn_name [characteristic...]
characteristic:

| sql security

| comment 'string'

建立表:

create table `t_user_main` (

`f_userid` int(10) not null auto_increment comment '使用者id,作為主鍵',

`f_username` varchar(5) default null comment '使用者名稱',

`f_age` int(3) default null comment '年齡',

primary key (`f_userid`)

) engine=innodb auto_increment=1 default charset=utf8;

插入資料:

insert into t_user_main (f_username, f_age) 

values('one',24),('two',25),('three',26),('four',27),('five',28),('six',29);

eg:

#建立乙個函式

delimiter $$ -- 定界符

-- 開始建立函式

create function user_main_fn(v_id int)

returns varchar(50)

begin

-- 定義變數

declare v_username varchar(50);

-- 給定義的變數賦值

select f_username into v_username from t_user_main

where f_userid = v_id;

-- 返回函式處理結果

return v_username;

end $$ -- 函式建立定界符

delimiter;

sql中使用函式:

select user_main_fn(1) from dual;
mysql中函式建立特別注意的兩點:(1) 需要定義定界符,否則是建立不了函式的,因為mysql見到'分號'就認為執行結束了,只有開始

建立時定義分界符,結束時在配對乙個分界符,mysql認為這個時候才結束,使得函式能夠完整編譯建立。

(2)mysql建立函式是沒有or replace 這個概念的,這個地方與建立檢視不同。

在函式中,執行包含ddl語句,允許提交或回滾,函式中可以呼叫其他函式或儲存過程。

#建立第二個函式,使用第乙個函式

delimiter $$

create function user_main_fn2(v_id int)

returns varchar(100)

begin 

#定義變數

declare v_username varchar(50);

declare  v_usernamenew varchar(50);

#通過into賦值

select f_username into v_username from t_user_main where f_userid = v_id;

#使用函式

select user_main_fn(v_id) into v_usernamenew from dual;

#返回函式處理結果

return concat(v_username,'***',v_usernamenew);

end $$

delimiter;

查詢新建函式:

select user_main_fn2(1);
查詢結果:

mysql中變數從5.1後不區分大小寫。

變數的定義:

通過declare可以定義乙個區域性變數,變數的作用範圍begin...end塊中;

變數語句必須解除安裝復合語句開頭,並且在其他語句的前面;

一次性可以宣告多個變數;

變數定義語法:

declare var_name[,...] type [default value]
在函式中定義變數的用法:

delimiter $$

create function user_main_fn2(v_id int)

returns varchar(100)

begin

#定義變數

declare v_username varchar(50);

declare  v_usernamenew varchar(50);

#定義變數,可以一次性定義多個

#declare v_username,v_usernamenew varchar(50);

declare v_testset varchar(50);

set v_testset = 'testset';

#通過into賦值

select f_username into v_username from t_user_main where f_userid = v_id;

#使用函式

select user_main_fn(v_id) into v_usernamenew from dual;

#返回函式處理結果

return concat(v_username,'***',v_usernamenew,v_testset);

end $$

delimiter;

我們通過declare 定義乙個v_username變數,變數型別為varchar,長度為50;

對於變數定義,對於同型別的變數,可以分開宣告,也可以一次宣告;

變數賦值:變數可以通過直接賦值,也可以通過查詢語句賦值。

直接賦值語法:set var_name = expr[,var_name=expr]...

在上面函式中,定義乙個v_testset變數,通過set直接賦值,eg:

declare v_testset varchar(50);

set v_testset = 'testset';

通過select...into...賦值,通過這種方式賦值,要求查詢返回只有一行結果,

使用語法:

select col_name[,...] into var_name[,...] table_expr;
eg:

select f_username into v_username from t_user_main where f_userid = v_id;
檢視函式狀態語法:

show function status [like 'pattern']
檢視函式的定義語法:

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

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

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

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

mysql 自定義函式

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