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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top