Firebird 2.1 procédure stockée au texte concatenate sur plusieurs lignes
-
28-09-2019 - |
Question
Je suis en train d'écrire une procédure stockée pour concaténer plusieurs lignes de texte ensemble pour le retourner comme une seule chaîne. Par exemple:
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;
Cependant quand je lance:
select concat from concat_names(1);
Il retourne toujours zéro lignes.
Toutes les idées?
La solution
Vous oubliez de SUSPENDRE. Votre proc devrait ressembler à ceci:
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 ;!!
Vous pouvez obtenir le même résultat sans procédure stockée. Utilisez la fonction LIST globale:
SELECT LIST(text, '') FROM TEST where id=:iID
Le second paramètre de liste est un delimiter. Si vous appelez LIST avec seulement le nom du champ, puis une virgule « » sera utilisé pour séparer les valeurs.
Autres conseils
Dans le cas du test de champ peut ben nul et vous ne voulez pas définir null le résultat tout il est utile d'utiliser:
CONCAT = CONCAT || coalesce(name,'');
au lieu de
CONCAT = CONCAT || name;
Sans l'utilisation d'un Proc et en utilisant la version stockée Firebird 2,5, LISTE fonction d'agrégation retourne « concaténation de chaînes séparées par des virgules, des valeurs non nulles dans la colonne » *. Utilisation de la table de test mentionné ci-dessus, le SQL
SELECT LIST(TEXT)
FROM TEST
retourne
LINE 1, LINE 2, LINE 3
Cela peut être intéressant.
* Extrait de la page de référence Firebird ici