我想知道是否可以在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。
有办法吗?
答案 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;
祝你好运!