2009-12-28 6 views
4

Je travaille actuellement sur un projet dans Crystal Reports qui refuse d'utiliser la fonction non documentée WM_CONCAT, ce qui est autorisé dans Oracle 10g. Voici les informations d'en-tête de WM_CONCATOracle Fonction: Répliquer wm_concat

WM_CONCAT(p1 IN VARCHAR2) RETURN VARCHAR2 

Pour utiliser WM_CONCAT Je passe des documents suivants: WM_CONCAT (colonne1); Cette fonction semble accepter une colonne de type varchar2 et renvoie une liste de valeurs séparées par des virgules de la colonne. J'ai actuellement une version personnalisée de cette fonction qui fonctionne (sur mon ordinateur de travail), mais elle n'est pas optimale et manque de réutilisation. Quelqu'un pourrait-il fournir une bonne fonction réutilisable comme WM_CONCAT que je pourrais utiliser?

Répondre

8

Un message d'erreur s'affiche-t-il lorsque vous utilisez wm_concat? Contrairement à des fonctions comme to_char, il appartient à wmsys et vous devrez peut-être utiliser wmsys.wm_concat pour l'utiliser. (sauf si vous créez les synonymes nécessaires bien sûr).

Maintenant pour la question réelle,

Cette technique est appelée agrégation de chaîne.

Vous pouvez trouver beaucoup d'autres alternatives ici.

http://www.oracle-base.com/articles/10g/StringAggregationTechniques.php Pour d'autres méthodes, Chercher "stragg" sur http://asktom.oracle.com Autre lien utile: http://www.orafaq.com/node/2290

Ceci est probablement le plus utilisé. Beaucoup d'équipes écrivent leurs propres fonctions personnalisées qui font plus ou moins la même chose.

CREATE OR REPLACE FUNCTION get_employees (p_deptno in emp.deptno%TYPE) 
    RETURN VARCHAR2 
IS 
    l_text VARCHAR2(32767) := NULL; 
BEGIN 
    FOR cur_rec IN (SELECT ename FROM emp WHERE deptno = p_deptno) LOOP 
    l_text := l_text || ',' || cur_rec.ename; 
    END LOOP; 
    RETURN LTRIM(l_text, ','); 
END; 
/
SHOW ERRORS 

alors que cette solution fonctionne pour varchar2 et le numéro, la meilleure solution générique peut être construit en utilisant l'interface Oracle ODCIAggregate.

http://download-west.oracle.com/docs/cd/B14117_01/appdev.101/b10800/dciaggfns.htm#sthref462

La mise en œuvre pour le même est au premier lien ci-dessus à www.oracle-base.com

+0

Oui, j'ai essayé d'utiliser wm_concat préfixé par wmsys, mais cela ne fonctionne toujours pas. Merci pour le code ci-dessus, mais je suis plus à la recherche d'une fonction GENERIC qui pourrait être utilisée indépendamment des jointures ou des clauses where dans la fonction elle-même. – contactmatt

+0

Ceci est une réponse très tardive, mais quand il s'est avéré que j'ai écrit une méthode comme celle ci-dessus car écrire une méthode "générique" a pris trop de temps dans mon projet actuel. – contactmatt

1

J'ai résolu ce problème en utilisant une technique similaire à la dernière dans l'article base oracle : définissez un type personnalisé TABLE et écrivez une fonction pour agréger une valeur de ce type dans une chaîne. J'ai appelé ma fonction joinstr et vous pouvez l'appeler comme suit:

SELECT joinstr(CAST(MULTISET(SELECT column1 FROM table1) AS my_string_table_type), ',') 
FROM DUAL 

Note: J'étais 9i jusqu'à récemment et n'ont pas examiné COLLECT encore.