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

  • 相关阅读:
    牛客练习赛51 D题
    Educational Codeforces Round 72 (Rated for Div. 2) C题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) C题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) A题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) A题
    Educational Codeforces Round 72 (Rated for Div. 2) B题
    Educational Codeforces Round 72 (Rated for Div. 2) A题
    《DSP using MATLAB》Problem 7.2
    《DSP using MATLAB》Problem 7.1
    《DSP using MATLAB》Problem 6.24
  • 原文地址:https://www.cnblogs.com/toudoubao/p/6640299.html
Copyright © 2011-2022 走看看