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