0Pricing
SQL Academy · Aula

Fundamentos de funções PL/pgSQL

Escreva funções PL/pgSQL com parâmetros, RETURNS TABLE, fluxo de controle (IF, LOOP, FOREACH) e tratamento de exceções.

Fundamentos de funções PL/pgSQL é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.

O que é PL/pgSQL?

A linguagem procedural integrada do PostgreSQL. SQL ampliado com variáveis, fluxo de controle, exceções e a capacidade de chamar consultas dinamicamente. Usada em procedimentos armazenados e funções de gatilho.

Estrutura básica de função

Uma função simples:

CREATE OR REPLACE FUNCTION add(a INT, b INT)
RETURNS INT AS $$
BEGIN
  RETURN a + b;
END;
$$ LANGUAGE plpgsql IMMUTABLE;

SELECT add(2, 3);   -- 5

Variáveis

Declare com DECLARE; atribua com := ou INTO:

CREATE FUNCTION user_orders(uid BIGINT)
RETURNS INT AS $$
DECLARE
  cnt INT;
BEGIN
  SELECT COUNT(*) INTO cnt FROM orders WHERE user_id = uid;
  RETURN cnt;
END;
$$ LANGUAGE plpgsql STABLE;

Fluxo de controle

IF / ELSE, FOR, WHILE, CASE:

IF cnt = 0 THEN
  RAISE NOTICE 'no orders';
ELSIF cnt < 10 THEN
  RAISE NOTICE 'few';
ELSE
  RAISE NOTICE 'many';
END IF;

FOR i IN 1..10 LOOP
  RAISE NOTICE '%', i;
END LOOP;

Percorrendo resultados de uma consulta

Iteração no estilo de cursor:

CREATE FUNCTION recalc_totals() RETURNS VOID AS $$
DECLARE
  r RECORD;
BEGIN
  FOR r IN SELECT id FROM users LOOP
    UPDATE users SET
      order_count = (SELECT COUNT(*) FROM orders WHERE user_id = r.id)
    WHERE id = r.id;
  END LOOP;
END;
$$ LANGUAGE plpgsql;

RETURNS TABLE

Retorne um conjunto de resultados:

CREATE FUNCTION top_buyers(n INT)
RETURNS TABLE (user_id BIGINT, total NUMERIC) AS $$
BEGIN
  RETURN QUERY
    SELECT o.user_id, SUM(o.total)
    FROM orders o
    GROUP BY o.user_id
    ORDER BY SUM(o.total) DESC
    LIMIT n;
END;
$$ LANGUAGE plpgsql STABLE;

SELECT * FROM top_buyers(10);

Parâmetros IN / OUT / INOUT

Vários valores de retorno:

CREATE FUNCTION stats(uid BIGINT,
  OUT total NUMERIC,
  OUT cnt INT) AS $$
BEGIN
  SELECT SUM(total), COUNT(*) INTO total, cnt
  FROM orders WHERE user_id = uid;
END;
$$ LANGUAGE plpgsql STABLE;

SELECT * FROM stats(42);   -- total | cnt

Tratamento de exceções

BEGIN ... EXCEPTION WHEN ... THEN:

BEGIN
  INSERT INTO users (email) VALUES ($1);
EXCEPTION
  WHEN unique_violation THEN
    RAISE NOTICE 'email already exists';
  WHEN OTHERS THEN
    RAISE;
END;

RAISE para registro

Níveis: DEBUG, LOG, INFO, NOTICE, WARNING, EXCEPTION:

RAISE NOTICE 'processed % rows', cnt;
RAISE EXCEPTION 'bad state: %', state USING ERRCODE = 'check_violation';

Marcadores de volatilidade

Marque as funções corretamente para o planejador:

  • IMMUTABLE — os mesmos argumentos sempre produzem o mesmo resultado (sem entrada/saída); permite a incorporação em linha e o uso indexável
  • STABLE — os mesmos argumentos produzem o mesmo resultado dentro de uma consulta
  • VOLATILE — pode variar a cada chamada (padrão; correto para NOW(), RANDOM())

SECURITY DEFINER

É executada com os privilégios do proprietário da função — utilize com cuidado:

CREATE FUNCTION sensitive_op() RETURNS VOID
LANGUAGE plpgsql
SECURITY DEFINER
AS $$ ... $$;

-- Always set search_path explicitly to avoid hijacking:
ALTER FUNCTION sensitive_op() SET search_path = public, pg_temp;

Recapitulação

PL/pgSQL estende SQL com laços, IF, exceções e retornos estruturados. Utilize-o para lógica coesa de várias etapas que se beneficie de ser executada próxima aos dados.

Verificação rápida

Qual marcador de volatilidade deve utilizar para uma função que retorna o mesmo resultado para os mesmos argumentos, sem efeitos colaterais nem entrada/saída?

Perguntas Frequentes

A aula “Fundamentos de funções PL/pgSQL” é grátis?

Sim — o texto completo de “Fundamentos de funções PL/pgSQL” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.

O que vou aprender em “Fundamentos de funções PL/pgSQL”?

Escreva funções PL/pgSQL com parâmetros, RETURNS TABLE, fluxo de controle (IF, LOOP, FOREACH) e tratamento de exceções. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar SQL Academy?

Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Fundamentos de funções PL/pgSQL”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de SQL Academy?

Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Anatomia de gatilhos: BEFORE/AFTER, FOR EACH ROW
  2. Fundamentos de funções PL/pgSQL
  3. Blocos DO e código anônimo
  4. Auditoria de tabelas com gatilhos
← Voltar para SQL Academy