Oracle
 sql >> Database >  >> RDS >> Oracle

ORACLE SQL LISTAGG non restituisce il risultato previsto

Questo sembra essere correlato al bug 19461687 e questa domanda precedente . Se scarichi il valore aggregato dalla tua query in 11gR2 o 12cR1 vedrai:

LISTAGG_OUTPUT
--------------------------------------------------------------------------------------------------
Typ=1 Len=25 CharacterSet=AL32UTF8: 0,41,0,52,0,34,0,30,0,30,0,31,2c,0,41,0,52,0,34,0,30,0,30,0,32

In SQL*Plus e SQL Developer il valore effettivo viene visualizzato come:

LISTAGG_OUTPUT
----------------------------------------
 A R 4 0 0 1, A R 4 0 0 2

e non puoi copiare il valore da SQL Developer. (In 12cR2 gli zeri non compaiono più nel dump, il valore viene visualizzato senza la spaziatura e puoi copiarlo, quindi il bug sembra essere stato corretto.)

Questi byte nulli sembrano far sì che Toad non visualizzi affatto il valore, presumibilmente perché vede il primo byte nullo e lo tratta come un terminatore di stringa (o comunque qualcosa del genere).

SQL Fiddle sembra farcela, ma anche db<>fiddle sembra avere un problema e non restituisce nulla per l'intero violino quando è presente quella query.

Puoi ridefinire la colonna della tabella come varchar2 invece di nvarchar2 , ma presumo che sia quel tipo di dati per un motivo, quindi probabilmente non è pratico.

Quindi potresti invece lanciarlo come parte della query:

SELECT LISTAGG(CAST(MOD_CODE AS VARCHAR2(12)),',')
  WITHIN GROUP (ORDER BY MOD_CODE) LISTAGG_OUTPUT
FROM XOTEST_A
WHERE MOD_CODE IN ('AR4001','AR4002');

LISTAGG_OUTPUT
----------------------------------------
AR4001,AR4002

Oppure verifica se la patch per il bug 19461687 risolve il problema per te.