• mysql自定义函数


    1、用户自定义(user-defined function, UDF)是一种对MySQL扩展的途径,其用法与内置函数相同。

    自定义函数的两个必要条件:

    (1)参数(理论上来讲参数数量不能超过1024个)

    (2)返回值(所有的函数都有返回值)

    函数可以返回任意类型的值,同样可以接收这些类型的参数。

    函数的返回值和参数没有内在的必然的联系。

    2、创建自定义函数

    CREATE FUNCTION function_name

    RETURNS

    {STRING | INTEGER | REAL|DECIMAL}

    routine_body(函数体)

    3、创建不带有参数的自定义函数

    mysql> SELECT NOW();  #显示现在的时间
    +---------------------+
    | NOW() |
    +---------------------+
    | 2017-03-29 15:47:07 |
    +---------------------+

    mysql> SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒');  #对时间进行格式化
    +--------------------------------------------------+
    | DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒') |
    +--------------------------------------------------+
    | 2017年03月29日 15点:51分:23秒 |

    mysql> CREATE FUNCTION f1() RETURNS VARCHAR(30)
    -> RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒');  #创建函数(把对时间的处理封装起来,后面就可以调用)
    Query OK, 0 rows affected (0.06 sec)

    mysql> SELECT f1();  #函数调用
    +-------------------------------+
    | f1() |
    +-------------------------------+
    | 2017年03月29日 15点:55分:16秒 |
    +-------------------------------+

    4、MySQL创建带有参数的自定义函数

    mysql> CREATE FUNCTION f2(num1 SMALLINT UNSIGNED, num2 SMALLINT UNSIGNED)
    -> RETURNS FLOAT(10,2) UNSIGNED
    -> RETURN (num1+num2)/2;
    Query OK, 0 rows affected (0.00 sec)

    mysql>
    mysql> SELECT f2(2,4);
    +---------+
    | f2(2,4) |
    +---------+
    | 3.00 |
    +---------+

    5、创建具有复合结构函数体的自定义函数

    mysql> SELECT * FROM test;
    +----+----------+
    | id | username |
    +----+----------+
    | 1 | John |
    | 2 | Mary |
    +----+----------+
    2 rows in set (0.00 sec)

    mysql> CREATE FUNCTION adduser(username VARCHAR(20))
    -> RETURNS INT UNSIGNED
    -> RETURN
    -> INSERT test(username) VALUES(username); #最后的分号被认为是mysql命令的结束,根本不会有返回值

    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual
    corresponds to your MySQL server version for the right syntax to use near '
    username) VALUES(username)' at line 4
    mysql>
    mysql>
    DELIMITER //  #修改默认的mysql分隔符(以后所有的命令都要通过//来结束)
    mysql>
    mysql> SELECT VERSION();
    -> //
    +-----------+
    | VERSION() |
    +-----------+
    | 5.5.54 |
    +-----------+

    mysql> CREATE FUNCTION adduser(username VARCHAR(20))
    -> RETURNS INT UNSIGNED
    -> RETURN
    -> INSERT test(username) VALUES(username);
    -> LAST_INSERT_ID();
    -> //   #出错原因:有两个语句需要执行(先插入记录,再返回ID),所以为复合结构,需要BEGIN...END语句
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
    corresponds to your MySQL server version for the right syntax to use near 'test(
    username) VALUES(username);
    LAST_INSERT_ID()' at line 4

    mysql> CREATE FUNCTION adduser(username VARCHAR(20))
    -> RETURNS INT UNSIGNED
    -> BEGIN
    -> INSERT test(username) VALUES(username);
    -> RETURN LAST_INSERT_ID();
    -> END
    -> //
    Query OK, 0 rows affected (0.01 sec)

    mysql> SELECT adduser('Rose');
    -> //
    +-----------------+
    | adduser('Rose') |
    +-----------------+
    | 9 |
    +-----------------+
    1 row in set (0.03 sec)

    mysql> DELIMITER ;   #修改mysql分隔符为;
    mysql>
    mysql> SELECT adduser('Hello');
    +------------------+
    | adduser('Hello') |
    +------------------+
    | 10 |
    +------------------+
    1 row in set (0.02 sec)

    mysql> SELECT * FROM test;
    +----+----------+
    | id | username |
    +----+----------+
    | 1 | John |
    | 2 | Mary |
    | 9 | Rose |
    | 10 | Hello |
    +----+----------+

    6、删除函数

    DROP FUNCTION [IF EXISTS] function_name

  • 相关阅读:
    printf函数实现的深入剖析
    rhel/centos播放mp3文件
    GRUB(GRand Unified Boot loader)引导加载程序
    NAT DHCP WWW rc.local
    论文 毕业设计 相关 用语 评语
    Linux禁止单用户模式(single)来增强系统安全
    Kernel command using Linux system calls
    GNU-ld链接脚本浅析
    AT&T汇编心得之间接寻址和LEA指令
    Linux 汇编语言开发指南
  • 原文地址:https://www.cnblogs.com/toudoubao/p/6640299.html
Copyright © 2020-2023  润新知