zoukankan      html  css  js  c++  java
  • MySQL自定义函数

    自定义函数的格式:

    CREATE  

         [DEFINER = { user | CURRENT_USER }]  

         FUNCTION sp_name ([func_parameter[,...]])  

         RETURNS type  

         [characteristic ...] routine_body  

    func_parameter:  

         param_name type     

    type:  

         Any valid MySQL data type  

    characteristic:  

         LANGUAGE SQL  

       | [NOT] DETERMINISTIC  

       | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }  

       | SQL SECURITY { DEFINER | INVOKER }  

       | COMMENT 'string'  

    routine_body:  

         Valid SQL procedure statement  

    自定义函数与存储过程的区别

    1,函数方法的参数列表只允许IN类型的参数,并且不允许指定IN关键字

    2,函数方法返回一个单一的值,值的类型在存储方法的头部定义

    3,函数方法可以在SQL语句内部调用

    4,函数方法不能返回结果集

    官方文档:

    http://dev.mysql.com/doc/refman/5.1/zh/stored-procedures.html#create-procedure

    http://dev.mysql.com/doc/refman/5.1/zh/extending-mysql.html#adding-functions

    创建自定义函数

            CREATE [AGGREGATE] FUNCTION function_name RETURNS {STRING|INTEGER|REAL}

            BEGIN

                //函数实现的语句

            END;

            aggregate 指定创建的函数是普通的自定义函数,还是AGGREGATE函数。

            function_name 是用在SQL声明中以备调用的函数名字。

            RETURNS 子句说明函数返回值的类型。 

            每次服务器启动的时候会重新加载所有有效函数,除非使用--skip-grant-tables参数启动mysqld。在这种情况下, 将跳过UDF的初始化,UDF不可用。

           mysql文档说明:一个AGGREGATE函数就像一个MySQL固有的集合(总和)函数一样起作用,比如,SUM或COUNT()函数。要使得AGGREGATE 起作用,mysql.func表必须包括一个type列。如果mysql.func表没有这一 列,则应该运行mysql_fix_privilege_tables脚本来创建此列。

    创建自定义函数

    mysql> delimiter //

    mysql> DROP FUNCTION IF EXISTS fun_rand_key //

    mysql> CREATE FUNCTION fun_rand_key(iparam int) RETURNs int

        -> BEGIN

        -> declare i_return int;

        -> set i_return =iparam + floor(rand()*100);

        -> return i_return;

        -> END;

        -> //

    mysql> delimiter ;

    使用自定义函数

    mysql> select id from tb;

    +----+

    | id |

    +----+

    |  1 |

    +----+

    1 row in set (0.00 sec)

    mysql> select fun_rand_key(id) from tb;

    +------------------+

    | fun_rand_key(id) |

    +------------------+

    |                9 |

    +------------------+

    1 row in set (0.00 sec)

    查看自定义函数

            SHOW CREATE FUNTION function_name;

    或   SHOW FUNCTION STATUS [ LIKE '' ];

    如:mysql> show function status G;

    *************************** 1. row ***************************

                      Db: testdb

                    Name: fun_rand_key

                    Type: FUNCTION

                 Definer: root@localhost

                Modified: 2013-08-21 14:46:53

                 Created: 2013-08-21 14:46:53

           Security_type: DEFINER

                 Comment:

    character_set_client: gbk

    collation_connection: gbk_chinese_ci

      Database Collation: gbk_chinese_ci

    1 row in set (0.01 sec)

    mysql> show function status like '%rand%' G;

    *************************** 1. row ***************************

                      Db: testdb

                    Name: fun_rand_key

                    Type: FUNCTION

                 Definer: root@localhost

                Modified: 2013-08-21 14:46:53

                 Created: 2013-08-21 14:46:53

           Security_type: DEFINER

                 Comment:

    character_set_client: gbk

    collation_connection: gbk_chinese_ci

      Database Collation: gbk_chinese_ci

    1 row in set (0.00 sec)

    ERROR:

    No query specified

    mysql> show create function fun_rand_key G;

    *************************** 1. row ***************************

                Function: fun_rand_key

                sql_mode: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITU

    TION

         Create Function: CREATE DEFINER=`root`@`localhost` FUNCTION `fun_rand_key`(

    iparam int) RETURNS int(11)

    BEGIN

    declare i_return int;

    set i_return =iparam + floor(rand()*100);

    return i_return;

    END

    character_set_client: gbk

    collation_connection: gbk_chinese_ci

      Database Collation: gbk_chinese_ci

    1 row in set (0.00 sec)

    删除自定义函数

            DROP FUNCTION [ IF EXISTS ] function_name;

  • 相关阅读:
    如何修改帝国cms文章点击量默认值和成倍增加
    微信读书App来了 小伙伴们快去占榜吧
    (二)第十回 同日生辰情解契语 异姓兄弟冰释嫌隙[林大帅作品集]
    第十回(一) 同日生辰情解契语 异姓兄弟冰释嫌隙
    帝国cms如何调用指定id的文章到首页?
    微信支付又下一城:可以缴税了
    笔记:mysql升序排列asc,降序排列desc
    第九回(二):任侠厨子轻解厄围 夜半蹴鞠为泄忿闷[林大帅作品集]
    第九回(一):任侠厨子轻解厄围 夜半蹴鞠为泄忿闷
    第八回(二)新年晚会艺压群芳 文理分科三人聚首
  • 原文地址:https://www.cnblogs.com/jevo/p/3272670.html
Copyright © 2011-2022 走看看