Stored Procedures & CALL
Lógica de múltiplos passos dentro do banco de dados. Orientação de produção para PostgreSQL.
Receita
CREATE OR REPLACE PROCEDURE app.transfer_credit(p_from bigint, p_to bigint, p_amount numeric)
LANGUAGE plpgsql AS $$
BEGIN
UPDATE app.wallets SET balance = balance - p_amount WHERE account_id = p_from;
UPDATE app.wallets SET balance = balance + p_amount WHERE account_id = p_to;
END;
$$;Quando usar isso: Você implementa ou revisa SQL usando este conceito no PostgreSQL 18.
Exemplo de Trabalho
CALL app.transfer_credit(1, 2, 10.00);O que isso demonstra:
- SQL idiomático do PostgreSQL 18
- Padrões adequados para revisão com EXPLAIN
- Padrões seguros para cargas de trabalho OLTP
Análise Detalhada
Mecanismo
- O parser constrói a árvore de consulta.
- O executor executa os nós do plano.
- MVCC fornece isolamento de snapshot por instrução ou transação.
Prática
- Mantenha os exemplos legíveis.
- Teste com contagens de linhas realistas.
Armadilhas Comuns
- Transações longas - Bloqueiam o vacuum e aumentam o bloat. Correção: Commite rapidamente; defina timeouts.
- Índices ausentes - Scans sequenciais sob carga. Correção: Indexe colunas de junção e filtro.
- Locks implícitos - Bloqueios surpreendentes. Correção: Use FOR UPDATE explícito quando necessário.
- Suposição incorreta de isolamento - Anomalias sob escritas concorrentes. Correção: Escolha o nível deliberadamente.
- Migrações não testadas - Lock DDL ou objetos inválidos. Correção: Prepare as migrações com dados semelhantes aos de produção.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Lógica no nível da aplicação | CRUD simples | Integridade espalhada por serviços |
| View materializada | Leituras repetidas intensivas | Complexidade de atualização |
| Processador de stream externo | Eventos entre sistemas | Superfície operacional extra |
FAQs
Isso se aplica a réplicas?
Réplicas somente leitura executam SELECT; escritas vão para o primário.
E sobre o PgBouncer?
O pooling de transações afeta recursos de nível de sessão; use o modo de sessão quando necessário.
Relacionado
- Noções Básicas de Funções - SQL vs PL/pgSQL
Versões da Stack: Esta página foi escrita para PostgreSQL 18.4 (estável 18, manutenção 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x e PostGIS 3.5+.