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连接.
有没有办法做到这一点?
Firebird有两种类型的存储过程:
可执行程序最多产生一行,并使用以下命令执行:
execute procedure <procedurename>
Run Code Online (Sandbox Code Playgroud)可选择的过程可以生成多行,并使用以下命令执行:
select * from <procedurename>
Run Code Online (Sandbox Code Playgroud)
或者带参数:
select * from <procedurename>(param, ...)
Run Code Online (Sandbox Code Playgroud)可选择的过程包含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)
您需要的是“可选择的存储过程”。基本上,您必须将代码更改为如下所示:
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)
| 归档时间: |
|
| 查看次数: |
2503 次 |
| 最近记录: |