2008-10-08 8 views
5

mon but est d'écrire un proc stocké qui peut rassembler toutes les valeurs de champ de plusieurs rangées dans une seule variable de sortie (peut-être varchar (some_length)). Cela peut sembler une solution étrange mais je suis assez positif c'est le seul que je peux utiliser dans cette situation. Je n'ai jamais utilisé Firebird auparavant et les procs stockés ont l'air très différents des autres systèmes DB connus. Mon Firebird est 1.5 et le dialecte 3 (je ne sais pas ce que cela signifie). Alors peut-être que quelqu'un pourrait m'aider avec un exemple d'algorithme.Firebird a stocké la procédure pour concaténer toutes les valeurs de champ de plusieurs rangées

Répondre

5

La procédure suivante fait ce que vous décrivez:

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; 

Mais je doute la sagesse de cette solution. Comment savez-vous que VARCHAR est assez long pour toutes les lignes de votre jeu de données?

Il est beaucoup plus facile et plus sûr d'exécuter une requête pour renvoyer le résultat à une application ligne par ligne. Chaque langage de programmation d'application a des méthodes pour concaténer les chaînes, mais plus important encore, ils ont des méthodes plus flexibles pour gérer la croissance des données. Par ailleurs, "dialecte" dans Firebird et InterBase fait référence à un mode de compatibilité qui a été introduit afin que les applications développées pour InterBase 5.x puissent fonctionner avec les versions ultérieures d'InterBase et Firebird. C'était il y a presque dix ans, et autant que je sache, il n'y a pas besoin aujourd'hui d'utiliser quoi que ce soit plus bas que le dialecte 3.

+0

Si vous utilisez Firebird 2.1, vous pouvez utiliser la fonction LIST globale avec fournit blob textuelle en conséquence. C'est à dire. aucune limite de champ varchar. –

+1

Si je me souviens, vous ne pouvez pas déclarer un paramètre de procédure ou une valeur de retour avec un type de données BLOB ou ARRAY. –

+1

Toute valeur nulle pourrait briser cette solution. – Nelson

0

Vous devez tester les valeurs NULL lorsque concaténer, voici un exemple pour deux champs et un séparateur entre eux:

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

Le retour de plusieurs lignes à l'aide de procédures stockées Firebird est très simple.

Ne pas utiliser:

execute procedure proc_name(value); 

Utilisez plutôt le:

select * from proc_name(value); 
Questions connexes