Funções Anônimas
É um meio de executar stored procedures sem precisar criar uma no banco de dados, isso pode ser feito por qualquer usuário com acesso ao banco*.
A função anônima é feita com o comando DO
e tem duas regras:
- não recebe parâmetros
- retorna void
Basicamente, é um trecho de código escrito em pl/pgsql que vai fazer alguma coisa, e não vai retornar nada. Vamos a um exemplo comentado, a função abaixo busca o pedido de hoje que não está consolidado:
do $$ -- iniciar com a palavra-chave e os caracteres de escape
-- aqui dentro é igual uma stored procedure
declare -- trecho para declaração de variáveis (opcional)
idPedido int;
begin -- define o inicio da função.
select id_pedido
from rest.pedidos
where not consolidado
and data_cadastro = current_date into idPedido;
if idPedido is not null then
raise notice '%', idPedido;
perform func.consolidar_pedido(idPedido);
end if;
raise notice 'Finalizado';
end $$ -- finalizar com a palavra-chave e os caracteres de escape
Se você ja conhece o PL/PGSQL não vai ter muita dificuldade em ler esse trecho de código. A única diferença disto para uma stored procedure é a sua assinatura. Abaixo um exemplo de como esse mesmo trecho fosse uma.
CREATE OR REPLACE FUNCTION func.consolidar_pedido_hoje()
RETURNS void LANGUAGE plpgsql
AS $$
declare
idPedido int;
begin
select id_pedido
from rest.pedidos
where not consolidado
and data_cadastro = current_date into idPedido;
if idPedido is not null then
raise notice '%', idPedido;
perform func.consolidar_pedido(idPedido);
end if;
raise notice 'Finalizado';
end $$;
As possibilidades com essa sintaxe são inúmeras. Desde o
desenvolvimento de stored procedures, até debug das que já
estão em produção. E já que não pode haver retorno, pode ser
adicionado RAISE NOTICE
para exibir o valor de uma variável
ou o fluxo que foi seguido.
Simples: do mesmo modo como se fosse executar uma consulta. Um jeito bacana pra evitar erro de sintaxe pelo interpretador é selecionar todo o trecho do código e executar.
- Comando SQL DO: https://www.postgresql.org/docs/9.0/sql-do.html
- Documentação do PLPGSQL: https://www.postgresql.org/docs/9.6/plpgsql.html