暂停在火鸟中如何工作?

How does suspend work in firebird?

我有一个 table t 有一个类型为 int 的列 i,有几行。 我想遍历它。当然,我可以为此编写一个 select 查询。但是我正在学习程序,写了一个程序,

set term ^;
create procedure qt returns(a int) as
begin
    for select i from t into :a do
        suspend;
end^
set term ;^

但是当我调用这个过程时,我只返回了一行,

execute procedure qt;

明白了,

           A 
============ 
           1 

我觉得我不明白suspend

带有SUSPEND in them are so called selectable procedures. You execute them using SELECT的存储过程:

SELECT * FROM qt

SELECT * FROM qt()

EXECUTE PROCEDURE 语句仅适用于产生单行结果的过程。如果您将它用于 selectable 存储过程,那么它只会生成一行(并在它命中 SUSPEND 时退出)。

针对您关于此文件记录内容的询问:

  • Interbase 6.0 语言参考第 177 页说:

    SUSPEND should not be used in an executable procedure.

  • 在第 178 页上,它显示了 SUSPENDEXITEND 在 selectable 和 execu[=43= 中的行为的 table ] 程序(略作修改以适应):
Procedure type SUSPEND                EXIT                END
Selectable     • Suspends execution   Jumps to final END  • Returns control 
                 of procedure until                         to application
                 next FETCH is issued                     • Sets SQLCODE to 100 
               • Returns output                             (end of record stream)
                 values

Executable     • Jumps to final END   Jumps to final END  • Returns values
               • Not recommended                          • Returns control 
                                                            to application
  • 对于可以生成多行的存储过程(如第 178 页所示),第 179 页描述了使用 SELECT 执行和使用 EXECUTE PROCEDURE 执行时的行为差异。