如何在Firebird 2.5中选择一个过程

时间:2011-03-03 08:03:20

标签: select stored-procedures firebird firebird2.5

我正在使用Firebird Embedded v2.5。如何在查询中使用程序(SELECT)?

我的程序:

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中这样做。

8 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

FN_TEST是一个可执行程序:它可以通过EXECUTE PROCEDURE语句调用,并返回一组输出参数。

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

所以:

SELECT FN_TEST(some_table_field) AS field_modified
FROM   tb_test

在偏移... 错误时产生无效请求BLR。

您可以将您的程序更改为suggested,但实际上,您需要的功能已在Firebird 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中的详细信息。

答案 2 :(得分: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)

答案 3 :(得分: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

答案 4 :(得分:1)

作为JustMe said,您无法在select中调用存储过程。您只能在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 :(得分:1)

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

答案 6 :(得分:1)

试试这个

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

答案 7 :(得分:0)

您可以使用EXECUTE BLOCK请查看EXECUTE BLOCK