Как выбрать процедуру в Firebird 2.5 - PullRequest
8 голосов
/ 03 марта 2011

Я использую 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 ]

5 голосов
/ 21 февраля 2012
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
3 голосов
/ 26 апреля 2017

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

Дополнительная информация в Функции с PSQL в Firebird 3 .

2 голосов
/ 30 марта 2011

Попробуйте

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)
1 голос
/ 18 июля 2014

Попробуйте это

SET TERM ^ ;
CREATE PROCEDURE FN_TEST( Y INTEGER )
RETURNS( X INTEGER)
AS
BEGIN
X = Y + 1;
SUSPEND;
END^
SET TERM ; ^
1 голос
/ 29 февраля 2012

Используйте UDF для управления вычислениями на полях. Хранимая процедура допускается только в предложении FROM.

1 голос
/ 21 февраля 2012

Как сказал JustMe , вы не можете вызывать хранимые процедуры для выбора.Вы можете вызвать хранимую процедуру только в разделе ОТ.Другое решение вашей проблемы - создать такую ​​выбираемую процедуру, как эта:

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) и получить то, что вы хотите.

1 голос
/ 10 марта 2011

Вы не можете вызывать хранимые процедуры в списке выбора 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
0 голосов
/ 17 июня 2013

Вы можете использовать EXECUTE BLOCK Пожалуйста, посмотрите EXECUTE BLOCK

...