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

    原文:http://www.cnblogs.com/zhangminghui/p/4113160.html

    引言

      MySQL本身提供了内置函数,这些函数的存在给我们日常的开发和数据操作带来了很大的便利,比如我前面提到过的聚合函数SUM()、AVG()以及日期时间函数等等,可是我们总会出现其他的需求:我们需要调用一个函数,这个函数需要按照我们的要求来实现我们自己的功能,可是这个函数式系统不能提供的因为这中需求的不确定性。因此我们需要自己来解决这种需求。还好MySQL设计的扩展性给了我们这个机会,我们可以通过自定义函数的功能解决这个问题。

    1.MySQL自定义函数简介

      在MySQL中使用自定义函数也需要相应的要求,语法如下,

      创建新函数:

        Create function function_name(参数列表)

        returns返回值类型

        函数体内容

      相关说明,

    • 函数名:应该合法的标识符,并且不应该与已有的关键字冲突。一个函数应该属于某数据库,可以使用db_name.funciton_name的形式执行当前函数所属数据库

        ,否则默认为当前数据库。

    • 参数列表:可以有一个或者多个函数参数,甚至是没有参数也是可以的。对于每个参数,由参数名和参数类型组成。
    • 返回值:指明返回值类类型
    • 函数体:自定义函数的函数体由多条可用的MySQL语句,流程控制,变量声明等语句构成。需要指明的是函数体中一定要含有return 返回语句。

    2.自定义示例

      a.无参函数定义

    mysql> DROP FUNCTION IF EXISTS hello;
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    mysql> DELIMITER $$
    mysql> CREATE FUNCTION hello()
        -> RETURNS VARCHAR(255)
        -> BEGIN
        -> RETURN 'Hello  world,i am mysql';
        -> END $$
    Query OK, 0 rows affected (0.11 sec)

    调用自定义函数:

    mysql> DELIMITER ;
    mysql> SELECT hello();
    +-------------------------+
    | hello()                 |
    +-------------------------+
    | Hello  world,i am mysql |
    +-------------------------+
    1 row in set (0.00 sec)

    可见已经调用成功了,需要注意的几点

      之所以使用DELIMITER是因为MySQL中默认是使用分号来结束一个命令的,我们定义的函数体中一条命令写完时会用分号来结束,而MySQL会误以为函数体已经定义完成,因为我们需要定义一个新的标识符来标识一个命令的结束,因为就可以使用DELIMITER。

    b:含有参数的自定义函数

      在我们格式化日期的时候我们会调用DATE_FORMAT(date,format)函数,第一个参数是日期第二个参数是需要格式化的格式,也就是说需要传递两个参数,我们现在就把这个函数给改下

    mysql> DELIMITER $$
    mysql> DROP FUNCTION IF EXISTS test.formatDate $$
    Query OK, 0 rows affected, 1 warning (0.07 sec)
    
    mysql> CREATE FUNCTION   test.formatDate(fdate datetime)
        -> RETURNS VARCHAR(255)
        -> BEGIN
        -> DECLARE x VARCHAR(255) DEFAULT '';
        -> SET x= date_format(fdate,'%Y年%m月%d日%h时%i分%s秒');
        -> RETURN x;
        -> END $$
    Query OK, 0 rows affected (0.11 sec)
    
    mysql> DELIMITER ;
    mysql> SELECT   formatDate(now());
    +----------------------------+
    | formatDate(now())          |
    +----------------------------+
    | 2014年11月21日03时41分21秒 |
    +----------------------------+
    1 row in set (0.18 sec)

    这样当我们需要定制这样的函数时就可以自己实现了,那就是通过含参的自定义函数。

    3.自定义函数相关语法及变量

      a:变量声明

        DECLARE var_name[,...] type [DEFAULT value] ,这个语句被用来声明局部变量。要给变量提供一个默认值,请包含一个DEFAULT子句。值可以被指定为一个表达式,不需要为一个常数。如果没有DEFAULT子句,初始值为NULL。使用语序使用 set 和 select into语句为变量赋值。

      b:IF  条件语句、

    IF search_conditionTHEN
    
    statement_list
    
    [ELSEIF search_conditionTHENstatement_list]
    
    ...
    
    [ELSE statement_list]
    
    ENDIF;

      c:CASE语句

    CASE case_value
    
    WHEN when_valueTHENstatement_list
    
    [WHEN when_value THENstatement_list]
    
    ...
    
    [ELSE statement_list]
    
    END CASE; 

      d:循环语句

    While
    
    [begin_label:]WHILEsearch_conditionDO
    
    statement_list
    
    END WHILE [end_label];
    
    退出整个循环leave 相当于break
    
    退出当前循环iterate 相当于 continue
    
    通过退出的标签决定退出哪个循环。

    查看定义的函数  SHOW FUCNTION STATUS LIKE 'function_name',或者是使用SHOW  CREATE FUNCTION function_name;

      

    复制代码
    mysql> SHOW FUNCTION STATUS LIKE 'hello';
    +------+-------+----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
    | Db   | Name  | Type     | Definer        | Modified            | Created             | Security_type | Comment | character_set_client | collation_connection | Database Collation |
    +------+-------+----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
    | test | hello | FUNCTION | root@localhost | 2014-11-21 14:48:05 | 2014-11-21 14:48:05 | DEFINER       |         | latin1               | latin1_swedish_ci    | latin1_swedish_ci  |
    +------+-------+----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
    1 row in set (0.18 sec)
    
    mysql> SHOW  CREATE FUNCTION hello;
    +----------+----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------
    -----------+----------------------+----------------------+--------------------+
    | Function | sql_mode                                                       | Create Function
               | character_set_client | collation_connection | Database Collation |
    +----------+----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------
    -----------+----------------------+----------------------+--------------------+
    | hello    | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` FUNCTION `hello`() RETURNS varchar(255) CHARSET latin1
    BEGIN
    RETURN 'Hello  world,i am mysql';
    END | latin1               | latin1_swedish_ci    | latin1_swedish_ci  |
    +----------+----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------
    -----------+----------------------+----------------------+--------------------+
    1 row in set (0.01 sec)
  • 相关阅读:
    Codeforces Round #649 (Div. 2) D. Ehab's Last Corollary
    Educational Codeforces Round 89 (Rated for Div. 2) E. Two Arrays
    Educational Codeforces Round 89 (Rated for Div. 2) D. Two Divisors
    Codeforces Round #647 (Div. 2) E. Johnny and Grandmaster
    Codeforces Round #647 (Div. 2) F. Johnny and Megan's Necklace
    Codeforces Round #648 (Div. 2) G. Secure Password
    Codeforces Round #646 (Div. 2) F. Rotating Substrings
    C++STL常见用法
    各类学习慕课(不定期更新
    高阶等差数列
  • 原文地址:https://www.cnblogs.com/qiaoyihang/p/6250206.html
Copyright © 2011-2022 走看看