GPO ( Grupo de Profissionais Oracle )
A maior comunidade Oracle do Brasil !

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

Share

You may also like...

6 Responses

  1. gioracle disse:

    Boa dica !

  2. Eduardo Schurtz disse:

    Como assim, a Oracle cria um comando e não documenta? E aí, como fica? Que esquisto!

  3. 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.

  4. Fábio Prado disse:

    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?

  5. Fábio Prado disse:

    Ops… Willians, desconsidere meus comentários… li meio rapido e já fui comentando… achei q vc tivesse falando somente do WM_CONCAT

    []S

  6. 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.