Pular para o conteúdo

Concatenando Resultados em uma Única Linha no Oracle 11g: WM_CONCAT

Dica: 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

SQL> departamento           setores
     ---------------------- -------------------------------------
     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

SQL> departamento           setores
     ---------------------- -------------------------------------
     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

Use por sua conta e risco ! 

Fonte

Quão útil foi este post ?

Clique em uma estrela para classificar o post

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

Sem votos ! Seja o primeiro a classificar !

6 comentários em “Concatenando Resultados em uma Única Linha no Oracle 11g: WM_CONCAT”

  1. Avatar de Sergio Willians

    Eduardo, isso é mais comum do que se pensa. Basta dar uma “googlada” sobre oracle hidden commands ou oracle hidden parameters para achar centenas de recursos não documentados.
    Esses recursos tem que ser usados com cautela, pois nada garante que eles funcionem após um upgrade de versão ou mesmo a aplicação de um patch. Justamente pelo fato deles não terem suporte do fabricante, muitos desses “coringas” são usados apenas em último caso.

  2. Avatar de Fábio Prado

    Willians, a função WM_CONCAT já existia no Oracle 10G. O que surgiu no 11G foi a função analítica LISTAGG, que substitui a WM_CONCAT. Sugiro que você passe a utilizar a LISTAGG. Eu demonstro o uso dela no artigo http://www.fabioprado.net/2013/12/funcoes-analiticas-no-oracle-database.html.

    Qto à pergunta do Eduardo, eu acho natural a Oracle criar parâmetros e comandos escondidos e não documentados. É uma forma dela ir testando os novos recursos e depois que ela tiver certeza de que eles funcionam bem, ela libera eles oficialmente, ok?

  3. Avatar de Sergio Willians

    Grande Fábio !!
    É isso mesmo, como eu digo no post, o WM_CONCAT tem uma função oficial que é a LISTAGG a partir da 11g. Só considero viável a utilização dela quiando o ambiente for inferior a essa versão. Fiz uma pesquisa e o WM_CONCAT ainda existe no 11g, ou seja, mesmo uma migração ainda se faria viável a utilização em ambientes 10g ou menores. Mas é claro que se puder ser trocada pelo comando oficial, seria a opção mais sábia !

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