Frage

Ich arbeite derzeit an einem Projekt innerhalb von Crystal Reports, in dem sich die nicht dokumentierte Funktion WM_CONCAT weigert, die innerhalb von Oracle 10g zulässig ist. Hier ist die WM_CONCAT -Headerinformationen

WM_CONCAT(p1 IN VARCHAR2) RETURN VARCHAR2

Um WM_CONCAT zu verwenden, übergasse ich es folgendes: Wm_concat (Spalte1); Diese Funktion scheint eine Spalte vom Typ varchar2 zu akzeptieren und gibt eine Comma -abgrenzte Liste von Werten aus der Spalte zurück. Ich habe derzeit eine benutzerdefinierte Version dieser Funktion, die (auf meinem Arbeitscomputer) funktioniert, ist jedoch nicht optimal und es fehlt die Wiederverwendbarkeit. Könnte jemand eine gute, wiederverwendbare Funktion wie WM_CONCAT bieten, die ich verwenden könnte?

War es hilfreich?

Lösung

Erhalten Sie eine Fehlermeldung, wenn Sie WM_CONCAT verwenden? Im Gegensatz zu Funktionen wie to_char gehört es WMSYS und Sie müssen möglicherweise wmsys.wm_concat verwenden, um es zu verwenden. (Es sei denn, Sie erstellen natürlich die erforderlichen Synonyme).

Nun zur tatsächlichen Frage,

Diese Technik wird als String -Aggregation bezeichnet.

Hier können Sie viele andere Alternativen finden.

http://www.oracle-base.com/articles/10g/stringaggregationtechniques.phpFür andere Methoden suchen Sie nach "Stragg" auf http://asktom.oracle.comEin weiterer nützlicher Link: http://www.orafaq.com/node/2290

Dies ist wahrscheinlich das am häufigsten verwendete. Viele Teams schreiben ihre eigenen benutzerdefinierten Funktionen, die mehr oder weniger dasselbe tun.

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

Während diese Lösung für VARCHAR2 und Nummer funktioniert, kann die beste generische Lösung mithilfe der Oracle Odciaggregate -Schnittstelle erstellt werden.

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

Die Implementierung für dasselbe befindet sich am ersten Link oben unter www.oracle-base.com

Andere Tipps

Ich habe dies mit einer Technik gelöst, die dem letzten im Oracle-Base-Artikel ähnelt: Definieren Sie einen Brauch TABLE Geben Sie eine Funktion ein und schreiben Sie einen Wert dieses Typs in eine Zeichenfolge. Ich rief meine Funktion an joinstr Und dann können Sie es wie folgt nennen:

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

HINWEIS: Ich war bis vor kurzem bei 9i und habe mich noch nicht in den Sammeln gesucht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top