Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Muitas vezes temos a necessidade de converter múltiplas linhas em uma linha simples e o
envio de email é um bom exemplo disso. O que temos normalmente é um cadastro com
várias pessoas e precisamos criar uma lista de email geralmente separado por “Vírgula” ou
“Ponto e Vírgula” para enviar o email. Abaixo um exemplo, no Oracle, de como isso pode
ser feito de forma mais simples:
,ds varchar2(30));
(id number
,nome varchar2(30)
,email varchar2(30));
BEGIN
---
---
---
---
---
commit;
END;
A query abaixo mostra o resultado de uma query simples para obter os EMails:
select *
from PLZ_FUNCIONARIO b
order by b.grupo_id;
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
Agora, vamos utilizar a função LISTAGG (Disponível somente no 11g) para gerar uma lista
de email pronta para ser utilizada com a função UTL_MAIL para enviar email:
from plz_funcionario;
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
| 1 | SORT GROUP BY | | 1 | 30 | | |
--------------------------------------------------------------------------------------
Perceba que o custo da query foi levemente menor, e com a função LISTAGG você já tem
o resultado final desejado, sem a necessidade de nenhum outro tipo de processamento.
Agora, vamos considerar que você precise da informação por grupo, o que torna
necessário a utilização do grupo na query. Então temos a seguinte query que seria
necessária para montar a lista:
select a.ds nome_grupo, b.email
order by a.id;
---------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------
from PLZ_GRUPO y
from PLZ_FUNCIONARIO X
group by X.grupo_id) Z
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 19 | 38855 | 8 (25) | 00:00:01 |
----------------------------------------------------------------------------------------
O plano de acesso tem o mesmo custo que o anterior, porém a função LISTAGG trabalhou
com um volume maior de Bytes. Essa diferença está basicamente no processamento que
você vai ter que fazer depois para transformar o resultado da primeira query numa lista.
Conclusão
A utilização da função LISTAGG neste caso simplifica o desenvolvimento, pois não será
necessária a criação de uma função que converta registros em lista, a ainda oferece o
mesmo custo de acesso que a forma tradicional de resolver este problema sem considerar
todo o processamento que deveria ocorrer depois para montar a lista.