Identificação
Resumo
A aula 4 trabalha o banco de dados como camada ativa do sistema. Diferenciamos stored procedures (executam ações, não retornam valor) de functions (retornam valor, podem aparecer em SELECT). Aprofundamos PL/pgSQL com variáveis, controle de fluxo, exceções e cursores. Discutimos quando faz sentido empurrar lógica para o banco — por desempenho, integridade ou contrato — e quando isso é dívida técnica esperando para acontecer.
O fechamento conecta procedures ao recomendador: cálculos pré-computados que ficam ao lado dos dados.
Objetivos de aprendizagem
- OA-1Diferenciar stored procedures e functions, escolhendo a forma certa para cada caso.
- OA-2Escrever PL/pgSQL com variáveis, controle de fluxo e tratamento de exceção.
- OA-3Implementar procedure que encapsula uma operação de domínio do projeto.
- OA-4Justificar trade-offs (lógica no banco vs. aplicação) com argumento de manutenibilidade.
- OA-5Avaliar impacto de procedures sobre testabilidade, deploy e versionamento.
- OA-6Reconhecer riscos de SQL injection em procedures e mitigações.
Pré-requisitos
- SQL operacional do módulo 2: CRUD, JOIN, agregação.
- PostgreSQL local instalado e acessível pela equipe.
- Esquema do banco do projeto na
develop.
Cronograma do dia
📚 Bloco 1 · Autoestudo
10h00 — 12h00Estudo individual orientado pelo material da aula 4.
- Leitura completa do Material da Aula 4 (procedures, functions, PL/pgSQL).
- Listar 3 operações do projeto que poderiam virar procedure (mostrar com
SELECTantes/depois). - Validar que
CREATE FUNCTIONroda no banco da equipe. - Caderno de bordo: dúvidas concretas sobre PL/pgSQL.
🎓 Bloco 2 · Instrução PE — Aula em metodologia ativa
14h00 — 16h00Encontro síncrono com o professor especialista.
- 14h00 — 14h15 · Daily.
- 14h15 — 16h00 · Procedure vs. function, PL/pgSQL, debate de trade-offs.
🍴 Intervalo · Almoço
12h00 — 14h00Janela livre.
🛠️ Bloco 3 · Desenvolvimento do projeto
16h00 — 18h00Janela de trabalho da equipe.
- Implementar 1 procedure e 1 function relevantes para o domínio do parceiro em
db/procedures/. - Migrar para
db/migrations/com versionamento (Flyway ou similar). - Atualizar 1 ADR justificando a decisão de empurrar a lógica para o banco.
- Abrir Merge Request
feat(db): procedures e functions.
Detalhamento da instrução PE (14h00 — 16h00)
14h15
DailyDaily de abertura
Cada aluno apresenta em 1 minuto: 1 operação que viraria procedure / minha hipótese de quando vale a pena / dúvida concreta.
14h30
TalkProcedure × Function · Para que servem?
Exposição (12 min) com tabela comparativa e exemplos: function aparece em SELECT, procedure aparece em CALL. Demo de função simples retornando valor calculado.
14h55
CodingPL/pgSQL na prática
Live coding: function que retorna média de rating de um item. Pares replicam para 1 entidade do projeto.
15h20
CodingProcedure com transação · OUT params · exceção
Live coding de procedure que aplica regra de negócio (ex.: registrar interação + atualizar contador). Tratamento de exceção via EXCEPTION WHEN ... THEN.
15h40
AtivaTrade-offs · Banco vs. aplicação
Em equipes: cada equipe recebe um caso (recálculo pesado, integridade entre tabelas, regra muito instável) e decide onde colocar a lógica. Apresentação de 3 equipes — debate sobre testabilidade e deploy.
15h55
TalkRiscos · SQL injection e versionamento
Demo de injection via concatenação de string em procedure dinâmica e como mitigar com EXECUTE ... USING. Falamos rápido sobre gerenciar versões com migrations.
16h00
AtivaSíntese
Cada aluno escreve "a aula 4 me ensinou que...". Anuncia-se a entrega: 1 procedure + 1 function reais.
Estratégias de metodologia ativa
- Decisão guiada por trade-off — cada equipe defende onde a lógica deve viver com argumento de manutenibilidade.
- Live coding incremental — function simples → procedure com transação → tratamento de exceção, sem saltos conceituais.
- Risco como conteúdo — SQL injection é demonstrada na sala antes de virar regra do baseline.
Procedure útil: encapsula consistência ou desempenho. Procedure ruim: esconde regra de negócio em lugar onde nenhum desenvolvedor da app vai pensar em procurar.
Recursos e ferramentas
| Categoria | Recurso | Uso |
|---|---|---|
| Slides | slides/slide-lesson-4.html | Exposição na instrução PE |
| Material | materials/lesson-4-material.html | Autoestudo |
| SGBD | PostgreSQL 15+ com PL/pgSQL | Procedures e functions |
| Migrations | Flyway, Liquibase ou node-pg-migrate | Versionamento do banco |
| Cliente | DBeaver ou psql | Execução e teste |
Verificação de aprendizagem
- CR-1Diferenciou em par procedure de function com exemplo certo para cada caso.
- CR-2Replicou function de cálculo agregado contra a base do projeto.
- CR-3Implementou procedure com transação e tratamento de exceção.
- CR-4Defendeu em equipe a decisão de empurrar (ou não) lógica para o banco.
- CR-5Abriu Merge Request
feat(db): procedures e functionscom migration versionada até as 18h00.
Aluno que sair às 18h sem 1 procedure + 1 function rodando + ADR atualizado está em débito técnico para a aula 5 (transações e triggers).
Conexão com a aula 5
A aula 5 amplia o tema com transações em profundidade (níveis de isolamento, deadlocks) e triggers (BEFORE/AFTER) para reagir a eventos do banco.
- Procedures escritas hoje serão envolvidas em transações na aula 5.
- Triggers podem chamar procedures — começamos a montar o quebra-cabeça.
Antes das 10h: ler material da aula 5, induzir um deadlock proposital com 2 transações e estudar os 4 níveis de isolamento.