quinta-feira, 26 de abril de 2012

Uso dos comandos "Create Types" e "Execute" em funções PostgreSQL

       Neste artigo, eu tento demostrar o uso que eu faço dos comandos "Create Type" e do "Execute". 
O "Create Type", permite criar um novo tipo de dado. No meu caso, uso ele para as saídas de dados(lista campos e seus conteúdos pertencentes a uma tabela pesquisada) das funções que faço no banco.

O "Execute", é um comando utilizado em funções "plpgsql", para executar sql, contidos dentro de uma variavel do tipo texto. Este procedimento, é interessante, para que possámos unir strings mais complexas, fazendo delas, um sql mais enxuto, e dando a possíbilidade de NÃO usar comandos como: "Case When" ou "If then", que em muitas vezes, não deixa que o banco uses seus índices, necessários para agilizar uma determinada consulta.

Para criar um type faça:
Create type "ListaPessoas_Type" as
 ("CodigoPessoa"   Integer,
  "NomePessoa"     Varchar(100)) ;


A função a seguir, lista dois campos de uma tabela, chamada "Pessoas", onde a informações listadas, poderão serem "Clientes" ou "Fornecedores".  Vejam, que os types criado, cuja o nome ficou "ListaPessoas_Type", é atrelado a função logo nas primeiras linhas, onde que representa a saída dos dados.

A proposta aqui, é mostrar o uso do create type e do execute. Sei, que consultas como estas, poderiam serem feitas de uma outra forma, de tamanho menor e numa função do tipo "sql" e não "plpgsql".


Para criar a função faça:

Create or replace function "ListaPessoas"(varchar(15))
Returns setof "ListaPessoas_Type" As
$$
declare
   XSQL     Text;
   XRetorno Record; 
begin
  /*Montagem do sql em uma variável text*/
  if $1 = 'Clientes' then
     XSQL = 'Select "CodigoPessoa","NomePessoa"
             From   "Pessoas"
             Where  "TipoCliente" = ''Clientes''     
             Order by "NomePessoa"';
  else
   

     XSQL = 'Select "CodigoPessoa","NomePessoa"
             From   "Pessoas"
             Where  "TipoCliente" = ''Clientes''     
             Order by "NomePessoa"';
  end if;
  
  /*Executa o conteúdo da variável XSQL*/
  For XRetorno in
      Execute XSQL
  loop
    Return Next XRetorno;
  end loop;
end;
$$ Language plpgsql;


Linha de comando para fazer a chamada a função
 
Select * From "ListaPessoas"('Clientes');


Observações: Em testes passados, consegui comprovar, o ganho em tempo de retorno de dados pesquisado, quando usamos quando criamos os tipos de campos para o retorno de uma função. 


Nenhum comentário:

Postar um comentário

Comente sempre por favor.