mysql - MYSQL中的存储函数

标签 mysql relational-database mysql-workbench

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

相关文章:

php - MySQL 查询 w/COUNT() 和 HAVING 基于日期比较

mysql - CREATE 上的 Hive 错误

mysql - 如何在 Docker MySQL 镜像上允许外部连接

mysql - 将 MySQL Workbench 查询输出复制到剪贴板

带有 (n) 的 Mysql UNIQUE 表示法

mysql - Hibernate Spring 无法解析属性基本查询

sql - 提升到 postgresql 中的继承表

mysql - Mysql中如何关联表

relational-database - 为什么大多数关系数据库使用内存映射写入日志而不是直接写入磁盘?

mysql - 想要根据给定日期和给定工作日查找周日期