我有一个表 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

最佳答案

其中带有 SUSPEND 的存储过程称为可选过程。您使用 SELECT 执行它们:

SELECT * FROM qt
或者
SELECT * FROM qt()
EXECUTE PROCEDURE 语句仅用于产生单行结果的过程。如果将它用于可选择的存储过程,那么它只会生成一行(并在遇到 SUSPEND 时退出)。
回应您对有关此记录的内容的询问:
  • 第 177 页的 Interbase 6.0 语言引用说:

  • 在第 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 执行时的行为差异。
  • 10-07 22:33