MYSQL中存储的功能

时间:2018-10-25 14:57:09

标签: mysql relational-database mysql-workbench

如果我有一个名为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

1 个答案:

答案 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)。对于开发人员而言,编写这种类型的扩展名不太普遍。