2011-03-03 37 views
8

Estoy usando Firebird Embedded v2.5. ¿Cómo usar los procedimientos en la consulta (SELECCIONAR)?Cómo SELECCIONAR un PROCEDIMIENTO en Firebird 2.5

Mi procedimiento:

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

Quiero que algún campo de la tabla modificada por algún procedimiento, así:

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 

necesita resultados (tabla):

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

Esto funciona bien en PostgreSQL, pero no sé cómo hacer esto en Firebird.

+0

¿Cuál es exactamente tu problema? ¿Recibes un mensaje de error? En caso afirmativo, publíquelo –

Respuesta

1

No puede llamar a procedimientos almacenados en la lista de selección de Firebird. Debe escribir el procedimiento seleccionable con el resultado deseado o escribir una función UDF para hacer lo que tiene en el procedimiento fn_test.

para su caso de la manera más simple es:

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

Trate

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' no se puede seleccionar (es un [procedimiento ejecutable] (https://ib-aid.com/download/docs/firebird-language-reference-2.5/fblangref25-psql-storedprocs.html)) La solución propuesta produce un BLR de solicitud no válida en el error de compensación ..._. – manlio

1

Como JustMe said, no se puede llamar a procedimientos almacenados en una selecta. Puede llamar al procedimiento almacenado solo en la sección FROM. Otra solución para su problema es crear un procedimiento de selección como esta:

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 

Después de ejecutar ese código, puede simplemente consulta select * from myproc(4) y obtener lo que quiere.

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' no se puede seleccionar (es un [procedimiento ejecutable] (https://ib-aid.com/download/docs/firebird-language-reference-2.5/fblangref25-psql-storedprocs.html)). La solución propuesta produce un BLR de solicitud no válida en el error de compensación ..._. – manlio

1

Use UDF para gestionar el cálculo en los campos. El procedimiento almacenado se admite solo en la cláusula FROM.

0

Puede utilizar ejecute el bloque favor, eche un vistazo EXECUTE BLOCK

0

Prueba este

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

FN_TEST es un procedimiento ejecutable: se le puede llamar a través de la declaración EXECUTE PROCEDURE y devuelve un único conjunto de parámetros de salida.

En Firebird 2.x solo se puede usar un procedimiento almacenado seleccionable como una vista/tabla (consulte Firebird Stored Procedures).

Así:

SELECT FN_TEST(some_table_field) AS field_modified 
FROM tb_test 

produce un BLR petición no válida en el desplazamiento ... error.

podría cambiar su procedimiento como suggested pero, en realidad, la característica que necesita se ha introducido en Firebird 3 en forma de 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 

Más detalles en Functions with PSQL in Firebird 3.

Cuestiones relacionadas