mysql自定義函數


  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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM