MySQL 说:#1415 - 不允许从函数返回结果集

Posted

技术标签:

【中文标题】MySQL 说:#1415 - 不允许从函数返回结果集【英文标题】:MySQL said: #1415 - Not allowed to return a result set from a function 【发布时间】:2016-12-16 16:23:53 【问题描述】:

请帮我解决这个错误

mysqlphpMyAdmin 中创建存储函数时

BEGIN
    SET @pAvg = 0; 
    SET @p1 = 0;
    SET @p2 = 0;
    SET @p3 = 0;
    SET @p4 = 0;
    IF river > 1 THEN
        SELECT @P1 := Precipitation FROM abd_2013 where id = 1;
        SELECT @P2 := Precipitation FROM abd_2014 where id = 1;
        SELECT @P3 := Precipitation FROM abd_2015 where id = 1;
        SELECT @P5 := Precipitation FROM abd_2016 where id = 1;
        SELECT @pAvg := (@p1 + @p2 + @p3 + @p4)/4;
     ELSEIF river < 1 THEN SELECT @P5;
     END IF;
     RETURN river;
END

Everything going fine if I do the same in Stored Procedure but whenever I opt FUNCTION it gives warning add RETURN and after writing return it raises error #1415

MySQL said: #1415 Error

【问题讨论】:

简单:不要从函数返回结果集。 感谢您的回复。我已经尝试过这样做,但它给出了一个 javascript 警报存储函数的定义必须包含一个 RETURN 语句!。 【参考方案1】:

这种情况下的错误信息告诉了最重要的部分:

不允许从函数返回结果集

此行为与 MySQL 手册中有关存储过程和函数的记录一致:

对于可以在函数定义时确定返回结果集的语句,发生不允许从函数返回结果集错误(ER_SP_NO_RETSET)。

您使用返回结果集的 select 语句为您的 @Pn 变量赋值,而这在函数中是不允许的。您必须从代码中删除这些语句。 RETURN river 返回结果 value,但不返回结果 set

我还担心您使用跨连接共享的会话变量(定义为@variable_name 的变量),因此在连接中同时多次调用同一函数可能会相互干扰。

一个存储的函数应该只返回一个值作为它的输出在return 语句中。其他任何事情都被视为副作用。如果您希望 MySQL 脚本填充多个变量,那么您必须使用存储过程,而不能使用存储函数。

【讨论】:

您对 MySQL 的了解非常好,我学到的比我预期的要多。上帝保佑你..谢谢你。

以上是关于MySQL 说:#1415 - 不允许从函数返回结果集的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 说:#1336 - 存储函数或触发器中不允许使用动态 SQL

Mysql 说:#1422 - 存储函数或触发器中不允许显式或隐式提交

mysql 常用函数总结

r 值引用返回类型语义?

MYSQL:在多行选择中使用 COUNT 和 SUM 函数的问题

MySQL 中哪一个更快? COUNT(id) 还是计算结果行? [关闭]