Firebird2.5 为什么';这个SQL不能运行吗?Firebird存储过程
我在Firebird2.5 为什么';这个SQL不能运行吗?Firebird存储过程,firebird2.5,sql,stored-procedures,firebird,Firebird2.5,Sql,Stored Procedures,Firebird,我在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 但是,如果我创建一个具有两个输出参数的存储过程(请参见下文) 我收到这样的信息: 单件选择中有多行。单例
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
但是,如果我创建一个具有两个输出参数的存储过程(请参见下文)
我收到这样的信息:
单件选择中有多行。单例中的多行
选择。在程序“SPD_SALDO_PROD_ZERADO_ESTOQUE”行:7,列:3”
这是什么?我不明白发生了什么…rstrelba的回答说明了如何解决问题。如果你想了解它,下面是发生的事情
FOR SELECT ...
INTO ...
DO SUSPEND;
Firebird存储过程中的suspend
向调用者返回一行。它可以以各种不同的方式使用,可以被认为类似于Python的yield
语句:suspend操作并发送回单个值(本例中为行),然后在调用者请求更多数据时继续。(出于技术原因,必须这样做,因为数据库驱动程序并不总是一次提取整个结果集。)
您得到了一个
select
查询,该查询可以返回任意数量的值,然后是一个suspend
。Firebird正在出错,告诉您这可能是错误的。您要做的是将select放入for循环,该循环将遍历结果集,并为每行挂起一次,正如rstrelba的回答所示速率。这确保调用者返回所有结果。错误消息非常清楚,不是吗?select返回多少行?恐怕您有点错。我认为问题不在挂起部分,而在进入部分。
FOR SELECT ...
INTO ...
DO SUSPEND;