Firebird 2.1 almacenado procedimiento para concatenar texto en múltiples filas
-
28-09-2019 - |
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?
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í