WM_CONCAT
A partir do Oracle 11g é possível concatenar o resultado de várias linhas de um campo no SELECT usando o comando LISTAGG. Isso muitas vezes se mostra um recurso útil quando há a necessidade de exibir esses resultados em uma única linha.
Mas se a versão for inferior a 11g, o que fazer ?
Existe uma função não documentado chamada WM_CONCAT. Ela funciona da mesma maneira que o LISTAGG, mas com algumas limitações.
Vamos a um exemplo prático de utilização:
SELECT a.desc_depto departamento,
WM_CONCAT(b.cod_setor) setores
FROM setor b,
departamento a
WHERE b.cod_depto = a.cod_depto
AND a.cod_depto = 1
GROUP BY a.desc_depto
departamento setores
----------------------------- -------------------------------------------------------------------
SQL> ADMINISTRAÇÃO FINANCEIRO,SEGURANÇA,CONTROLADORIA
O mesmo resultado pode ser obtido em outra abordagem:
SELECT a.desc_depto departamento,
(SELECT WM_CONCAT(b.cod_setor)
FROM setor b
WHERE b.cod_depto = a.cod_depto) setores
FROM departamento a
WHERE a.cod_depto = 1
departamento setores
----------------------------- -------------------------------------------------------------------
SQL> ADMINISTRAÇÃO FINANCEIRO,SEGURANÇA,CONTROLADORIA
Em ambientes 11g e superior, a mesma Query teria a seguinte sintaxe:
SELECT a.desc_depto departamento,
(SELECT LISTAGG(b.cod_setor,’-’)
FROM setor b
WHERE b.cod_depto = a.cod_depto) setores
FROM departamento a
WHERE a.cod_depto = 1
departamento setores
----------------------------- -------------------------------------------------------------------
SQL> ADMINISTRAÇÃO FINANCEIRO-SEGURANÇA-CONTROLADORIA
A função WM_CONCAT substitui completamente a LISTAGG em bases Oracle inferiores a 11g, a única limitação dela é que por ser uma função não documentada, não tem suporte da Oracle.
Isso pode ser visto na nota MOS Note ID 1336219.1
Fonte
Abraço