10.8 - Automatizando Tarefas com Funções

Fala, engenheiro(a) de automação! Já vimos o poder do Supabase para Auth, Storage e Realtime. Agora é hora de conhecer uma ferramenta incrível que vive dentro do nosso banco PostgreSQL: as Database Functions (Funções de Banco de Dados).

Imagine elas como pequenos robôs programáveis morando no seu banco. Você ensina uma tarefa para esse robô (uma função) e pode mandar ele executar essa tarefa sempre que quiser, direto pelo SQL ou pela API do Supabase!

Qual é a missão desses robôs?

Por que usar funções?

  • Reutilizar código SQL: Se você tem um pedaço de código SQL que usa sempre (tipo calcular a pontuação total do usuário), ao invés de repetir tudo, você cria uma função e chama ela quando precisar.

  • Lógica complexa: Para processos com vários passos, condições (IF/ELSE) ou loops (FOR/WHILE) no banco. Só SELECT, INSERT e UPDATE não dão conta de tudo.

  • Segurança: Dá pra liberar para um usuário só executar a função, sem dar acesso direto às tabelas por trás.

  • Performance: Processar direto no banco, onde os dados estão, costuma ser mais rápido que trazer tudo para o app e depois voltar.

  • Triggers (Gatilhos): Funções são a base para gatilhos que disparam ações automáticas em resposta a eventos (tipo, criar um perfil padrão quando um usuário novo é inserido). Isso é avançado, mas entender funções é o primeiro passo.

A linguagem dos robôs: SQL e PL/pgSQL

No PostgreSQL (o coração do Supabase), as funções podem ser escritas em:

  1. SQL: Funções que rodam comandos SQL, ótimas para encapsular queries complexas.

  2. PL/pgSQL: Linguagem procedural nativa do PostgreSQL, que adiciona programação ao SQL, permitindo:

    • Declarar variáveis;

    • Usar estruturas de controle (IF/ELSE, CASE);

    • Loops (FOR, WHILE);

    • Tratamento de erros;

É a escolha para funções mais elaboradas.

Como criar funções no Supabase?

Você pode fazer isso de dois jeitos:

  1. Pelo SQL Editor usando o comando CREATE FUNCTION.

  2. Na seção Database -> Functions, que tem um editor visual (que gera o CREATE FUNCTION por baixo dos panos).


Exemplo básico de função PL/pgSQL:

CREATE OR REPLACE FUNCTION nome_da_funcao(param1 tipo1, param2 tipo2)
RETURNS tipo_de_retorno
LANGUAGE plpgsql
AS $$
DECLARE
  variavel_local tipo;
BEGIN
  -- lógica da função
  RETURN resultado;
END;
$$;

Exemplos práticos

1. Função SQL simples — contar agentes ativos:

CREATE OR REPLACE FUNCTION contar_agentes_ativos()
RETURNS integer
LANGUAGE sql
AS $$
  SELECT COUNT(*) FROM agentes WHERE ativo = true;
$$;

Use assim: SELECT contar_agentes_ativos(); Retorna o número de agentes ativos.


2. Função PL/pgSQL — calcular idade pela data de nascimento:

CREATE OR REPLACE FUNCTION calcular_idade(data_nasc DATE)
RETURNS integer
LANGUAGE plpgsql
AS $$
BEGIN
  RETURN date_part('year', age(now(), data_nasc));
END;
$$;

Use assim: SELECT nome, calcular_idade(data_nascimento) AS idade FROM usuarios;


3. Função PL/pgSQL — dar bônus de habilidade (sem retorno):

CREATE OR REPLACE FUNCTION dar_bonus_habilidade(id_agente uuid, bonus integer)
RETURNS void
LANGUAGE plpgsql
AS $$
BEGIN
  UPDATE agentes
  SET nivel_habilidade = nivel_habilidade + bonus
  WHERE id = id_agente;
END;
$$;

Use assim: SELECT dar_bonus_habilidade('uuid-002', 2); Atualiza o nível de habilidade do agente com o bônus.


Segurança e permissões

Quem cria a função é seu "dono". Outros usuários só podem executá-la se receberem permissão (GRANT EXECUTE). O Supabase cuida de várias permissões automaticamente, especialmente para chamadas via API (veremos isso no próximo capítulo).


As funções no banco são ferramentas poderosas para automatizar, otimizar e organizar sua lógica diretamente onde os dados moram — seu banco PostgreSQL no Supabase.

Last updated