zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    51单片机按键连击
    未知设备号创建设备节点
    C语言中enum的用法
    linux 端口IO操作
    读写控制台记录级别
    linux内核驱动中读写函数
    使用gawk记录一段时间内,某个进程占用内存和CPU的情况
    <Linux> Ubuntu error: ssh: connect to host master port 22: No route to host lost connection
    MapReduce的分区与 分组二次排序
    问题
  • 原文地址:https://www.cnblogs.com/youxin/p/3568607.html
Copyright © 2011-2022 走看看