Projeto · 2011–2026
Sistemas Acadêmicos em Oracle PL/SQL
14 anos evoluindo o coração de uma instituição de ensino superior: um banco Oracle de 3,8 TB e 7,7 bilhões de linhas onde matrícula, provas, cobrança bancária e migrações de ERP convivem — tudo em PL/SQL, sobre produção única e sem homologação desde 2023.
Quatorze anos no mesmo banco de produção — e, desde 2023, sem rede de segurança nenhuma — ensinam o que nenhum framework ensina: toda mudança precisa nascer pequena, reversível e documentada.
É onde minha carreira começou e o sistema que conheço melhor: o acadêmico-financeiro de uma instituição de ensino superior — um banco Oracle de 3,8 terabytes com 7,7 bilhões de linhas em 7 mil tabelas: 1,8 milhão de pessoas, 750 mil alunos, 23 milhões de registros de disciplina cursada. A trilha de autoria no fonte vai de dezembro de 2011 até hoje: cerca de 180 objetos de produção criados ou alterados por mim nos packages centrais, mais 134 no meu schema de trabalho.
O núcleo é PL/SQL: os packages de matrícula e rematrícula (validação de créditos, equivalências, aconselhamento automático), o motor de provas do ensino a distância, o cálculo de médias do diário eletrônico e a esteira de conclusão e diploma. Por cima dele, mantive as demais camadas: telas Oracle Forms e relatórios Reports, o portal de autoatendimento do aluno em Java com Spring MVC — 195 arquivos e 52,7 mil linhas com minha assinatura, nas duas gerações do portal — e páginas web geradas pelo próprio banco.
Os domínios são os que não perdoam erro: cobrança bancária — o ecossistema que evoluo emitiu 34 milhões de boletos e processa remessa e retorno de 15 bancos, cada um com seu layout —, bolsas governamentais (ProUni/FIES) e as obrigações regulatórias do MEC, como ENADE, Censo e registro de diploma. Em março de 2020, quando o presencial fechou, o vestibular online entrou no ar na mesma semana.
Trabalhar nessa escala muda a engenharia: não existe laço linha a linha. Os processos pesados movem milhões de linhas por rodada com BULK COLLECT e FORALL, acumulam subtotais em memória com tabelas associativas em vez de reler o banco, particionam o que cresce sem fim e leem binários em blocos para a memória não estourar. É big data sem cluster — o dado é grande, a máquina é uma só, e a régua é sempre a técnica certa para o volume: o relatório institucional de matrículas (61 milhões de linhas e 182 colunas) é reconstruído todo dia por uma rotina que reescrevi para gravar o resultado inteiro em dois INSERTs, e as provas do EAD e a cobrança rodam em filas assíncronas dentro do próprio banco.
Atravessei duas trocas de ERP — na mais recente, construí o pipeline de migração em PL/SQL puro: 16 milhões de registros conciliados em staging, com bloqueio financeiro controlado durante o corte. E desde 2023 esse ambiente ganhou uma característica que forja disciplina: os bancos de desenvolvimento e homologação foram desativados, então toda alteração nasce em produção — com changelog no fonte e plano de volta antes de aplicar.
Em números
- 14
- Anos de produção
- 7,7 bi
- Linhas no banco
- 3,8 TB
- De dados em produção
- 7 mil
- Tabelas no sistema
- 10.390
- Objetos PL/SQL no ecossistema
- 61 M
- Linhas no relatório diário
- 34 M
- Boletos no ecossistema
- 8,2 M
- Provas EAD geradas
- 16 M
- Linhas migradas de ERP
- 195
- Arquivos Java/JSP assinados
- 0
- Homologação desde 2023
Decisões de engenharia
- 01
O binário que a documentação diz que não atravessa
Para emitir o diploma digital eu precisava do documento digitalizado, que vive em outro banco de dados. A documentação da Oracle é explícita: o ponteiro de um arquivo binário selecionado de uma tabela remota não pode ser usado localmente — o banco recusa. A saída óbvia seria um serviço intermediário; a saída que encontrei dispensa isso. Em vez de ler o ponteiro remoto, materializo o binário direto numa tabela temporária local, com uma única instrução de inserção alimentada pela consulta remota: a partir dali o arquivo é local e manipulável. Depois leio em blocos de 1.440 bytes — múltiplo de três, para que o preenchimento do base64 não corrompa a emenda entre blocos — e monto o JSON. Um detalhe de três bytes é a diferença entre um diploma válido e um arquivo corrompido.
- 02
Encabecei a troca da plataforma inteira de aplicações
Migrar a plataforma de formulários e relatórios de uma versão maior para a seguinte não é copiar arquivos: cada módulo precisa recompilar, e o que não compila precisa ser entendido e corrigido — um a um. Encabecei essa migração no sistema acadêmico e montei o parque que roda hoje: 1.622 formulários e 1.052 relatórios recompilados, revalidados e editados onde foi preciso, mais as bibliotecas compartilhadas e a configuração de diretórios remotos. O acervo de origem tinha quase o dobro de módulos, entre versões e duplicatas; o que ficou em produção passou por curadoria. É o parque que continua no ar.
- 03
Diploma digital: liderei a troca do papel pelo documento com fé pública
Liderei o projeto que trocou o diploma de papel pelo digital — documento com validade jurídica, exigência regulatória, sem margem para erro de dado. O package que escrevi orquestra o ciclo inteiro sem sair do banco: valida vinte regras antes de deixar o registro sair (a carga horária tem de fechar com a matriz curricular, as portarias de reconhecimento precisam existir e não duplicar, o número da página do Diário Oficial tem de ser numérico), monta o JSON e dispara a requisição autenticada para a API do registrador, com carteira HTTPS e credencial lida de parâmetro cifrado. Registrar, consultar e anular; e uma fila com job de cinco em cinco minutos reconciliando o estado de cada diploma. São 35 mil diplomas digitais emitidos.
- 04
O relatório que a Reitoria lê toda manhã
O mapa de matrículas — 61 milhões de linhas e 182 colunas reconstruídas por uma rotina diária — vinha de madrugadas que estouravam o horário. Reescrevi o motor para acumular os subtotais em memória, em tabelas associativas indexadas por chave de texto, e gravar uma única vez no fim: o package inteiro tem só dois INSERTs. A própria tabela audita quando cada linha nasce, então o efeito é medível na série de 20 anos: a janela típica de geração caiu de 19 para 9 minutos, o p90 de 58 para 24 — o melhor patamar de toda a série — e as madrugadas de 8 horas ou mais, que eram dezenas por ano, praticamente desapareceram.
- 05
Correção de provas fora da tela (2016)
O EAD gera provas aos milhões e a correção síncrona travava a experiência do aluno. Transformei o fluxo em fila: a resposta entra numa tabela e um job corrige em background — o que hoje se chamaria de worker assíncrono, feito com as peças que o Oracle 11g oferecia. São 8,2 milhões de provas na tabela de produção.
- 06
Vestibular online na semana do lockdown
Entre 18 e 22 de março de 2020, o processo seletivo presencial deixou de existir. A rotina de prova online entrou em produção nessa mesma janela, reaproveitando o motor de provas do EAD — e o vestibular não parou. Anos depois, o mesmo package ganhou a fila de integração com o CRM.
- 07
Migração de ERP com trava financeira
Migrar histórico escolar e financeiro com o sistema no ar exige mais que ETL: 25 tabelas de staging com 16 milhões de linhas conciliadas, mapeamento de matrizes curriculares entre os dois sistemas — e uma trigger que bloqueia a movimentação dos títulos em migração, para nenhuma cobrança nascer errada durante o corte.
- 08
O problema clássico, resolvido uma vez
Trigger que lê a própria tabela que a disparou é a armadilha mais clássica do Oracle (mutating table). Em vez de N contornos espalhados, um package central concentra o padrão — estado em memória por sessão — e as triggers do sistema delegam a ele. Legado também tem arquitetura.
- 09
Regras de dinheiro real
Boleto do kit de matrícula, segunda via que se recusa a imprimir título rejeitado pelo banco, renegociação de dívida, confirmação automática de matrícula para bolsistas com 75%+ de aproveitamento. Regras financeiras onde um if errado vira cobrança indevida para um aluno real — o domínio onde aprendi a conferir antes de confiar.
- 10
O banco como hub: as integrações, nomeadas
De dentro do PL/SQL, o sistema conversa com o ecossistema inteiro: folha de pagamento, LDAP e contas Google, gestão documental (GED), biblioteca, o CRM (fila de candidatos), os órgãos reguladores (registro de diploma, Censo, ENADE) — e alimenta a plataforma de dados. Os pagamentos têm capítulo próprio: Pix, boleto registrado em dois bancos e recorrência de cartão passam por middlewares Node que fazem o TLS moderno que o banco não negocia. E na direção contrária o banco também serve: 108 endpoints REST em 18 módulos, com 57 milhões de chamadas auditadas com payload.
- 11
A camada Java: o portal do aluno sobre o núcleo do banco
O que o aluno vê — rematrícula, atestados, provas do ensino a distância, faturas, acordos, diploma — é um portal Java que atravessou duas gerações, e eu atravessei as duas com ele: 195 arquivos e 52,7 mil linhas carregam minha assinatura no versionamento, 72 deles em Spring. A arquitetura é honesta com o que existe embaixo: o controller Spring MVC recebe a requisição, o DAO chama os packages PL/SQL por procedure — JDBC direto, sem ORM no caminho — e a resposta volta em JSP. Quando o portal foi reescrito, 28 dos meus arquivos reapareceram na geração nova: portei meus próprios módulos em vez de deixá-los no legado. No caminho, a plataforma saiu do contêiner OC4J para o WebLogic e o runtime saltou de Java 1.4 para 6 (com o código mantido em nível 5, para não quebrar o que já rodava); não conduzi o início dessa migração — validei e garanti que tudo voltasse a funcionar.
- 12
Quando o ambiente de teste desaparece
Até 2023 havia desenvolvimento e homologação; os dois bancos foram desativados e ficou só a produção. Quando a rede de segurança sai, o processo passa a ser o ambiente: mudanças pequenas, changelog datado no cabeçalho de cada package — padrão que mantive por 14 anos e que permitiu, hoje, reconstruir a história inteira desse trabalho a partir do próprio sistema — e uma pergunta antes de cada apply: "como eu desfaço isso?". É a mesma disciplina que levo para qualquer stack.
Arquitetura
Interfaces
Forms · Java · Web PL/SQL
1.622 formulários e 1.052 relatórios, o portal do aluno em Java/Spring MVC e páginas geradas pelo próprio banco.
Núcleo PL/SQL
Regra de negócio
Matrícula, provas, conclusão e financeiro: ~10 mil objetos no ecossistema, com autoria minha nos packages centrais.
Big data
Volume sem cluster
BULK COLLECT, FORALL, tabelas associativas e particionamento — mover milhões de linhas sem laço linha a linha.
Triggers & Jobs
Reação e background
Auditoria, consistência e filas assíncronas; 88 rotinas agendadas dentro do banco.
Cobrança
15 bancos + PIX
Remessa e retorno com layout por banco; 34 milhões de boletos no ecossistema que evoluo.
Migração de ERP
Corte sem cobrança errada
25 tabelas de staging, 16 milhões de linhas conciliadas e trava financeira durante o corte.
Integrações
Folha · LDAP · GED · MEC · CRM
O banco como hub: web services, exports e cargas regulatórias.
Operação
Produção única
Sem homologação desde 2023: changelog datado por package e plano de volta antes de cada apply.
Stack