9

我正在使用 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 中执行此操作。

4

8 回答 8

6
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
于 2012-02-21T07:45:12.307 回答
4

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

在 Firebird 2.x 中,只有可选择的存储过程可以“用作”视图/表(请参阅Firebird 存储过程)。

所以:

SELECT FN_TEST(some_table_field) AS field_modified
FROM   tb_test

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

您可以按照建议更改您的程序,但实际上,您需要的功能已在 Firebird 3 中以存储函数的形式引入:

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

SELECT FN_TEST(4) AS zzz
FROM   tb_test

Firebird 3 中使用 PSQL 的函数中的更多详细信息。

于 2017-04-26T14:24:38.567 回答
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)
于 2011-03-30T11:26:08.057 回答
1

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

于 2012-02-28T22:33:23.297 回答
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
于 2011-03-10T10:40:22.210 回答
1

尝试这个

SET TERM ^ ;
CREATE PROCEDURE FN_TEST( Y INTEGER )
RETURNS( X INTEGER)
AS
BEGIN
X = Y + 1;
SUSPEND;
END^
SET TERM ; ^
于 2014-07-18T09:09:29.093 回答
1

正如JustMe 所说,您不能在选择中调用存储过程。您只能在 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)并获得所需的内容。

于 2012-02-21T01:41:33.473 回答
0

您可以使用 EXECUTE BLOCK 请看一下EXECUTE BLOCK

于 2013-06-17T04:35:09.933 回答