2008-10-08 53 views
5

mi objetivo es escribir un procedimiento almacenado que puede recoger todos los valores de campo de múltiples filas en una sola variable de salida (tal vez varchar (some_length)). Puede parecer una solución extraña, pero estoy bastante seguro de que es el único que puedo usar en esa situación. No he usado Firebird anteriormente y los procesos almacenados se ven de manera muy diferente que en otros sistemas de bases de datos conocidos. Mi Firebird es 1.5 y dialecto 3 (no estoy seguro de lo que significa). Así que tal vez alguien podría ayudarme con un ejemplo de algoritmo.Firebird procedimiento almacenado para concatenar todos los valores de campo de varias filas

Respuesta

5

el siguiente procedimiento se hace lo que usted describe:

SET TERM !!; 
CREATE PROCEDURE concat_names 
    RETURNS (concat VARCHAR(2000)) 
AS 
DECLARE VARIABLE name VARCHAR(100); 
BEGIN 
    concat = ''; 
    FOR SELECT first_name || ' ' || last_name FROM employee INTO :name 
    DO BEGIN 
    concat = concat || name || ', '; 
    END 
END!! 
SET TERM ;!! 
EXECUTE PROCEDURE concat_names; 

Pero cuestionar la conveniencia de esta solución. ¿Cómo sabe que VARCHAR es lo suficientemente largo para todas las filas en su conjunto de datos deseado?

Es mucho más fácil y más seguro para ejecutar una consulta para devolver el resultado a una fila de aplicaciones por fila. Cada lenguaje de programación de aplicaciones tiene métodos para concatenar cadenas, pero lo más importante es que tienen métodos más flexibles para administrar el crecimiento de los datos.

Por cierto, "dialecto" en Firebird e InterBase se refiere a un modo de compatibilidad que se introdujo para que las aplicaciones desarrolladas para InterBase 5.x puedan funcionar con las versiones posteriores de InterBase y Firebird. Eso fue hace casi diez años, y que yo sepa no hay necesidad hoy en día para usar nada más bajo que el dialecto 3.

+0

Si utiliza Firebird 2.1, puede utilizar la función de agregado LISTA proporciona con BLOB textual como resultado. Es decir. sin límite de campo varchar. –

+1

Si no recuerdo mal, no puede declarar un parámetro de procedimiento o un valor de retorno con un tipo de datos BLOB o ARRAY. –

+1

Cualquier valor nulo rompería esta solución. – Nelson

0

Usted tiene que probar para valores nulos al concatenar, aquí hay un ejemplo de dos campos y un separador entre ellos:

CREATE PROCEDURE CONCAT(
    F1 VARCHAR(385), 
    F2 VARCHAR(385), 
    SEPARATOR VARCHAR(10)) 
RETURNS (
    RESULT VARCHAR(780)) 
AS 
begin 

    if ((:f1 is not null) and (:f1 <> '')) then 
    result = :f1; 

    if ((:f2 is not null) and (:f2 <> '')) then 
    if ((result is not null) and (result <> '')) then 
     begin 
     if ((:separator is not null) and (separator <> '')) then 
      result = result||separator||f2; 
     else 
      result = result||f2; 
     end 
    else 
     result = f2; 

    suspend; 
end 
0

Devolución de varias filas utilizando procedimientos almacenados Firebird es muy, muy fácil.

No utilizar:

execute procedure proc_name(value); 

utilizar en su lugar el:

select * from proc_name(value); 
Cuestiones relacionadas