如何暂停在firebird中工作?

时间:2015-10-14 07:18:53

标签: 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 ;^

但是当我调用这个程序时,我只会回来一行,

execute procedure qt;

我明白了,

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

我想我不理解suspend

1 个答案:

答案 0 :(得分:8)

其中包含SUSPEND的存储过程称为可选程序。您可以使用SELECT执行它们:

SELECT * FROM qt

SELECT * FROM qt()

EXECUTE PROCEDURE语句仅适用于生成单行结果的过程。如果您将它用于可选择的存储过程,那么它只会产生一行(当它到达SUSPEND时退出)。

回应您对此记录内容的询问:

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

    不应在可执行程序中使用SUSPEND。

  • 在第178页上,它显示了SUSPENDEXITEND在可选和可执行程序中的行为表(略微修改为适合):
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执行时的行为差异。