2

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"

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

4

2 回答 2

3
FOR SELECT ...
INTO ...
DO SUSPEND;
于 2012-03-04T11:55:35.487 回答
3

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

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

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

于 2012-03-10T00:43:37.267 回答