我在IBExpert
firebird2.5执行以下简单查询,效果很好:
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“
答案 0 :(得分:3)
FOR SELECT ...
INTO ...
DO SUSPEND;
答案 1 :(得分:3)
suspend
向调用者返回一行。它可以以各种不同的方式使用,并且可以被认为类似于Python的yield
语句:挂起操作并发送回单个值(或者在本例中为行),然后在调用者请求更多时继续数据。 (由于技术原因,必须以这种方式完成,因为数据库驱动程序并不总是一次性提取整个结果集。)
您有一个select
查询,可以返回任意数量的值,后跟一个suspend
。 Firebird错了,告诉你这可能是错的。你想要做的是将select放在for循环中,这将遍历结果集并为每一行暂停一次,如rstrelba的答案所示。这可以确保调用者获得所有结果。