【问题标题】:How to execute procedure returning resultset in Firebird如何在 Firebird 中执行返回结果集的过程
【发布时间】:2016-04-26 08:01:53
【问题描述】:

我有下表

create table LIST_PIPE_TABLE
(
  ID INT,
  ITEM          VARCHAR(4000),
  IS_FOLDER     VARCHAR(10)
)

有3行数据

insert into LIST_PIPE_TABLE values(1,'Victorias Secret','true')
insert into LIST_PIPE_TABLE values(2,'Porsche','true')
insert into LIST_PIPE_TABLE values(3,'Babbolat','false')

还有一个应该返回结果集的存储过程

CREATE or alter PROCEDURE LIST_PIPE
RETURNS 
(   col1 varchar(4000),
    col2 varchar(10)
)
  AS  
begin
    FOR SELECT ITEM AS ITEM
       ,IS_FOLDER AS IS_FOLDER
      FROM LIST_PIPE_TABLE 
    into :col1, :col2
    do begin       
            suspend;          
     end 
end

当我尝试使用以下语句执行它时

execute procedure LIST_PIPE

返回唯一的顶行

COL1              COL2
Victorias Secret  true

请告知它有什么问题。我应该如何执行它以查看它旨在返回的所有 3 行?

【问题讨论】:

    标签: firebird resultset procedure execute suspend


    【解决方案1】:

    当您在存储过程中有suspend 时,它被称为“可选存储过程”,顾名思义,您可以从中选择,所以:

    select * from LIST_PIPE
    

    【讨论】:

      【解决方案2】:

      作为ain already answered,您需要将SELECT * FROM <your procedure>用于可选过程(即:它包含一个SUSPEND)。

      Interbase 6 Embedded SQL Guide(参见 InterBase 6.0 手册)说:

      可以从应用程序调用两种类型的过程:

      • 选择应用程序可以用来代替SELECT 语句中的表或视图的过程。选择过程必须返回一个或多个值,否则会返回错误结果。
      • 应用程序可以使用EXECUTE PROCEDURE 语句直接调用的可执行过程。可执行过程可能会也可能不会向调用程序返回值。

      这两种过程都使用CREATE PROCEDURE 定义并且具有相同的语法。不同之处在于程序的编写方式和使用方式。 Select 过程总是返回零个或多个行,因此它们对调用程序显示为表或视图。可执行过程只是由调用程序调用的简单例程,只能返回一组值。

      事实上,可以想象单个过程可以用作选择过程或可执行过程,但不建议这样做。一般来说,过程是专门编写用于SELECT 语句(选择过程)或EXECUTE PROCEDURE 语句(可执行过程)。

      在协议级别上,EXECUTE PROCEDURE 语句将始终生成单行结果(可能为空),而SELECT * FROM <procedure> 的行为与从表或视图中选择的行为相同。这意味着如果使用EXECUTE PROCEDURE 调用可选过程,Firebird 本身将只从存储过程中获取一行,然后结束该过程的执行。

      不幸的是,可以将EXECUTE PROCEDURE 与可选择的程序一起使用。 SUSPEND 上的 Interbase 6 语言参考明确提到 SUSPEND 不应在可执行过程中使用。”(措辞很奇怪,因为 SUSPEND 的存在使它可以选择, 虽然这里他们的意思是用EXECUTE PROCEDURE 调用它是不可取的)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 2018-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多