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.

Ilustração: um banco de dados Oracle ao lado de linhas de código PL/SQL, em tema escuro com destaque âmbar, marcando 2011–2026.

É 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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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.

  8. 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.

  9. 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. 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. 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. 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

Oracle PL/SQLOracle Database 11gOracle Forms & ReportsJava (Spring MVC)WebLogicJSPCVS / SVN