Как выбрать процедуру в Firebird 2.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 ответов
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
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.
Пытаться
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)
Как сказал JustMe, вы не можете вызывать хранимые процедуры в select. Вы можете вызвать хранимую процедуру только в разделе ОТ. Другим решением вашей проблемы является создание процедуры выбора, подобной этой:
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)
и получить то, что вы хотите.
Вы не можете вызывать хранимые процедуры в списке выбора 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
Попробуй это
SET TERM ^ ;
CREATE PROCEDURE FN_TEST( Y INTEGER )
RETURNS( X INTEGER)
AS
BEGIN
X = Y + 1;
SUSPEND;
END^
SET TERM ; ^
Используйте UDF для управления вычислениями на полях. Хранимая процедура допускается только в предложении FROM.
Вы можете использовать EXECUTE BLOCK Пожалуйста, посмотрите EXECUTE BLOCK