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...