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); -- 5Variá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 | cntTratamento 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
- Anatomia de gatilhos: BEFORE/AFTER, FOR EACH ROW
- Fundamentos de funções PL/pgSQL
- Blocos DO e código anônimo
- Auditoria de tabelas com gatilhos