Translate

Pesquisar este blog

quinta-feira, 18 de junho de 2015

Introdução à Linguagem PL/PGSQL do PostgreSQL - Parte 1

Programar dentro do banco de dados é uma polêmica entre desenvolvedores, com certeza. Mas há vantagens em usar o banco de dados para desenvolver a lógica de negócio dos aplicativos.

Eu mesmo já desenvolvi usando o PL/PGSQL, e achei muito produtivo e performático.

Produtivo principalmente quando o sistema exige consultas SQL complexas, e você está usando uma linguagem de programação como Java.
Performático porque uma consulta pré-compilada no banco exige menos passos do banco para executar as instruções.

A principal desvantagem consiste em que não poderá portar para outros DBs esse código feito. Mas se você usa apenas um banco de dados isso não é problema.

Um exemplo de função:
CREATE OR REPLACE FUNCTION teste(entrada integer)
  RETURNS integer AS
$BODY$
begin
    return entrada*5;
end;

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;


A função teste apenas retorna o parâmetro entrada vezes 5. Para executá-lo com o parâmetro chame o seguinte comando:

Select * from teste(6)

Ela retornará 30 que é 5*6.




Veja outro exemplo. Suponha que você tenha uma tabela usuarios (id int primary key, nome varchar, descricao varchar):

CREATE OR REPLACE FUNCTION get_usuario(id_user int, out user_nome varchar, out user_descricao varchar)
  RETURNS record AS
$BODY$
begin


   select a.nome, a.descricao from usuarios as a
   where a.id= id_user
   into user_nome, user_descricao;

   if not found then
     raise exception '%', 'Usuário não encontrado';
   end if;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;



  • Veja que os parâmetros user_nome e user_descricao são parâmetros de saída(OUT). 
  • O tipo de retorno da função de torna record. Isso tem que ser porque temos mais de um valor de retorno.
  • Pegamos os dados que precisamos com a instrução SELECT e colocamos os valores nas variáveis usando a cláusula INTO.
  • Em seguida é usada a variável do PG found. Ela serve para testar se algum registro retornado com SELECT ou UPDATE foi encontrado. Se nenhum registro foi encontrado, found será igual a false. Se o registro não foi encontrado, disparamos exceção.

select * from get_usuario(7)
Isso retornará os dados do usuário 7, ou dispara exceção se ele não existe.
Observe que não colocamos os parâmetros de saída, eles é que retornarão da função.





Também é possível retornar várias linhas de uma vez só. Para isso o tipo de retorno deve ser precedido de SETOF.

CREATE OR REPLACE FUNCTION get_usuarios(out user_id int, out user_nome varchar, out user_descricao varchar)
  RETURNS setof record AS
$BODY$
begin

  return query select id, nome, descricao from usuarios
  order by nome;  


end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

  • Quando o retorno da função é declarado com SETOF, deve-se retornar os dados com a instrução RETURN QUERY ao invés de setar uma variável sozinha. 
  • É possível chamar RETURN QUERY mais de uma vez, porque ele NÃO vai retornar da função imediatamente.

Nenhum comentário:

Postar um comentário