Perché wm_concat non funziona qui?

Ho questa domanda:

(SELECT OBJECT_ID from cr_object_group_entries_vw where object_group_id IN (SELECT ITEM FROM TABLE(CR_FN_SPLIT_STRING('28,56',',')))) 

che restituisce:

inserisci la descrizione dell'immagine qui

Ma quando lo faccio :

 SELECT wm_concat(object_id) FROM (SELECT OBJECT_ID from cr_object_group_entries_vw where object_group_id IN (SELECT ITEM FROM TABLE(CR_FN_SPLIT_STRING('28,56',',')))) 

Ottengo un risultato vuoto … cosa sto sbagliando?

È necessario evitare la funzione wm_concat perché non è documentata e viene scoperta come soluzione alternativa in Oracle 8i times.

Poiché i tempi del vecchio metodo con funzione di aggregazione personalizzata come scoperto da Tom Kyte qui, ci sono alcuni nuovi accorgimenti, mostrati negli esempi di seguito.

Tutti riprodotti in questo SQL Fiddle .

Soluzione alternativa 1: funzione LISTAGG, funziona in 11g:

 select listagg(object_id,',') within group (order by rownum) id_string from cr_object_group_entries_vw 

Soluzione 2: SYS_CONNECT_BY_PATH, funziona da 10g:

 select id_string from ( select rn, substr(sys_connect_by_path(object_id, ','),2) id_string from (select object_id, rownum rn from cr_object_group_entries_vw) start with rn = 1 connect by prior rn + 1 = rn order by rn desc ) where rownum = 1 

Soluzione 3: XMLAGG, funziona da 10g:

 select replace( replace( replace( xmlagg(xmlelement("x",object_id)).getStringVal(), '', ',' ), '', '' ), '', '' ) id_string from cr_object_group_entries_vw 

PS Non sapevo esattamente in quale versione di Oracle sono stati introdotti sys_connect_by_path e xmlagg , ma entrambi funzionano bene su 10.2.0.4.0

Se sei su 11g prova LISTAGG invece di wm_concat per i principianti.

Ho appena visto questo post riguardante wm_concat e wm_concat pensato di condividere alcune informazioni.

Qualsiasi applicazione che si è wm_concat sulla funzione wm_concat non funzionerà dopo l’aggiornamento a 12c . Dal momento che è stato rimosso dall’ultima versione 12c. Vedi Perché non utilizzare la funzione WM_CONCAT in Oracle?

 SQL> select banner from v$version where rownum = 1; BANNER ---------------------------------------------------------------------------- Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production SQL> SELECT object_name 2 FROM dba_objects 3 WHERE owner='WMSYS' 4 AND object_name LIKE 'WM\_%' ESCAPE '\'; OBJECT_NAME ---------------------------------------------------------------------------- WM_REPLICATION_INFO WM_RDIFF WM_PERIOD WM_PERIOD WM_OVERLAPS WM_MEETS WM_LESSTHAN WM_LDIFF WM_INTERSECTION WM_INSTALLATION WM_GREATERTHAN WM_EVENTS_INFO WM_ERROR WM_ERROR WM_EQUALS WM_DDL_UTIL WM_DDL_UTIL WM_CONTAINS WM_COMPRESS_BATCH_SIZES WM_COMPRESSIBLE_TABLES 20 rows selected. 

Riceverai un errore ” identificatore non valido “:

 SQL> SELECT banner FROM v$version; BANNER ---------------------------------------------------------------------------- Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production PL/SQL Release 12.1.0.1.0 - Production CORE 12.1.0.1.0 Production TNS for 64-bit Windows: Version 12.1.0.1.0 - Production NLSRTL Version 12.1.0.1.0 - Production SQL> SELECT deptno, wm_concat(ename) FROM emp; SELECT deptno, wm_concat(ename) FROM emp * ERROR at line 1: ORA-00904: "WM_CONCAT": invalid identifier 

Pertanto, non ha senso affidarsi a una funzionalità non documentata che non è più disponibile nelle ultime versioni.

Per soluzioni alternative, consultare Oracle String Aggregation Techniques

Non sembra che tu stia facendo qualcosa di sbagliato. Con una funzione dummy table per restituire i dati che hai mostrato, wm_concat funzionato per me:

 select wm_concat(object_id) from (select object_id from cr_object_group_entries_vw where object_group_id in (select item from table(cr_fn_split_string('28,56',',')))) / WM_CONCAT(OBJECT_ID) -------------------------------------------------------------------------------- 36,1,11,121,13,14,17,18,2,24,3,32,33,34,35,36,37,38,39,40,42,43,44,6,7,8,81 

Hai taggato la domanda come [11g]; come ha detto @beherenow, se è ansible, si dovrebbe usare il lisgagg supportato sul wm_concat non supportato, sebbene sia disponibile solo da 11gR2, penso:

 select listagg(object_id, ',') within group (order by object_id) from cr_object_group_entries_vw where object_group_id in (select item from table(cr_fn_split_string('28,56',','))) / LISTAGG(OBJECT_ID,',')WITHINGROUP(ORDERBYOBJECT_ID) --------------------------------------------------------------------------- 1,11,121,13,14,17,18,2,24,3,32,33,34,35,36,36,37,38,39,40,42,43,44,6,7,8,81 

SQL Fiddle (solo per listagg , dal momento che non supporta wm_concat – forse wm_concat l’istanza, ma dovrebbe essere un errore?)