【问题标题】:Why doesn't this SQL run? Firebird stored procedure为什么这个 SQL 不运行?火鸟存储过程
【发布时间】:2012-03-15 20:51:29
【问题描述】:

我在IBExpert 中执行了以下简单查询,它工作正常:

SELECT
   pd.NOME_PRODUTO,
   es.QTDE_MINIMA
FROM
   TBL_ESTOQUE es,
   TBL_PRODUTO pd
WHERE
   es.qtde_estoque = 0
   AND es.produto = pd.id
ORDER BY
   pd.NOME_PRODUTO

但是,如果我创建一个带有两个输出参数的存储过程(见下文)

begin
SELECT
  pd.NOME_PRODUTO,
  es.QTDE_MINIMA
FROM
  TBL_ESTOQUE es,
  TBL_PRODUTO pd
WHERE
  es.qtde_estoque = 0
  AND es.produto = pd.id
ORDER BY
  pd.NOME_PRODUTO
into :nome_produto, :qtde_minima;
suspend;
end

我收到这样的消息:

单例选择中的多行。单例中的多行 选择。在程序 'SPD_SALDO_PROD_ZERADO_ESTOQUE' 行:7,col:3"

这是什么?我不明白发生了什么......

【问题讨论】:

  • 错误信息很清楚不是吗?您的选择返回多少行?

标签: firebird2.5 sql stored-procedures firebird firebird2.5


【解决方案1】:
FOR SELECT ...
INTO ...
DO SUSPEND;

【讨论】:

    【解决方案2】:

    rstrelba 的回答显示了如何解决该问题。如果您想了解它,这就是发生的事情。

    suspend 在 Firebird 存储过程中返回一行给调用者。它可以以各种不同的方式使用,并且可以被认为类似于 Python 的 yield 语句:暂停操作并发送回单个值(或行,在这种情况下),然后在调用者要求更多数据时继续。 (出于技术原因,必须这样做,因为数据库驱动程序并不总是一次提取整个结果集。)

    您有一个select 查询,它可以返回任意数量的值,后跟一个suspend。 Firebird 出错了,告诉你这可能是错误的。您想要做的是将选择放入 for 循环中,该循环将遍历结果集并为每一行暂停一次,如 rstrelba 的回答所示。这可以确保调用者得到所有结果。

    【讨论】:

    • 恐怕你有点不对劲。我认为问题不在于suspend。但在into 部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    相关资源
    最近更新 更多