sql >> Base de Datos >  >> RDS >> Oracle

ORACLE SQL LISTAGG no devuelve el resultado esperado

Esto parece estar relacionado con el error 19461687 y esta pregunta anterior . Si descarga el valor agregado de su consulta en 11gR2 o 12cR1, verá:

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

En SQL*Plus y SQL Developer, el valor real se muestra como:

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

y no puede copiar el valor de SQL Developer. (En 12cR2, los ceros ya no aparecen en el volcado, el valor se muestra sin el espacio y puede copiarlo, por lo que parece que el error se ha solucionado).

Esos bytes nulos parecen estar causando que Toad no muestre el valor en absoluto, presumiblemente porque ve el primer byte nulo y lo trata como un terminador de cadena (o algo por el estilo de todos modos).

SQL Fiddle parece hacer frente a esto, pero db<>fiddle también parece tener un problema y no devuelve nada para todo el violín cuando esa consulta está presente.

Podría redefinir la columna de su tabla como varchar2 en lugar de nvarchar2 , pero supongo que es ese tipo de datos por una razón, por lo que probablemente no sea práctico.

Así que podría convertirlo como parte de la consulta en su lugar:

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

O vea si el parche para el error 19461687 soluciona el problema por usted.