使用动态数量的参数创建MySQL存储函数

时间:2012-12-07 10:55:50

标签: mysql arguments user-defined-functions variadic-functions

我正在尝试创建一个MySQL函数IS_IN_ENUM('value', 'val1', 'val2', 'val3'),如果'value'在('val1','val2','val3')中,则返回true。我知道我可以做SELECT 'value' IN ('val1', 'val2', 'val3'),但这不太有趣,因为我只是想学习如何创建这样的功能。

我举个例子,考虑以下ADD函数:

CREATE FUNCTION my_add (
    a DOUBLE,
    b DOUBLE
)
RETURNS DOUBLE
BEGIN

    IF a IS NULL THEN
        SET a = 0;
    END IF;

    IF b IS NULL THEN
        SET b = 0;
    END IF;

    RETURN (a + b);
END;

如果我SELECT my_add(1, 1),我得到2(哇!)。

如何改进此功能才能调用:

SELECT my_add(1, 1); -- 2
SELECT my_add(1, 1, 1); -- 3
SELECT my_add(1, 1, 1, 1); -- 4
SELECT my_add(1, 1, 1, 1, 1, 1, .....); -- n

3 个答案:

答案 0 :(得分:5)

您显示的功能示例是存储函数,而不是UDF。 MySQL中的存储函数不支持可变数量的参数,正如@Enzino回答的那样。

MySQL UDF用C或C ++编写,编译成动态对象文件,然后用different syntax of CREATE FUNCTION与MySQL服务器链接。

有关编写UDF的详细信息,请参阅http://dev.mysql.com/doc/refman/5.5/en/adding-udf.html。但我不知道你是否想要编写C / C ++代码来实现这一目标。

MySQL UDF支持可变数量的参数。实际上,所有UDF都隐式接受任意数量的参数,并且由程序员决定所给出的参数的数量和数据类型是否对您的函数有效。

UDF中的处理函数参数记录在http://dev.mysql.com/doc/refman/5.5/en/udf-arguments.html

答案 1 :(得分:1)

  

我正在尝试创建一个MySQL函数IS_IN_ENUM('value','val1',   'val2','val3')如果'value'在('val1','val2',则返回true)   'VAL3')。

为此,您可以使用本机函数FIELD:

http://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_field

IS_IN_ENUM表示FIELD!= 0。

同时检查FIND_IN_SET

http://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_find-in-set

存储函数不支持可变数量的参数。

现在,如果您真的想在MySQL服务器代码中自己实现这样的本机函数,请在Create_native_func

中查找sql/item_create.cc的子类

答案 2 :(得分:0)

旧问题,但你不需要创建is_in_enum,因为它已经内置。只需从表中选择true,其中值为IN(1,2,3,4);