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?

Était-ce utile?

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

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