【问题标题】:I have error in mysql function? ERROR is Not allowed to return a result set from a function我的mysql函数有错误? ERROR 不允许从函数返回结果集
【发布时间】:2019-09-03 22:03:27
【问题描述】:

mysql 函数有错误。我在下面附上了我的代码。

DELIMITER $$
CREATE FUNCTION CheckAccount6(ids INT)
RETURNS integer
BEGIN

DECLARE opening INT;
DECLARE a INT;

SET a = 0;

select q.invoice, q.timestamp, 
(select sum(o.totprice) from sp_orderdetails o where o.quotation_no = q.id) as amount
from sp_quotation q where q.cid = ids and q.invoice != '0'

UNION

select 0, t.timestamp, t.amount from sp_transactions t where t.cid = ids and t.status like 'Approved';

IF(invoice = 0) THEN
 a = a - amount;
ELSE
 a = a + amount;

return a;
END $$

【问题讨论】:

  • 您不能在函数中使用SELECT 语句,除非您使用INTO 将结果存储在变量中。
  • 这个函数应该做什么?如果您只关心invoiceamount,为什么还要选择所有其他字段?如果查询返回多于一行,您希望这些变量包含什么?
  • 选中那些变量后想写一些循环条件
  • 您需要使用游标来循环查询结果。
  • 但是为什么不在查询中使用SUM() 而不是循环呢?

标签: mysql function


【解决方案1】:

如果您在函数或过程中编写SELECT 查询而不将结果分配给变量,它会尝试返回它。这对于过程是允许的,因为它们可以用作查询,SELECT 查询的结果变成了CALL procedurename 的结果。

但是一个函数只能返回一个值,而不是一个查询结果集。如果您在函数中使用查询,它必须将结果存储在变量中,然后使用这些变量来计算函数的返回值。如果需要处理一个结果集的所有行,就需要使用游标。

由于您只想返回一个总和,您可以在查询中使用SUM(),然后返回它。不需要任何变量或循环。

DELIMITER $$
CREATE FUNCTION CheckAccount6(ids INT)
RETURNS integer
BEGIN
    RETURN (SELECT SUM(o.totprice)
            FROM sp_orderdetails AS o
            JOIN sp_quotation AS q ON o.quotation_no = q.id
            WHERE q.cid = ids AND q.invoice != '0')
           -
           (SELECT SUM(t.amount)
            FROM sp_transactions t
            WHERE t.cid = ids and t.status like 'Approved');
END $$

【讨论】:

    猜你喜欢
    • 2013-04-17
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 2016-01-25
    • 1970-01-01
    相关资源
    最近更新 更多