mysql中的UDF(自定义函数),其实是个好东西,比如可以写好一些方法或
函数,然后进行调用,而且是在SQL语句中可以进行调用。
DROP
FUNCTION CalculateAmount
CREATE FUNCTION
CalculateAmount(userid INT) RETURNS
float(10,2)
BEGIN
DECLARE
totalCredits FLOAT;
SELECT SUM(amount) INTO totalAmount
FROM credit_user WHERE id =userid;
RETURN
totalAmount;
END
要注意的是,在UDF中,不要定义与数据表中重名的列。而在SQL中,
则可以象如SELECT
CalculateAmount(1);那样去调用了。
指定参数为IN, OUT, 或INOUT 只对PROCEDURE是合法的。(FUNCTION参数总是被认为是IN参数)
下列是一个例子,一个采用参数的函数使用一个SQL函数执行一个操作,并返回结果:
mysql> delimiter //
mysql> CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50)
-> RETURN CONCAT(‘Hello, ‘,s,‘!‘);
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> SELECT hello(‘world‘);
+----------------+
| hello(‘world‘) |
+----------------+
| Hello, world! |
+----------------+
1 row in set (0.00 sec)
如果在存储函数中的RETURN语句返回一个类型不同于在函数的RETURNS子句中指定类型的值,返回值被强制为恰当的类型。比如,如果一个函数返回一个ENUM或SET值,但是RETURN语句返回一个整数,对于SET成员集的相应的ENUM成员,从函数返回的值是字符串。
参考:http://dev.mysql.com/doc/refman/5.1/zh/stored-procedures.html#create-procedure
>显示库中所有的自定义函数信息:
show function status;
>创建自定义函数的过程如下demo1:
drop function if exists fn_binary_table;
delimiter //
create function
fn_binary_table(
param_1 varchar(50)
)returns
int
begin
declare total
int default 0;
select count(*) into total from binary_table where
file_type like param_1;
return total;
end;
//
delimiter ;
定义一个输出三个数中最大的数函数:demo2如下:
drop function if exists fn_three_max;
delimiter //
create function
fn_three_max(
param_1 double,
param_2 double,
param_3
double
)returns double
begin
declare max_val
double;
if param_1 >
param_2 then
SET
max_val = param_1;
else
SET max_val =
param_2;
end
if;
IF param_3>max_val THEN
SET max_val =
param_3;
END IF;
return max_val;
end;
//
调用此函数如下:
select fn_three_max(3,100,90);
简单说明:
mysql中:
declare用户定义一个局部变量
set 用户给变量赋值。
官方文档:
CREATE [AGGREGATE] FUNCTION function_name RETURNS {STRING|INTEGER|REAL} SONAME shared_library_name DROP FUNCTION function_name
一个自定义函数 (UDF)就是用一个象ABS() 或 CONCAT()这样的固有(内建)函数一样作用的新函数去扩展MySQL。
function_name 是 用在SQL声明中以备调用的函数名字。RETURNS 子句说明函数返回值的类型。shared_library_name 是共享目标文件的基本名,共享目标文件含有实现函数的代码。该文件必须位于一个能被你系统的动态连接者搜索的目录里。
你必须有mysql 数据库的INSERT 权限才能创建一个函数,你必须有mysql 数据库的DELETE权限才能撤销一个函数。这是因为CREATE FUNCTION 往记录函数名字,类型和共享名的mysql.func系统表里添加了一行,而DROP FUNCTION则是从表中删掉这一行。如果你没有这个系统表,你应该运行mysql_fix_privilege_tables脚本来创建一个。请参阅2.10.2节,“升级授权表”。
一个有效的函数是一个用CREATE FUNCTION加载且没有用DROP FUNCTION移除的函数。每次服务器启动的时候会重新加载所有有效函数,除非你使用--skip-grant-tables参数启动mysqld。在这种情况下, 将跳过UDF的初始化,UDF不可用。
要了解编写自定义函数的说明,请参阅27.2.3节,“添加新的自定义函数”。要使得UDF机制能够起作用,必须使用C或者C++编写函数,你的系统必须支持动态加载,而且你必须是动态编译的mysqld(非静态)。
一个AGGREGATE函数就像一个MySQL固有的集合(总和)函数一样起作用,比如,SUM或COUNT()函数。要使得AGGREGATE 起作用,你的mysql.func表必须包括一个type列。如果你的mysql.func表没有这一 列,你应该运行mysql_fix_privilege_tables脚本来创建此 列。
更多:
http://www.cnblogs.com/huyong/archive/2011/04/28/2031541.html