是否可以在Firebird的存储过程中返回多行?

时间:2017-02-14 19:45:47

标签: sql stored-procedures firebird

我想知道是否可以在Firebird 1.5中的SELECT查询中找到多行,如下所示:

| FIELD1 | FIELD 2 |
--------------------
| 1.00   | 1       |
| 2.00   | 2       |
| 3.00   | 3       |

SET TERM /;

CREATE OR ALTER PROCEDURE TEST
RETURNS (VARIABLE1 DOUBLE PRECISION, VARIABLE2 INTEGER)
AS
BEGIN
  SELECT FIELD1, FIELD2 FROM TABLE INTO :VARIABLE1, :VARIABLE2;
END/

EXECUTE PROCEDURE TEST/

SET TERM ;/

假设查询返回多个结果/行,则抛出以下错误:

  

声明失败,SQLCODE = -811

     

单身选择

中的多行

显然,Firebird的引擎不允许我在变量中返回多个值。我正在开发一个Python软件,我希望得到一个像元组这样的元组,例如,[(1.00,1),(2.00,2),(3.00,3)],基于关于程序TEST。我使用kinterbasdb模块连接GDB。

有办法吗?

2 个答案:

答案 0 :(得分:7)

Firebird有两个types of stored procedures

  • 可执行程序最多产生一行,并使用:

    执行
    execute procedure <procedurename>
    
  • 可选程序可以生成多行并使用以下命令执行:

    select * from <procedurename>
    

    或带参数:

    select * from <procedurename>(param, ...)
    

可选程序包含SUSPEND关键字,该关键字输出行并等待下一次提取。此关键字的存在是区分这两种类型的唯一方法。

警告:可以在可选择的过程中使用execute procedure,但在这种情况下,它只会生成一行,并且在生成第一行之后执行将结束:存储过程的其余部分SUSPEND之后不会被执行!过去也可以选择&#39;来自可执行存储过程,但在Firebird 3中不再可能。

错误的具体原因&#34;单行选择&#34; 中的多行是行:

SELECT FIELD1, FIELD2 FROM TABLE INTO :VARIABLE1, :VARIABLE2;

select ... into ...语句仅允许生成单行(也称为单例选择)。如果您期望多行,则需要使用for select ... into ... do,这允许您遍历生成的行。

将此与suspend相结合将导致:

CREATE OR ALTER PROCEDURE TEST
RETURNS (VARIABLE1 DOUBLE PRECISION, VARIABLE2 INTEGER)
AS
BEGIN
  FOR SELECT FIELD1, FIELD2 FROM TABLE INTO :VARIABLE1, :VARIABLE2
  DO
  BEGIN
      SUSPEND;
  END
END

BEGIN ... END - 块在技术上不是必需的,但我更喜欢在这里使用块。

然后您可以执行以下操作:

select variable1, variable2 from test;

答案 1 :(得分:4)

您需要的是“可选存储过程”。基本上,您必须将代码更改为以下内容:

CREATE OR ALTER PROCEDURE TEST
RETURNS (VARIABLE1 DOUBLE PRECISION, VARIABLE2 INTEGER)
AS
BEGIN
  for SELECT FIELD1, FIELD2 FROM TABLE INTO :VARIABLE1, :VARIABLE2
   do SUSPEND;
END

并使用SELECT调用该过程,如下所示:

SELECT * FROM TEST;
祝你好运!