Pular para o conteúdo

WM_CONCAT no Oracle: O que fazer em versões inferiores a 11g ?

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

Quão útil foi este post ?

Clique em uma estrela para classificar o post

nota média 5 / 5. Contagem de votos: 26

Sem votos ! Seja o primeiro a classificar !

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress