如果我有一个名为 MyTable 的表,其中的列为 C1(类型日期)和 C2(类型字符),我想创建一个存储函数,它接受一个输入,并且输入应始终属于 C1,而输出存储函数应该是C2中对应的元素。我曾尝试在存储函数中使用“select”语句后跟“where”子句来实现它,但无法实现。有没有其他方法可以完成这个任务。
DELIMITER $$
CREATE FUNCTION `MyFunction`
(`Date` datetime)
RETURNS char(10)
BEGIN
DECLARE MyVariable char(10)
SELECT MyVariable = `C2`
FROM MyTable
WHERE `Date` = `C1`; RETURN MyVariable;
END$$
DELIMITER ;
但这一直给我错误代码:1064
最佳答案
乍一看,我看到一个语法错误:
...
BEGIN
DECLARE MyVariable char(10) <-- needs a semicolon here
SELECT MyVariable = `C2`
...
例程主体中的每个语句都必须以分号结尾。请参阅本手册页中的 DECLARE 示例:https://dev.mysql.com/doc/refman/8.0/en/local-variable-scope.html
应该是这样的:
...
BEGIN
DECLARE MyVariable char(10);
SELECT MyVariable = `C2`
...
回复你的评论:
错误 1415 表示“无法返回结果集”。您的存储函数正在执行 SELECT,而没有使用 INTO
关键字将结果放入声明的局部变量中。
您似乎试图使用 =
设置 MyVariable 的值,但这只是进行比较。它不会为 MyVariable 分配任何内容。
如果不使用 INTO
来分配变量,您的 SELECT 语句默认返回一个结果集。这在存储过程中是允许的,但在存储函数中是不允许的。存储函数必须返回单个标量值,而不是结果集。
...
BEGIN
DECLARE MyVariable char(10);
SELECT `C2` INTO MyVariable
FROM MyTable
WHERE `Date` = `C1`;
RETURN MyVariable;
END
P.S.:我编辑了您的问题,将术语“用户定义函数”替换为“存储函数”。这是 MySQL 中的两个不同的东西。你正在写一个 stored function .
在 MySQL 中,他们使用术语 user-defined function (UDF)对于您在 C/C++ 代码中实现并编译到 MySQL 服务器中的函数。开发人员很少编写这种类型的扩展。
关于mysql - MYSQL中的存储函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52992340/