Oracle Funzione: Replicare wm_concat
-
21-09-2019 - |
Domanda
Io attualmente sto lavorando su un progetto all'interno di Crystal Reports che si rifiuta di utilizzare la funzione WM_CONCAT non documentata, che è consentita all'interno di Oracle 10g. Ecco le informazioni di intestazione WM_CONCAT
WM_CONCAT(p1 IN VARCHAR2) RETURN VARCHAR2
Per usare WM_CONCAT passo le seguenti: WM_CONCAT (column1); Questa funzione sembra accettare una colonna di tipo VARCHAR2, e restituisce un elenco delimitato da virgole dei valori della colonna. Al momento ho una versione personalizzata di questa funzione che funziona (sul mio computer di lavoro), ma non è ottimale e manca di riutilizzabilità. Qualcuno potrebbe fornire una buona funzione, riutilizzabile come WM_CONCAT che potrei usare?
Soluzione
Non si ottiene un messaggio di errore quando si utilizza wm_concat? A differenza di funzioni come to_char, è di proprietà di wmsys e potrebbe essere necessario utilizzare wmsys.wm_concat di usarlo. (A meno che non si creano i sinonimi necessarie, naturalmente).
Ora per la domanda effettiva,
Questa tecnica è chiamata l'aggregazione stringa.
Si potrebbe trovare un sacco di altre alternative qui.
http://www.oracle-base.com/ articoli / 10g / StringAggregationTechniques.php Per altri metodi, cercare "stragg" su http://asktom.oracle.com Un altro link utile: http://www.orafaq.com/node/2290
Questo è probabilmente il più utilizzato. Un sacco di squadre scrivere le proprie funzioni personalizzate che più o meno fare lo stesso.
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
Anche se questa soluzione funziona per VARCHAR2 e il numero, la migliore soluzione generica può essere costruito utilizzando l'interfaccia Oracle ODCIAggregate.
http: // scaricare -west.oracle.com/docs/cd/B14117_01/appdev.101/b10800/dciaggfns.htm#sthref462
L'attuazione per lo stesso è al primo link qui sopra a www.oracle-base.com
Altri suggerimenti
Ho risolto questo utilizzando una tecnica simile a quello ultimo nell'articolo oracolo-base: definire un tipo personalizzato TABLE
e scrivere una funzione per aggregare un valore di questo tipo in una stringa. Ho chiamato la mia funzione joinstr
e poi si può chiamare come segue:
SELECT joinstr(CAST(MULTISET(SELECT column1 FROM table1) AS my_string_table_type), ',')
FROM DUAL
Nota:. Ero in 9i fino a poco tempo e non hanno guardato in ancora COLLECT