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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top