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

Ren*_*ino 6 sql firebird stored-procedures

我想知道是否可以返回SELECTFirebird 1.5 中的查询中找到的多行,如下所示:

| 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 ;/
Run Code Online (Sandbox Code Playgroud)

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

声明失败,SQLCODE = -811

单例选择多行

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

有没有办法做到这一点?

Mar*_*eel 7

Firebird有两种类型的存储过程:

可选择的过程包含SUSPEND输出行的关键字,并等待下一次获取.这个关键字的存在是区分这两种类型的唯一因素.

警告:可以使用execute procedure可选择的过程,但在这种情况下,它只生成一行,并且执行将在生成第一行之后结束:之后的其余存储过程SUSPEND将不会执行!它曾经可以从可执行存储过程中"选择",但在Firebird 3中不再可能.

错误"单行选择中的多行"的具体原因是:

SELECT FIELD1, FIELD2 FROM TABLE INTO :VARIABLE1, :VARIABLE2;
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

BEGIN ... END嵌段在技术上是没有必要的,但我更喜欢这里始终使用块.

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

select variable1, variable2 from test;
Run Code Online (Sandbox Code Playgroud)


War*_*ter 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
Run Code Online (Sandbox Code Playgroud)

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

SELECT * FROM TEST;
Run Code Online (Sandbox Code Playgroud)