如何暂停在firebird中工作?

eri*_*icj 7 firebird

我有一个表t,其中一列是int类型,有几行.我想循环它.当然,我可以为此编写一个选择查询.但我正在学习程序并写了一个程序,

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

但是当我打电话给这个程序时,我只回到一行,

execute procedure qt;
Run Code Online (Sandbox Code Playgroud)

我知道了,

           A 
============ 
           1 
Run Code Online (Sandbox Code Playgroud)

我想我不明白suspend.

Mar*_*eel 9

带有a的存储过程SUSPEND就是所谓的可选程序.你执行它们SELECT:

SELECT * FROM qt
Run Code Online (Sandbox Code Playgroud)

要么

SELECT * FROM qt()
Run Code Online (Sandbox Code Playgroud)

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

回答您关于此事记录的询问:

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

    不应在可执行过程中使用SUSPEND.

  • 在页178上,它显示了一个表的行为SUSPEND,EXITEND在可选和可执行的过程中(略微修改为适合):
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
Run Code Online (Sandbox Code Playgroud)
  • 对于可以生成多行的存储过程(如第178页所示),第179页描述了执行SELECT和执行时的行为差异EXECUTE PROCEDURE.