Orakelfunktion: Replizieren Sie WM_CONCAT
-
21-09-2019 - |
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?
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.