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