Oracle Fonction: Répliquer wm_concat
-
21-09-2019 - |
Question
Je travaille actuellement sur un projet dans Crystal Reports qui refuse d'utiliser la fonction non documentée WM_CONCAT, qui est admissible au sein d'Oracle 10g. Voici les informations d'en-tête de 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 retourne une liste délimitée par des virgules des valeurs de la colonne. J'ai actuellement une version personnalisée de cette fonction qui fonctionne (sur mon ordinateur de travail), mais ce n'est pas optimale et ne dispose pas de réutilisation. Quelqu'un pourrait-il fournir une bonne fonction réutilisable comme WM_CONCAT que je pourrais utiliser?
La solution
Avez-vous un message d'erreur lorsque vous utilisez wm_concat? Contrairement à des fonctions telles que to_char, il appartient à wmsys et vous pourriez avoir besoin d'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 chaîne.
Vous pouvez trouver beaucoup d'autres alternatives ici.
http://www.oracle-base.com/ articles / 10g / StringAggregationTechniques.php Pour les 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 plus ou moins faire 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: // Télécharger -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
Autres conseils
Je l'ai résolu ce problème en utilisant une technique similaire à la dernière dans l'article Oracle-base: définir un type de TABLE
personnalisé et écrire une fonction d'agréger une valeur de ce type dans une chaîne. J'ai appelé joinstr
ma fonction 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 encore examiné COLLECT