创建具有动态参数数量的 MySQL 存储函数
Posted
技术标签:
【中文标题】创建具有动态参数数量的 MySQL 存储函数【英文标题】:Create a MySQL stored function with a dynamic number of arguments 【发布时间】:2021-10-13 10:36:54 【问题描述】:我正在尝试创建一个 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
【问题讨论】:
一个问题,你不能在一个参数中传递多个参数吗?MYFUNCT(('1','2','3'))
?
您可以传递一个 SET,例如 MYFUNCT("1,2,3")
,然后使用 SET-ready 函数。但这并不友好。
【参考方案1】:
您展示的函数示例是存储函数,而不是 UDF。正如@Enzino 回答的那样,MySQL 中的存储函数不支持可变数量的参数。
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
【讨论】:
不,我确实想找到与 Cvarargs
等效的 MySQL,例如,MySQL 使用 CONCAT
执行这样的功能,它可以接受我们想要的任意数量的参数。如果那当然是可能的。感谢您指出存储函数和 UDF 之间的区别,我已经在某处读过,但忘记了。
CONCAT()
在 C 中作为内置函数实现。有许多带有可变参数的内置函数。我自己贡献了SHA2()
函数,它支持两个参数,第二个是可选的。但要做到这一点,它必须在 C 中实现。【参考方案2】:
我正在尝试创建一个 MySQL 函数 IS_IN_ENUM('value', 'val1', 'val2', 'val3') 如果 'value' 在 ('val1', 'val2', '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 服务器代码中自己实现这样的原生函数,请在 sql/item_create.cc
中查找 Create_native_func
的子类
【讨论】:
【参考方案3】:老问题,但您不需要创建 is_in_enum,因为它已经内置。只需从值 IN (1,2,3,4) 的表中选择 true;
【讨论】:
以上是关于创建具有动态参数数量的 MySQL 存储函数的主要内容,如果未能解决你的问题,请参考以下文章