📌 Material de chegada: caderno de bordo com 3 queries candidatas + 1 dúvida concreta sobre "descer" lógica para o BD. Esses itens alimentam o daily de abertura.
Por que descer lógica para o BD, anatomia de uma procedure, function escalar vs tabular, como ler um plano de execução e versionar tudo via migrações.
RECOMPILEdb/procedures.sqlCada grupo cria 2 procedures + 2 functions no repositório do projeto, com README curto e exemplos de chamada. Entrega via Merge Request até o fim do dia.
🎯 Saída do dia: Merge Request feat(db): procedures e functions aberto no repositório do grupo (não é individual). Atividade não ponderada — mas aula 5 (Transactions e Triggers) parte daqui.
App envia 1 chamada (EXEC sp_xxx) em vez de N queries. Em redes com 10ms de latência, cada round-trip evitado é ganho real. Procedures complexas viram uma única ida.
A procedure expõe um contrato claro (parâmetros + saída) e encapsula a transação. O app não precisa saber quais tabelas são tocadas — só conhece o ponto de entrada.
Você revoga SELECT/INSERT direto nas tabelas e dá permissão só para EXECUTE da procedure. SQL injection fica radicalmente mais difícil — o app nunca monta SQL livre.
Web, mobile, job batch e relatório consomem a mesma procedure. Mudou a regra de negócio do BD? Um lugar só — não 4 cópias da query em 4 stacks.
| id | nome | score |
|---|---|---|
| 17 | Cirque du Soleil — OVO | 0.92 |
| 03 | Bossa Acústica | 0.87 |
| 21 | Hamlet · Cia Teatro | 0.81 |
📌 Lê assim: a procedure recebe @userId e devolve um result set. O app faz 1 EXEC e recebe a lista pronta. Sem montar SQL no backend, sem N round-trips.
@userId INT) são escapados pelo driver — nada de concatenação de strings.📌 O que importa: INSERT + UPDATE acontecem juntos ou nenhum acontece. Falha = ROLLBACK automático.
THROW relança.Você chama em qualquer lugar onde caberia um número/string/data: SELECT, WHERE, ORDER BY, em outra procedure, etc.
Você usa FROM/JOIN como se fosse uma tabela. Inline (sem BEGIN/END) é a versão mais performática.
| Critério | Procedure | Function |
|---|---|---|
| Side-effects (INSERT / UPDATE / DELETE) | ✅ Permitido — feita para isso | ❌ Bloqueado pelo motor (com raras exceções) |
| Retorno | Result set, OUTPUT params, código de retorno | 1 valor (escalar) ou tabela (TVF) |
Uso em SELECT / WHERE / FROM |
❌ Não — chamada por EXEC |
✅ Sim — composta como qualquer expressão |
| Transações | ✅ BEGIN/COMMIT/ROLLBACK à vontade |
❌ Não controla transação |
Tratamento de erro (TRY/CATCH) |
✅ Suporta TRY/CATCH e THROW |
⚠️ Limitado (não pode levantar erros arbitrários) |
| Caso típico | Operação de escrita, fluxo com transação, batch | Cálculo derivado, vizinhos, métrica que entra na query |
📌 Regra de bolso: se a operação muda dados, é procedure. Se a operação calcula algo que entra em outra query, é function. Tem dúvida? Comece com procedure — é mais flexível.
RECOMPILENa primeira execução, o motor compila a procedure e guarda o plano em cache. Próximas execuções pulam essa fase. Isso é vantagem — até virar problema.
O plano é otimizado para o primeiro valor que chegou. Se a primeira chamada veio com @userId de poucos itens e a segunda com @userId de milhares, o plano vira lento — porque foi escolhido para o caso pequeno.
OPTION (RECOMPILE)Use quando o plano varia muito com os parâmetros. Recompila a cada execução — perde-se o cache, ganha-se um plano sob medida. Não use por default; só onde dói.
Procedure boa precisa de índice que cubra o WHERE e o ORDER BY. Sem índice, a procedure só esconde a query lenta — não conserta.
SET SHOWPLAN_ALL ON ou Ctrl+M no SSMS para plano gráfico real.EXPLAIN ANALYZE mostra plano + tempo real de cada nó.cost) entre planos antes/depois de criar um índice.| id | nota | antigo | novo | quando |
|---|---|---|---|---|
| 1 | 1 | 7.50 | 8.50 | 10:01 |
| 2 | 1 | 8.50 | 9.00 | 10:02 |
📌 Supabase: Dashboard → SQL Editor → cole cada bloco. Abra Database → Tables → nota_log e veja as linhas surgindo sozinhas a cada CALL — quem inseriu foi o trigger. Procedure faz; trigger reage.
OPTION (RECOMPILE)@userId têm 3 itens, outros têm 1 milhão.@userId têm número parecido de linhas). O cache do plano é exatamente o que você quer aqui.📌 Em uma frase: OPTION (RECOMPILE) é a opção nuclear contra parameter sniffing — toda execução é uma compilação fresca. Use só quando o plano realmente varia muito entre os parâmetros, porque você está trocando cache eficiente por plano sob medida.
Componentes visuais: telas, botões, textos, listas. Não processa dados — só exibe o que a ViewModel manda e avisa quando o usuário clica.
Busca dados na Model, transforma e prepara para a View. No React Native = Custom Hook (estado + funções utilitárias). Gerencia loading, error, data.
Tipos/classes que descrevem a forma dos dados + requisições para APIs ou bancos locais. É aqui que mora a chamada que aciona a stored procedure no servidor.
💡 Exemplo concreto · Tela de perfil: a View renderiza foto e nome · a ViewModel tem a lógica de carregar e gerenciar o loading · a Model é quem vai no servidor buscar o JSON do usuário (que por baixo executa uma procedure como a nossa).
📌 Por que isso importa pra aula de hoje: a procedure que você está escrevendo agora vai virar a chamada na Model da aula 6. O contrato (parâmetros + retorno) que você fechar hoje é o que o ViewModel vai consumir.
📌 Lê assim · de cima para baixo (pedido) · de baixo para cima (resposta): usuário toca em "atualizar" na View → dispara refetch na ViewModel → que chama o Repository (Model) → que faz HTTP na API → que executa a Procedure. O resultado volta pelo mesmo caminho e a View re-renderiza. Toda a aula 4 está dentro daquele retângulo do servidor — é o que a aula 6 vai conectar do lado do app.
React Native não renderiza um site dentro do celular. Ele traduz seu código JavaScript em componentes nativos de cada SO. Resultado: app com a cara, velocidade e performance de um app tradicional.
Hoje o RN roda em um motor JS super rápido — o Hermes — e usa uma estrutura que comunica o JS diretamente com código nativo em C++, Java e Objective-C.
<Text>Olá</Text> ...📌 Lê assim: você escreveu 1 linha de JSX, o motor Hermes executa, a ponte chama o widget nativo do SO. Mesmo binário, duas plataformas, performance nativa. A View do MVVM (slide anterior) vive nessa camada.
IDE oficial do Google + AVD (Android Virtual Device). Ótimo para debug profundo, mas o emulador é caro: precisa de SDK, HAXM/Hyper-V, ~10 GB de imagem, RAM gorda e CPU livre.
Você não precisa do Android Studio para começar. O Expo entrega: Expo Go (app nativo no seu celular que abre o seu projeto via QR code) e EAS Build (compila o APK na nuvem deles).
Sem Expo. Você compila localmente, então precisa do Android Studio + JDK instalados e configurados. Vale quando você precisa de módulos nativos customizados que o Expo não cobre.
📌 Recomendação pra esse projeto: comece com Expo + Expo Go. Você testa direto no seu celular via QR code, sem esperar emulador, e acessa câmera/GPS de forma nativa. Quando o APK final for necessário, eas build entrega na nuvem. Android Studio só se você precisar mesmo.
📌 Leia de cima para baixo: View chama o hook · hook chama o Repository · Repository chama a API · API faz CALL da procedure. Se você trocar PostgreSQL por SQL Server, só a linha do db.query muda. A View nem sabe que existe banco. Aula 6 vai construir esse stack do lado do mobile.
db/procedures.sql + db/README.md via Merge Request. Em grupo. Cada minuto conta.
feat/db-proceduresfeat(db): procedures e functions