Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

ORACLE SQL LISTAGG não retornando o resultado esperado


Isso parece estar relacionado ao bug 19461687 e esta pergunta anterior . Se você despejar o valor agregado de sua consulta em 11gR2 ou 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

No SQL*Plus e no SQL Developer, o valor real é exibido como:
LISTAGG_OUTPUT
----------------------------------------
 A R 4 0 0 1, A R 4 0 0 2

e você não pode copiar o valor do SQL Developer. (No 12cR2 os zeros não aparecem mais no dump, o valor é exibido sem o espaçamento e você pode copiá-lo, então o bug parece ter sido corrigido.)

Esses bytes nulos parecem estar fazendo com que o Toad não exiba o valor, presumivelmente porque ele vê o primeiro byte nulo e o trata como um terminador de string (ou algo nesse sentido).

O SQL Fiddle parece lidar com isso, mas db<>fiddle também parece ter um problema com ele e não retorna nada para o violino inteiro quando essa consulta está presente.

Você pode redefinir sua coluna de tabela como varchar2 em vez de nvarchar2 , mas suponho que seja esse tipo de dados por um motivo, então isso provavelmente não é prático.

Então, você pode convertê-lo como parte da consulta:
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

Ou veja se o patch para o bug 19461687 corrige o problema para você.