如果我有一个名为MyTable的表,该表的列为C1(类型日期)和C2(类型字符),我想创建一个存储函数,该函数接受一个输入,并且输入应始终属于C1,并且输出应始终属于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
答案 0 :(得分:1)
乍一看,我看到语法错误:
...
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中,对于您用C / C ++代码实现并编译到MySQL服务器中的功能,他们使用术语user-defined function (UDF)。对于开发人员而言,编写这种类型的扩展名不太普遍。