为什么这个SQL没有运行? Firebird存储过程

时间:2012-02-25 19:05:16

标签: sql stored-procedures firebird firebird2.5

我在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“

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

2 个答案:

答案 0 :(得分:3)

FOR SELECT ...
INTO ...
DO SUSPEND;

答案 1 :(得分:3)

rstrelba的答案显示了如何解决问题。如果你想了解它,这就是正在发生的事情。

Firebird存储过程中的

suspend向调用者返回一行。它可以以各种不同的方式使用,并且可以被认为类似于Python的yield语句:挂起操作并发送回单个值(或者在本例中为行),然后在调用者请求更多时继续数据。 (由于技术原因,必须以这种方式完成,因为数据库驱动程序并不总是一次性提取整个结果集。)

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