2011-03-03 64 views
8

我正在使用Firebird Embedded v2.5。如何在查询中使用过程(SELECT)?如何选择Firebird 2.5中的过程

我的方法:

SET TERM^; 
CREATE PROCEDURE FN_TEST(Y INTEGER) 
RETURNS(X INTEGER) 
AS 
BEGIN 
X = Y + 1; 
END^ 
SET TERM ;^

我想列出表的一些领域的一些程序修改,如下所示:

SELECT some_table_field_1, 
     fn_test(4) AS zzz, 
     some_table_field_2, 
     fn_test(some_table_field_2) AS field_2_modified 
FROM tb_test 

需要的结果(表):

some_table_field_1  zzz   some_table_field_2  field_2_modified 
--------------------------------------------------------------------------- 
aaa     5   14      15 
bbb     5   23      24 
www     5   75      76 

这个东西在PostgreSQL中工作正常,但我不知道如何在Firebird中做到这一点。

+0

你的问题到底是什么?你有错误信息吗?如果是,发布 – 2011-03-03 08:12:10

回答

1

您无法在Firebird的选择列表中调用存储过程。您必须编写具有期望结果的可选过程或编写一个UDF函数来执行您在fn_test过程中的操作。

对于您的情况下,最简单的方法是:

SELECT some_table_field_1, 
     5 AS zzz, 
     some_table_field_2, 
     (some_table_field_2 + 1) AS field_2_modified 
FROM tb_test 
2

尝试

SELECT some_table_field_1, 
    fn_test.x AS zzz, 
    some_table_field_2, 
FROM tb_test 
LEFT JOIN fn_test(some_table_field_1) ON (1 = 1) 
+0

'fn_test'不可选(这是[可执行程序](https://ib-aid.com/download/docs/firebird-language-reference-2.5/fblangref25-psql-storedprocs.html) )。建议的解决方案会在偏移量..._错误处生成一个无效的请求BLR。 – manlio 2017-04-26 13:31:01

1

由于JustMe said,你不能说在选择存储过程。您只能在FROM部分中调用存储过程。你的问题的另一个解决方案是创建一个这样的选择程序:运行代码

create or alter procedure myproc (
n integer) 
returns (
field_1 integer, 
zzz integer, 
field_2 integer, 
modified_field_2 integer) 
as 
declare variable i integer; 
begin 
    for 
    select some_table_field_1, :n+1 as zzz, some_table_field_2, (some_table_field_2+1) as field_2_modified 
    from tb_test 
    into :field_1, :zzz, :field_2, :modified_field_2 
    do begin 
    suspend; 
    end 
end 

后,你可以简单地查询select * from myproc(4)并得到你想要的。

5
SELECT some_table_field_1, 
    (select X from fn_test(4)) AS zzz, 
    some_table_field_2, 
    (select X from fn_test(some_table_field_2)) AS field_2_modified 
FROM tb_test 
+0

'fn_test'不可选(这是[可执行程序](https://ib-aid.com/download/docs/firebird-language-reference-2.5/fblangref25-psql-storedprocs.html))。建议的解决方案会在偏移量..._错误处生成一个无效的请求BLR。 – manlio 2017-04-26 13:29:44

1

使用UDF来管理字段的计算。 仅在FROM子句中引用存储过程。

0

试试这个

SET TERM^; 
CREATE PROCEDURE FN_TEST(Y INTEGER) 
RETURNS(X INTEGER) 
AS 
BEGIN 
X = Y + 1; 
SUSPEND; 
END^ 
SET TERM ;^
2

FN_TEST可执行程序:它可以通过EXECUTE PROCEDURE声明被调用,它返回一个单套输出参数。

在Firebird 2.x中只有一个可选择的存储过程可以作为视图/表使用(见Firebird Stored Procedures)。

所以:

SELECT FN_TEST(some_table_field) AS field_modified 
FROM tb_test 

产生偏移量...错误的无效请求BLR。

你可以改变你的程序,suggested但实际上,你所需要的功能已在火鸟3引入的stored function形式:

CREATE FUNCTION FN_TEST(Y INT) RETURNS INT 
AS 
BEGIN 
    RETURN Y + 1; 
END; 

SELECT FN_TEST(4) AS zzz 
FROM tb_test 

的进一步细节Functions with PSQL in Firebird 3

相关问题