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

Sergio Willians

Sergio Willians

Sergio Willians é o fundador do GPO (Grupo de Profissionais Oracle) e possui quase 30 anos de experiência em tecnologias Oracle, sendo especialista em desenvolvimento Forms/Reports, PL/SQL e EBS (E-Business Suite) nos módulos Receivables, Payables e General Ledger. Atualmente trabalha na Scania Latin America, onde se dedica à área de integração de dados com Confluent Kafka. Sua paixão é compartilhar conhecimento com a comunidade Oracle, contribuindo para o crescimento e a excelência da plataforma.

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