Pregunta

Estoy intentando escribir un procedimiento almacenado para concatenar múltiples filas de texto en conjunto para devolverlo como una sola cadena. Por ejemplo:

CREATE TABLE TEST (
 ID INTEGER,
 SEQ INTEGER,
 TEXT VARCHAR(255));

COMMIT;

INSERT INTO TEST (ID, SEQ, TEXT) VALUES (1, 1, "LINE 1");
INSERT INTO TEST (ID, SEQ, TEXT) VALUES (1, 2, "LINE 2");
INSERT INTO TEST (ID, SEQ, TEXT) VALUES (1, 3, "LINE 3");

COMMIT;

SET TERM !!;
CREATE PROCEDURE concat_names (iID INTEGER)
  RETURNS (CONCAT VARCHAR(2000))
AS
DECLARE VARIABLE name VARCHAR(255);
BEGIN
  CONCAT = '';
  FOR SELECT TEXT FROM TEST where id=:iID INTO :name
  DO BEGIN
    CONCAT = CONCAT || name;
  END
END!!
SET TERM ;!!

commit;

Sin embargo cuando corro:

select concat from concat_names(1);

Es siempre devuelve cero filas.

¿Alguna idea?

¿Fue útil?

Solución

Se olvida de suspensión. Su proc debería tener este aspecto:

SET TERM !!;
CREATE PROCEDURE concat_names (iID INTEGER)
  RETURNS (CONCAT VARCHAR(2000))
AS
DECLARE VARIABLE name VARCHAR(255);
BEGIN
  CONCAT = '';
  FOR SELECT TEXT FROM TEST where id=:iID INTO :name
  DO BEGIN
    CONCAT = CONCAT || name;
  END
  SUSPEND;
END!!
SET TERM ;!!

Puede conseguir el mismo resultado sin procedimiento almacenado. Uso LISTA función agregada:

SELECT LIST(text, '') FROM TEST where id=:iID 

El segundo parámetro de lista es un delimitador. Si llama LISTA con sólo el nombre del campo, luego coma '' será utilizada para separar los valores.

Otros consejos

En el caso de la prueba de campo puede ben nula y no se desea establecer para anular el resultado total es útil usar:

 CONCAT = CONCAT || coalesce(name,'');

en lugar de

CONCAT = CONCAT || name;

Sin la utilización de un procedimiento almacenado y utilizando la versión Firebird 2.5, la LISTA función de agregación volverá "separados por comas-concatenación de cadenas de valores no nulos en la columna" *. Usando la tabla de prueba anterior, el SQL

SELECT LIST(TEXT)
    FROM TEST

retornos

línea 1, línea 2, línea 3

Esto puede ser de algún interés.

* Tomado de la página de referencia Firebird aquí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top