☕ Um Café no Bellacosa Mainframe
Gostou do conteúdo? Ajude a manter o café quente, o COBOL compilando e o mainframe acordado. 😄
☕ Pague um café ao Bellacosa

Translate

Mostrar mensagens com a etiqueta qsam. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta qsam. Mostrar todas as mensagens

quarta-feira, 10 de dezembro de 2025

☕ EXECIO no REXX Mainframe O canivete suíço de I/O que todo mundo usa… e quase ninguém respeita

 



EXECIO no REXX Mainframe

O canivete suíço de I/O que todo mundo usa… e quase ninguém respeita

“Quando o REXX toca no disco, o EXECIO está por trás.
E quando o disco fica lento, geralmente é culpa de quem não entendeu o EXECIO.”




🧠 Introdução – Onde o REXX encontra o mundo real

REXX é excelente para controle, decisão e orquestração.
Mas em algum momento ele precisa fazer o que todo batch faz desde 1964:

👉 Ler dados
👉 Escrever dados

É aí que entra o EXECIO.

Simples no nome.
Perigoso no impacto.


🕰️ Origem histórica – Por que o EXECIO nasceu?

Antes do EXECIO:

  • REXX era fortemente interativo

  • I/O era dependente de comandos externos

  • Ler arquivos sequenciais era lento e improvisado

Com a popularização do REXX no TSO/E e no batch, a IBM precisava de:

  • Um método padrão

  • Um comando eficiente

  • Compatível com DDNAME

  • Funcional tanto em TSO quanto em batch

Assim nasceu o EXECIO, no final dos anos 80, como ponte direta entre:

REXX ⇄ QSAM ⇄ MVS


📜 O que é EXECIO?

EXECIO é o comando REXX responsável por:

  • Ler registros de um DDNAME

  • Escrever registros em um DDNAME

  • Transferir dados entre datasets e variáveis REXX

Ele trabalha sempre com:

  • DDNAME alocado

  • Registros sequenciais

  • Stem variables


🧪 Sintaxe essencial

EXECIO <quantidade> DISKR <ddname> (STEM var. EXECIO <quantidade> DISKW <ddname> (STEM var.

Exemplo básico:

EXECIO * DISKR SYSIN (STEM linhas.

Aqui:

  • * = todas as linhas

  • DISKR = leitura

  • SYSIN = DDNAME

  • linhas. = onde os dados vão morar


🧩 Curiosidades que pouca gente comenta

🧩 1. EXECIO não entende “arquivo”

Ele entende DDNAME.

Se o DDNAME não existe:

  • RC pode ser enganoso

  • O erro aparece em mensagem

  • GETMSG vira obrigatório


🧩 2. EXECIO * carrega tudo na memória

EXECIO * DISKR BIGFILE (STEM big.

Se o arquivo tem:

  • 10 mil linhas → ok

  • 1 milhão → boa sorte

EXECIO * é confortável… até não ser.


🧩 3. A variável .0 manda mais que você

Após leitura:

say linhas.0

Ela contém quantos registros foram lidos.

Ignorar .0 é convite a loop errado.


🥚 Easter Eggs técnicos

🥚 1. Leitura parcial estratégica

EXECIO 1 DISKR INDD (STEM linha.

Ótimo para:

  • Ler cabeçalhos

  • Identificar layout

  • Decidir processamento sem ler tudo


🥚 2. EXECIO + Data Stack

É possível combinar:

  • EXECIO

  • PUSH / QUEUE

  • PARSE PULL

Criando pipelines “à moda antiga”.


🥚 3. EXECIO em SYSREXX

No batch, EXECIO:

  • Roda sem terminal

  • Depende totalmente do JCL

  • É mais rápido

  • É mais perigoso


🧠 Exemplo prático – Batch inteligente

EXECIO * DISKR INPUT (STEM in. DO i = 1 TO in.0 IF POS('ERRO', in.i) > 0 THEN DO SAY 'Erro detectado na linha' i EXIT 8 END END EXECIO in.0 DISKW OUTPUT (STEM in.

Esse REXX:

  • Analisa

  • Decide

  • Escreve

Tudo antes do COBOL rodar.


⚠️ Riscos reais do EXECIO

  • Arquivo grande → consumo de memória

  • DISKW sem controle → overwrite silencioso

  • DISKR sem validação → loop infinito

  • Falta de fechamento → dados inconsistentes

Boa prática Jedi

EXECIO 0 DISKW OUTDD

Força flush e fechamento correto.


🛡️ EXECIO e segurança

EXECIO respeita:

  • RACF

  • Permissões de dataset

  • Contexto do job

Mas:

REXX que escreve dados é tão poderoso quanto um utility IBM.

Controle de acesso é obrigatório.


☕ Comentário Bellacosa Mainframe

O EXECIO é o momento em que:

  • O REXX deixa de ser “script”

  • E passa a mexer em dados corporativos

Quem trata EXECIO como “detalhe”:

  • Cria batch frágil

  • Gera incidentes silenciosos

  • Descobre o erro em produção

EXECIO não é comando.
É compromisso com o dado.


🧠 Frase final para colar no monitor

Se o REXX leu, ele é responsável.
Se escreveu, ele é culpado até prova em contrário.

domingo, 10 de novembro de 2024

Dr. House Entra no CPD — O Caso do Arquivo que Queria Ser Banco, do Cartão que Virou COBOL e do VSAM que Acordou Falando JSON

 

Bellacosa Mainframe e a evolucao do cobol e armazenamento de dados

☕ Um Café no Bellacosa Mainframe

Dr. House Entra no CPD — O Caso do Arquivo que Queria Ser Banco, do Cartão que Virou COBOL e do VSAM que Acordou Falando JSON

Ou: como cartões perfurados, fitas, QSAM, VSAM, IMS, Db2 e VSAMDB formam a árvore genealógica dos dados corporativos — e por que “colocar JSON” não cura automaticamente a arquitetura

“Todo mundo mente”, diz o Dr. Gregory House.

No CPD, isso significa: todo mundo diz que “é só um arquivo”.

E lá estamos nós, numa sala branca demais, com o monitor exibindo um SOC7, dois analistas discutindo se o problema é “no VSAM” e um gerente garantindo que basta transformar tudo em JSON para modernizar o legado antes do fim do trimestre.

House olha para a tela, manca até o quadro, escreve KSDS ≠ DB2, sublinha três vezes e sentencia:

“Não é lúpus. É falta de modelo de dados.”

Para um programador COBOL iniciante, a confusão é compreensível. Afinal, o que exatamente são cartão perfurado, fita, QSAM, VSAM, IMS, Db2 e essa nova criatura chamada VSAMDB? São todos arquivos? Todos bancos? Todos formas de guardar informação?

A resposta curta é: não.

A resposta útil é que essas tecnologias são capítulos de uma mesma história. Cada uma resolveu um problema real de sua época. E, em um IBM Z moderno, várias podem coexistir no mesmo sistema, trabalhando discretamente enquanto alguém no LinkedIn anuncia que acabou de descobrir “dados”.

Vamos abrir o prontuário.



Prólogo — Antes do banco havia o buraco

Antes de alguém escrever:

SELECT NOME
  FROM CLIENTE
 WHERE CPF = :WS-CPF

alguém precisava representar informação de forma que uma máquina pudesse ler.

A ideia mais antiga e persistente da computação corporativa é simples:

Dados possuem formato.
Formato possui posição.
E posição errada gera desastre com excelente documentação posterior.

O cartão perfurado foi um dos primeiros grandes símbolos disso. Em sua versão clássica, ele possuía 80 colunas. Cada coluna podia codificar uma letra, número ou instrução mediante furos.

Um cartão poderia conter o cadastro de um funcionário:

Colunas  1-06  Matrícula
Colunas  7-36  Nome
Colunas 37-46  Salário
Colunas 47-48  Departamento
Colunas 49-80  Reserva

Um cartão, um registro. Mil cartões, mil registros. Um programador derruba o baralho no chão, mil problemas novos.

Curiosidade: boa parte do famoso formato fixo do COBOL herdou a disciplina dos cartões.

ColunasUso tradicional no COBOL
1–6Número de sequência
7Indicador de comentário ou continuação
8–11Area A
12–72Area B
73–80Identificação/sequência

É por isso que o COBOL antigo parece ter sido desenhado por alguém que não confiava em espaços em branco. Porque foi.

As colunas 73 a 80 podiam ajudar a reordenar o programa caso o baralho caísse. Hoje chamamos isso de controle de versão; naquela época, era o estagiário ajoelhado no chão, tentando decidir se o cartão 003417 vinha antes ou depois do 003418.

House observa o cartão e diz:

“O paciente não morreu por ser antigo. Morreu porque alguém ignorou o layout.”

Essa frase vale para um cartão de 1968, um copybook de 1988 e um payload JSON de 2026.



1. Fita perfurada — o registro saiu caminhando em fila indiana

A fita perfurada é parecida com o cartão, mas usa papel contínuo. Em vez de registros separados em fichas, a informação segue numa longa sequência de caracteres.

[início] → caractere 1 → caractere 2 → caractere 3 → ... → [fim]

Ela foi comum em teletipos, telecomunicações, automação e equipamentos que precisavam transmitir ou registrar informação de forma linear.

A fita tinha uma característica fundamental: acesso sequencial.

Se você queria chegar ao registro 1.000, precisava atravessar os 999 anteriores. Não existia uma chave, um índice ou uma lupa digital dizendo “vá direto ao CPF 123”.

Parece medieval, mas não é uma ideia morta. A lógica sequencial continua presente em:

  • arquivos texto;

  • logs;

  • streams;

  • eventos;

  • mensagens;

  • fitas de backup;

  • arquivos batch gigantescos;

  • processamento de entrada e saída em lote.

A diferença é que hoje o rolo de papel virou storage de alta capacidade, nuvem, fita virtual ou biblioteca robótica. Mas a lógica ainda é a mesma: o próximo registro é o próximo registro.

MeioOrganizaçãoMelhor uso
Cartão perfuradoRegistro individualEntrada de dados e programas
Fita perfuradaFluxo contínuoComunicação e automação
Fita magnéticaMuitos registros em sequênciaBackup, arquivo e batch
Disco indexadoRegistro por chaveConsulta direta
Banco de dadosDados com regras e relaçõesSistemas corporativos complexos

A fita magnética sucedeu a fita perfurada com mais capacidade, velocidade e confiabilidade. Continua excelente quando você processa muito dado em ordem. Mas tente localizar um contrato específico numa fita: ela sorrirá educadamente e pedirá que você espere a leitura chegar até ele.

Não é defeito. É especialização.



2. QSAM — o garçom que traz registros sem mostrar a cozinha

Quando falamos em QSAM, a primeira correção de House seria:

“QSAM não é armazenamento. É método de acesso. Pare de chamar tudo de banco.”

QSAM significa Queued Sequential Access Method, ou Método de Acesso Sequencial com Fila.

Ele permite que o programa COBOL leia ou grave registros sequencialmente sem precisar administrar blocos físicos, buffers, canais de I/O e detalhes de dispositivo.

O programa pede:

“Leia o próximo registro.”

E o z/OS resolve o restante.

A palavra Queued existe porque o sistema usa filas e buffers para antecipar trabalho. Enquanto o programa processa o registro atual, o sistema pode já estar buscando o próximo bloco. É como uma cozinha eficiente: o garçom entrega seu café enquanto a máquina já está preparando o seguinte.

Sem QSAM, o programador precisaria trabalhar mais próximo do I/O físico, usando por exemplo o BSAM (Basic Sequential Access Method).

MétodoO que o programador pede
QSAM“Dê-me o próximo registro.”
BSAM“Leia este bloco físico neste buffer e me avise quando terminar.”

QSAM é o caminho mais natural para arquivos batch tradicionais.

Em COBOL:

SELECT ARQ-CLIENTE ASSIGN TO ENTRADA
    ORGANIZATION IS SEQUENTIAL
    ACCESS MODE IS SEQUENTIAL
    FILE STATUS IS WS-FS-CLIENTE.

Depois:

OPEN INPUT ARQ-CLIENTE

PERFORM UNTIL WS-FIM-ARQ = 'S'
    READ ARQ-CLIENTE
        AT END
            MOVE 'S' TO WS-FIM-ARQ
        NOT AT END
            PERFORM PROCESSA-CLIENTE
    END-READ
END-PERFORM

CLOSE ARQ-CLIENTE

Parece banal. E é justamente por isso que funciona há tanto tempo.

Um job de folha de pagamento pode ler milhões de funcionários, um por um, calcular descontos, gerar demonstrativos e criar um arquivo de saída. Se os dados estão ordenados, QSAM é uma ferramenta extremamente eficiente.

Registro, bloco e dataset: a trindade que confunde o padawan

ConceitoSignificado
RegistroUnidade lógica: cliente, venda, funcionário
BlocoGrupo de registros movimentado numa operação de I/O
DatasetArquivo do z/OS que contém os registros

O COBOL pensa em registros. O disco prefere blocos. O z/OS faz a mediação para que ninguém precise negociar diretamente com o prato magnético como se fosse uma sessão de terapia.

É daí que surgem atributos clássicos:

  • RECFM=FB: registros de tamanho fixo, bloqueados;

  • RECFM=VB: registros de tamanho variável, bloqueados;

  • LRECL: tamanho lógico do registro;

  • BLKSIZE: tamanho do bloco de I/O.

Se um arquivo possui LRECL=120, cada registro lógico possui 120 bytes. Mas o sistema pode transferir diversos desses registros por vez num bloco maior. Isso reduz I/O e melhora desempenho.

House pega o relatório de performance, vê um arquivo mal bloqueado e murmura:

“Não é CPU. Nunca é CPU. É I/O ruim fingindo que é CPU.”

Guarde essa frase. Ela salvará horas de diagnóstico.


3. VSAM — o arquivo ganhou chave, memória e atitude

O VSAM significa Virtual Storage Access Method. Ele também é um método de acesso do z/OS, mas é muito mais sofisticado que um arquivo sequencial comum.

VSAM não é, em sentido estrito, um gerenciador relacional de banco de dados. Ele não oferece SQL, JOIN, chave estrangeira, catálogo de negócio ou integridade referencial automática.

Ele oferece outra coisa: acesso rápido e eficiente a registros, especialmente por chave.

Os tipos mais conhecidos são:

TipoO que fazExemplo
KSDSLocaliza registro por chaveCliente pelo CPF
ESDSArmazena registros na ordem de inclusãoLog de eventos
RRDSLocaliza por número relativoTabela por posição
LDSEspaço linear para uso especializadoEstruturas físicas internas

O favorito dos sistemas COBOL/CICS é o KSDS (Key-Sequenced Data Set).

Imagine um cadastro cujo campo-chave é o número da conta:

SELECT ARQ-CONTA ASSIGN TO CONTAKS
    ORGANIZATION IS INDEXED
    ACCESS MODE IS DYNAMIC
    RECORD KEY IS CONTA-NUMERO
    FILE STATUS IS WS-FS-CONTA.

E depois:

MOVE WS-CONTA-PROCURADA TO CONTA-NUMERO

READ ARQ-CONTA KEY IS CONTA-NUMERO
    INVALID KEY
        DISPLAY 'CONTA NAO ENCONTRADA'
END-READ

O programa não precisa ler todas as contas anteriores. Ele vai direto à chave.

Mas há uma diferença importante entre VSAM e Db2:

Em VSAM, a aplicação normalmente precisa proteger as regras de negócio.
Em Db2, muitas regras podem ser declaradas e impostas pelo banco.

Se você apagar um cliente em VSAM e esquecer de apagar seus contratos, o VSAM não dará um discurso moral. Ele obedecerá. Com grande velocidade, eficiência e absoluta ausência de julgamento.

Por isso, programas VSAM exigem disciplina:

  • validar status;

  • controlar atualização concorrente;

  • tratar FILE STATUS;

  • desenhar cuidadosamente as chaves;

  • definir recuperação;

  • garantir consistência entre arquivos relacionados.

O VSAM é um canivete suíço. Nas mãos certas, resolve muito. Nas mãos erradas, também corta.


4. IMS — a árvore que não pede permissão para ser rápida

O IMS é um gerenciador de banco de dados hierárquico e também possui um poderoso gerenciador de transações, o IMS TM.

Sua estrutura é uma árvore:

CLIENTE
 ├── CONTA
 │    ├── MOVIMENTO
 │    └── LIMITE
 └── SEGURO
      └── COBERTURA

Em vez de tabelas relacionadas por colunas, existem segmentos pai e filho.

Para chegar a um movimento, o programa costuma percorrer o caminho esperado: cliente → conta → movimento. Isso parece rígido perto de SQL — porque é. Mas essa rigidez traz previsibilidade e altíssimo desempenho para transações repetitivas.

As operações DL/I clássicas têm nomes que parecem siglas de um pronto-socorro:

Chamada DL/ISignificado
GUBusca um segmento específico
GNBusca o próximo segmento
GNPBusca o próximo filho do pai atual
ISRTInsere
REPLAtualiza
DLETRemove

O IMS é excelente quando se conhece o caminho da transação e se precisa executar esse caminho milhões de vezes com resposta previsível.

É por isso que ele segue forte em bancos, seguros, reservas, telecomunicações e sistemas onde “talvez responda em alguns segundos” não é uma frase aceitável.

House olha o modelo hierárquico e comenta:

“Vocês chamam de legado. Eu chamo de sistema que já sobreviveu a três aquisições, duas crises e cinco arquitetos.”


5. Db2 — quando os dados precisam conversar entre si

O Db2 for z/OS é o modelo relacional em sua forma corporativa: tabelas, SQL, índices, integridade, bloqueios, logs, recuperação, COMMIT, ROLLBACK e processamento massivo.

Ele é ideal quando os dados possuem muitos relacionamentos:

CLIENTE → CONTA → MOVIMENTO
    │
    ├── CARTAO
    ├── EMPRESTIMO
    └── ENDERECO

No Db2, você pode escrever uma pergunta que ninguém imaginou quando o sistema foi criado:

SELECT C.NOME, COUNT(*)
  FROM CLIENTE C
  JOIN CONTA A
    ON A.ID_CLIENTE = C.ID_CLIENTE
  JOIN MOVIMENTO M
    ON M.ID_CONTA = A.ID_CONTA
 WHERE M.DATA_MOVIMENTO >= CURRENT DATE - 90 DAYS
 GROUP BY C.NOME

Essa é a força do banco relacional: ele permite explorar relações sem exigir que o caminho inteiro esteja congelado no código.

Db2 também trabalha com propriedades ACID:

LetraSignificado
AAtomicidade: tudo acontece ou nada acontece
CConsistência: regras permanecem válidas
IIsolamento: transações concorrentes não se atropelam
DDurabilidade: após o COMMIT, o dado sobrevive

Em termos físicos, o Db2 usa estruturas do z/OS e, tradicionalmente, datasets VSAM LDS para seus objetos de armazenamento. Mas isso não significa que o programador deva abrir um table space Db2 com READ NEXT.

Você conversa com Db2 por SQL. Ele cuida do porão.

Abrir a estrutura interna do Db2 como se fosse arquivo comum seria equivalente a um médico abrir o tórax do paciente para conferir se o marca-passo está funcionando porque “parecia mais rápido”.

Não faça isso. House não aprovaria.


6. VSAMDB e EzNoSQL — o VSAM aprendeu JSON, mas não virou MongoDB

Agora chegamos ao paciente mais novo da ala: VSAMDB.

VSAMDB é uma capacidade do DFSMS/VSAM que permite armazenar documentos JSON ou BSON em um dataset especial. O EzNoSQL for z/OS fornece APIs de mais alto nível para acessar esses documentos.

A ideia é tentadora:

{
  "_id": "CLI-00018472",
  "nome": "Ana Silva",
  "telefones": [
    {
      "tipo": "celular",
      "numero": "+55-11-99999-0000"
    }
  ],
  "preferencias": {
    "idioma": "pt-BR",
    "canal": "email"
  }
}

Em vez de criar várias tabelas ou um copybook com dezenas de ocorrências, você armazena o documento como um todo.

Isso é útil quando:

  • os atributos variam muito;

  • há estruturas aninhadas;

  • os dados serão usados por COBOL, Java, Python ou C;

  • a aplicação precisa de acesso rápido por chave;

  • há baixo interesse em JOINs complexos;

  • o dado é mais parecido com configuração, metadado ou estado operacional do que com contabilidade.

O VSAMDB oferece chave primária e índices alternativos. A IBM o posiciona como banco JSON chave-valor, com compartilhamento no Sysplex, consistência transacional e APIs para várias linguagens. O suporte direto do Enterprise COBOL 6.5 para ler, gravar, atualizar e excluir documentos JSON em VSAMDB tornou-se disponível em 2025.

Mas atenção: JSON não é magia de modernização.

Transformar isto:

01  REG-CLIENTE.
    05 CLI-CPF             PIC 9(11).
    05 CLI-NOME            PIC X(40).
    05 CLI-LIMITE          PIC S9(9)V99 COMP-3.
    05 CLI-STATUS          PIC X.

nisto:

{
  "cpf": "12345678901",
  "nome": "ANA SILVA",
  "limite": 5000.00,
  "status": "A"
}

não resolve automaticamente:

  • quem é o dono do dado;

  • quais campos são obrigatórios;

  • quais regras impedem uma atualização inválida;

  • como manter compatibilidade com os programas antigos;

  • como relacionar cliente, conta, contrato e movimento;

  • como produzir relatórios corporativos;

  • como recuperar o ambiente após uma falha;

  • como evitar que cinco equipes inventem cinco significados para status.

NoSQL significa “não somente SQL”, não “sem regras, sem responsabilidade e sem consequências”.

House escreve no quadro:

JSON ≠ Arquitetura
API REST ≠ Modernização
Cloud ≠ Diagnóstico

E, pela primeira vez no dia, ninguém discorda.


7. Por que quase ninguém vê VSAMDB em projetos reais?

A observação de que “nunca vi projeto usando” é bastante razoável.

Primeiro, porque o recurso é relativamente novo para o ciclo de vida de sistemas z/OS. Muitas aplicações corporativas já escolheram sua estratégia de dados há anos: VSAM, IMS, Db2, MQ, CICS, replicação, Data Virtualization, APIs ou combinação de tudo isso.

Segundo, porque VSAMDB exige preparo operacional. Ele se apoia em VSAM RLS, que envolve ambiente Sysplex, Coupling Facility, SMSVSAM, classes SMS e planejamento de consistência e recuperação. Não é uma simples biblioteca que o desenvolvedor instala numa sexta-feira após o almoço.

Terceiro, porque grande parte das APIs modernas não precisa armazenar JSON internamente.

Uma API pode receber JSON, convertê-lo para um copybook, chamar um programa COBOL/CICS, consultar Db2 ou VSAM e devolver JSON ao consumidor.

Aplicação web
    ↓ JSON
API
    ↓ Copybook / SQL / chamada CICS
Sistema de registro em Db2, IMS ou VSAM
    ↓
Resposta JSON

O JSON, nesse caso, é o envelope de integração. O sistema de registro continua no formato que melhor protege o negócio.

O diagnóstico diferencial de House

SintomaMelhor suspeito
Preciso de tabelas, relacionamentos e SQLDb2
Preciso de transações previsíveis em volume extremoIMS
Preciso de registro rápido por chaveVSAM KSDS
Preciso processar tudo em ordemQSAM
Preciso de documentos flexíveis por chave, compartilhados entre linguagensVSAMDB / EzNoSQL
Preciso expor legado por RESTz/OS Connect, CICS ou camada de API
Preciso “modernizar porque o diretor viu uma palestra”Solicitar exames adicionais

8. Passo a passo: como escolher sem cometer um ABEND arquitetural

Passo 1 — Faça a pergunta certa

Não comece perguntando “qual tecnologia é moderna?”.

Pergunte:

  • O acesso é sequencial ou por chave?

  • Existem muitas relações entre entidades?

  • O formato muda com frequência?

  • A transação precisa responder em milissegundos?

  • O dado exige integridade rígida?

  • O processamento é batch, online ou ambos?

  • Quem consumirá o dado: COBOL, Java, Python, analistas, API externa?

Passo 2 — Descubra o formato natural do dado

Um registro de folha mensal costuma ser previsível. QSAM pode ser perfeito.

Uma conta por número é naturalmente um KSDS.

Uma cadeia cliente → conta → movimento pode funcionar muito bem em IMS.

Um universo de relacionamento entre clientes, produtos, contratos, indicadores e consultas pode pedir Db2.

Uma estrutura de preferências, metadados ou configuração que muda bastante pode ser candidata a JSON/VSAMDB.

Passo 3 — Não trate storage como decisão isolada

Dados nunca vivem sozinhos. Eles possuem:

  • dono;

  • regras;

  • retenção;

  • auditoria;

  • segurança RACF;

  • backup;

  • recuperação;

  • performance;

  • integração;

  • custo operacional.

A pergunta não é apenas “onde gravar?”. É “como este dado continuará correto às três da manhã, durante uma falha, com duas transações concorrentes e um auditor pedindo evidência?”.

Passo 4 — Teste a recuperação antes de declarar vitória

Todo projeto parece moderno até a primeira falha.

Teste:

  • queda durante atualização;

  • processamento duplicado;

  • concorrência;

  • COMMIT e ROLLBACK;

  • backup;

  • restore;

  • reprocessamento batch;

  • índice corrompido;

  • mensagem repetida;

  • dado JSON com atributo inesperado.

Se o projeto só funciona em apresentação, ele não é arquitetura. É trailer.

Passo 5 — Escolha a ferramenta pelo problema, não pelo marketing

Um sistema pode usar QSAM, VSAM, Db2, IMS, MQ e JSON ao mesmo tempo. Isso não é bagunça por definição. Pode ser uma arquitetura madura, em que cada componente faz aquilo que sabe fazer.

O erro é colocar tudo numa única tecnologia por dogma.


Epílogo — O velho não é o doente

Cartões perfurados ensinaram que dados precisam de layout. Fitas ensinaram que sequência importa. QSAM ensinou a esconder a complexidade do I/O. VSAM ensinou acesso direto por chave. IMS ensinou que hierarquia pode ser rápida. Db2 ensinou que relações e regras podem ser declaradas. VSAMDB ensina que documentos JSON também podem morar no z/OS.

Nenhuma dessas tecnologias é “a resposta universal”.

O programador COBOL iniciante não precisa decorar todas de uma vez. Precisa aprender a olhar para o problema e perguntar:

“Que tipo de dado é este?
Como ele será acessado?
Que regra não pode ser violada?
E quem vai me ligar quando der errado?”

House fecha o prontuário, olha para o FILE STATUS, para o SQLCODE, para o PCB STATUS e para o JSON recém-chegado.

“O paciente não está velho.
Ele só tem dependências, dados críticos, regras de negócio e vinte milhões de usuários.
Diferente de vocês, ele merece um diagnóstico.”

E no fundo do CPD, um programa COBOL compilado há décadas continua processando a realidade — registro por registro, COMMIT por COMMIT, sem jamais ter pedido permissão para ser relevante.

Fontes para continuar a investigação



sábado, 20 de julho de 2024

Road Map para Aprender Mainframe

Bellacosa Mainframe e o roadmap mainframe 


☕ Um Café no Bellacosa Mainframe

A Volta ao Mainframe em 80 Dias — O Road Map de Phileas Fogg para se Tornar um Mainframeiro

🎩🦖 80 dias, oito grandes escalas, COBOL, JCL, z/OS, TSO/ISPF, VSAM, Db2, CICS, RACF, Git, APIs e uma aposta aparentemente impossível: sair de Londres como turista e voltar como programador mainframe

Londres.

Reform Club.

Um cavalheiro inglês consulta seu relógio.

Phileas Fogg.

Metódico.

Pontual.

Imperturbável.

Um homem capaz de tomar café às 08:23 e provavelmente considerar uma execução às 08:24 um incidente de produção.

Sobre a mesa está o Daily Telegraph.

Mas existe uma notícia estranha:

“É possível aprender mainframe em apenas 80 dias?”

Os cavalheiros riem.

Um deles comenta:

— Mainframe? Meu caro Fogg, seriam necessários anos!

Outro acrescenta:

— COBOL possui DIVISIONs!

Um terceiro, claramente traumatizado:

— E existe JCL!

Fogg fecha o jornal.

Consulta o relógio.

Oitenta dias.

Silêncio.

— Impossível!

Fogg responde:

“Então aposto vinte mil libras.”

Nesse exato momento, seu criado Passepartout percebe que provavelmente escolheu o pior dia da história para começar no emprego.

Pegam as malas.

Destino:

IBM Z.

E assim começa nossa...

🌍 VOLTA AO MAINFRAME EM 80 DIAS


🗺️ O mapa da expedição

Nossa viagem terá oito grandes escalas:

LONDRES
   ↓
z/OS + TSO/ISPF
   ↓
SUEZ
   ↓
JCL + JES2 + SDSF
   ↓
BOMBAIM
   ↓
COBOL
   ↓
CALCUTÁ
   ↓
VSAM + DATASETS
   ↓
HONG KONG
   ↓
Db2
   ↓
YOKOHAMA
   ↓
CICS
   ↓
SAN FRANCISCO
   ↓
RACF + USS + Zowe + Git + APIs
   ↓
NOVA YORK
   ↓
INTEGRAÇÃO + DEVOPS + TESTES
   ↓
LONDRES

80 dias.

Não para transformar alguém em especialista.

Isso seria picaretagem.

Mas para fazer algo perfeitamente possível:

construir um mapa mental sólido do ecossistema mainframe e conseguir desenvolver, executar, investigar e integrar uma aplicação simples.

Temos uma aposta.

O relógio começou.


🎩 DIAS 1–10 — LONDRES

Primeira escala: entender o monstro

Antes de programar mainframe precisamos cometer um ato revolucionário:

entender o que é um mainframe.

Não é:

“um computador velho.”

Também não é:

“um PC gigante.”

E definitivamente não é aquele monitor verde que Hollywood coloca em filmes quando alguém precisa invadir o Pentágono.

Precisamos compreender conceitos básicos:

IBM Z
   ↓
z/OS
   ↓
LPAR
   ↓
CPU / CP / zIIP
   ↓
MEMÓRIA
   ↓
STORAGE
   ↓
I/O

E principalmente:

por que essas máquinas existem?

Bancos.

Seguradoras.

Governos.

Companhias aéreas.

Cartões.

Grandes varejistas.

Ambientes que precisam processar volumes enormes com confiabilidade e previsibilidade.


🏛️ Dia 1 — Arquitetura

Aprenda:

IBM Z
LPAR
PR/SM
z/OS
JES
USS
STORAGE

Não tente decorar tudo.

Objetivo:

saber desenhar aproximadamente onde sua aplicação vive.


🖥️ Dias 2–4 — TSO e ISPF

Phileas Fogg entra pela primeira vez no terminal.

Tela:

---------------- ISPF PRIMARY OPTION MENU ----------------

0  Settings
1  View
2  Edit
3  Utilities
4  Foreground
5  Batch
6  Command

Passepartout pergunta:

— Monsieur, onde está o mouse?

Fogg:

— Não precisamos dele.

Passepartout começa a reconsiderar suas escolhas profissionais.

Aprenda:

TSO
ISPF
PF KEYS
COMMAND LINE
MEMBERS
LIBRARIES
EDIT
VIEW
BROWSE

E comandos fundamentais do editor:

I
D
R
C
M
A
B
CC
MM

Aqui começa a alfabetização mainframe.


📦 Dias 5–7 — Datasets

Antes de COBOL:

datasets.

Entenda:

PS
PDS
PDSE
MEMBER
RECFM
LRECL
BLKSIZE
DSORG
DISP

Você precisa conseguir olhar:

BELLACOSA.COBOL.SOURCE

e compreender que isso não é simplesmente uma “pasta”.


🧭 Dias 8–10 — Navegação

Pratique.

Crie datasets.

Crie members.

Edite.

Copie.

Renomeie.

Delete.

Liste.

Phileas Fogg olha para o relógio.

DAY 10
STATUS: ON SCHEDULE

Passepartout comemora.

Erro.

Ainda faltam 70 dias.


🚂 DIAS 11–20 — SUEZ

JCL: comprando a passagem do JOB

Agora precisamos fazer alguma coisa executar.

Entramos no território do:

JCL — Job Control Language

JCL não é exatamente uma linguagem de programação convencional.

É mais parecido com preencher documentos de imigração para convencer o z/OS a deixar seu programa trabalhar.


🎫 JOB

//FOGG80   JOB (ACCT),'AROUND WORLD',
//             CLASS=A,
//             MSGCLASS=X

Nosso passaporte.


🚂 EXEC

//STEP01 EXEC PGM=FOGGCOB

Nosso trem.


🧳 DD

//INPUT DD DSN=FOGG.WORLD.INPUT,DISP=SHR

Nossa bagagem.

Agora aprenda:

JOB
EXEC
DD
DSN
DISP
SPACE
DCB
SYSOUT
STEPLIB
SYSPRINT
SYSIN

🚦 JES2

O JOB é submetido.

SUBMIT

E desaparece.

Passepartout entra em pânico.

— Perdemos o programa!

Não.

Ele entrou no maravilhoso sistema ferroviário chamado:

JES2

Precisamos aprender:

INPUT
EXECUTION
OUTPUT
PURGE

E então:

SDSF

Aqui você aprende a investigar:

JOB STATUS
RC
SYSOUT
JESMSGLG
JESJCL
JESYSMSG

Primeira grande vitória:

MAXCC=0000

Fogg:

— Excelente.

Bellacosa:

— Calma.

Porque todo mainframeiro precisa aprender cedo:

MAXCC=0 significa que o JOB terminou; não significa que você fez a coisa certa.


🐘 DIAS 21–35 — BOMBAIM

COBOL: finalmente encontramos Grace Hopper no caminho

Chegamos à grande escala.

Quinze dias.

Agora COBOL.

Primeiro compreenda sua anatomia:

IDENTIFICATION DIVISION
ENVIRONMENT DIVISION
DATA DIVISION
PROCEDURE DIVISION

Não comece decorando comandos.

Entenda a arquitetura.


🪪 IDENTIFICATION DIVISION

IDENTIFICATION DIVISION.
PROGRAM-ID. FOGG80.

Quem sou eu?


🌍 ENVIRONMENT DIVISION

Onde vivo?

Com quais recursos trabalho?


📦 DATA DIVISION

Aqui está uma das grandes diferenças culturais do COBOL.

Dados são cidadãos de primeira classe.

Aprenda:

PIC X
PIC 9
PIC S9
V
COMP
COMP-3
88 LEVEL
REDEFINES
OCCURS
COPYBOOK

Exemplo:

01 WS-PASSENGER.
   05 WS-NAME       PIC X(30).
   05 WS-AGE        PIC 9(03).
   05 WS-BALANCE    PIC S9(9)V99 COMP-3.
   05 WS-STATUS     PIC X.
      88 ACTIVE     VALUE 'A'.

Não pule essa parte.

Quem não entende DATA DIVISION acaba passando metade da carreira perguntando por que tomou S0C7.


⚙️ PROCEDURE DIVISION

Agora fazemos coisas.

Aprenda:

MOVE
IF
EVALUATE
PERFORM
COMPUTE
ADD
SUBTRACT
MULTIPLY
DIVIDE
DISPLAY
STRING
UNSTRING
INSPECT

Depois:

OPEN
READ
WRITE
REWRITE
CLOSE

🔄 O coração do batch

Você precisa conseguir escrever sozinho algo parecido com:

OPEN
 ↓
READ
 ↓
VALIDATE
 ↓
PROCESS
 ↓
WRITE
 ↓
READ AGAIN
 ↓
CLOSE

Isso parece simples.

É simples.

E variações dessa arquitetura movimentaram quantidades absurdas de negócios durante décadas.


💥 Dias 31–35 — Aprenda a quebrar COBOL

Agora provoque erros.

Sim.

De propósito.

Crie situações que gerem problemas.

Investigue:

S0C7
S0C4
FILE STATUS
RETURN CODE

Use:

DISPLAY 'WS-VALUE=' WS-VALUE

Leia compile listing.

Entenda offsets.

Procure mensagens.

Porque aprender programação sem aprender debugging é como Phileas Fogg aprender a embarcar em navios sem aprender o que fazer quando o navio quebra.


🚢 DIAS 36–43 — CALCUTÁ

VSAM: os dados precisam morar em algum lugar

Agora entramos no universo dos arquivos corporativos.

Aprenda primeiro arquivos sequenciais.

Depois:

VSAM

Conceitos:

KSDS
ESDS
RRDS
LDS
VRRDS

Para começar, concentre-se principalmente no:

KSDS

Entenda:

KEY
RECORD
CI
CA
INDEX
DATA COMPONENT

Depois:

IDCAMS

Comandos:

DEFINE
DELETE
REPRO
LISTCAT

Agora seu COBOL começa a conversar com dados persistentes.


🛳️ DIAS 44–53 — HONG KONG

Db2: SQL entra na viagem

Chegamos ao banco relacional.

Aprenda SQL antes de complicar.

SELECT
INSERT
UPDATE
DELETE

Depois:

JOIN
GROUP BY
ORDER BY
SUBQUERY
INDEX
COMMIT
ROLLBACK

Agora coloque isso dentro de COBOL:

EXEC SQL
   SELECT BALANCE
     INTO :WS-BALANCE
     FROM CUSTOMER
    WHERE CUSTOMER_ID = :WS-ID
END-EXEC.

E imediatamente aprenda:

SQLCODE
SQLSTATE

Porque:

SQLCODE = 0

é maravilhoso.

SQLCODE = +100

conta outra história.

E:

SQLCODE < 0

é quando Passepartout começa a procurar o bote salva-vidas.


🧠 Entenda também

PLAN
PACKAGE
BIND
DBRM
HOST VARIABLE
CURSOR

Não precisa dominar administração Db2.

Nosso objetivo é:

programador COBOL capaz de utilizar Db2 conscientemente.


🇯🇵 DIAS 54–61 — YOKOHAMA

CICS: saímos do batch e entramos no mundo online

Até agora:

JOB
 ↓
PROCESSA
 ↓
TERMINA

Agora:

USUÁRIO
 ↓
TRANSAÇÃO
 ↓
CICS
 ↓
COBOL
 ↓
RESPOSTA

Mudamos de planeta.

Aprenda:

TRANSACTION
PROGRAM
TASK
TERMINAL
COMMAREA
CHANNEL
CONTAINER

Comandos básicos:

EXEC CICS RECEIVE
EXEC CICS SEND
EXEC CICS READ
EXEC CICS WRITE
EXEC CICS LINK
EXEC CICS XCTL
EXEC CICS RETURN

E jamais esqueça:

RESP
RESP2

🖥️ BMS

Conheça:

MAP
MAPSET
SEND MAP
RECEIVE MAP

Você não precisa tornar-se arqueólogo de telas verdes.

Mas precisa entender como aplicações tradicionais online funcionam.


🚨 Entenda a arquitetura

Comece a reconhecer:

TOR
AOR
FOR

e conceitos como:

TSQ
TDQ
PPT
PCT

Agora Phileas Fogg consegue executar batch durante a madrugada e transações durante o dia.

Está ficando perigoso.


🚂 DIAS 62–69 — SAN FRANCISCO

Segurança, Unix e o mainframe que ninguém mostra nos filmes

Agora apresentamos:

RACF

Não precisa virar administrador de segurança.

Mas precisa compreender:

USER
GROUP
RESOURCE
PROFILE
ACCESS
READ
UPDATE
CONTROL
ALTER

E principalmente:

SAF

Comece a compreender que segurança em z/OS não é simplesmente “login e senha”.


🐧 USS

Surpresa.

Existe Unix dentro do z/OS.

Passepartout:

— Linux?

Não.

Unix System Services.

Aprenda:

PATH
FILE
DIRECTORY
PERMISSION
SHELL
PROCESS

Experimente comandos familiares:

ls
cd
cat
grep
chmod

Agora aquela divisão mental:

MAINFRAME | MUNDO MODERNO

começa a desmoronar.

Como deveria.


🔧 Zowe + Git

Chegamos ao século XXI.

Conheça:

Zowe
VS Code
IBM Z Open Editor
Git
GitHub / GitLab

Aprenda o básico:

clone
branch
commit
merge
push
pull

COBOL pode perfeitamente participar de workflows modernos.

Não precisamos sacrificar cartões perfurados numa noite de lua cheia para compilar programa.


🌉 z/OS Connect e APIs

Agora faça a ponte:

MOBILE
   ↓
REST API
   ↓
z/OS CONNECT
   ↓
CICS
   ↓
COBOL
   ↓
DB2

E finalmente compreenda uma coisa fundamental:

modernização não significa necessariamente reescrever.

Às vezes significa integrar.


🗽 DIAS 70–77 — NOVA YORK

DevOps: Phileas Fogg automatiza a viagem

Estamos quase voltando para Londres.

Agora precisamos transformar conhecimento isolado em pipeline.

Conheça:

CI/CD
BUILD
TEST
PACKAGE
DEPLOY

Ferramentas e conceitos possíveis:

DBB
zAppBuild
Jenkins
GitHub Actions
GitLab CI
UrbanCode
Ansible
Zowe
z/OSMF

Não tente aprender profundamente todas.

Entenda:

o fluxo.

SOURCE
   ↓
GIT
   ↓
BUILD
   ↓
COMPILE
   ↓
TEST
   ↓
PACKAGE
   ↓
DEPLOY

🧪 Testes

Aprenda a pensar em:

UNIT TEST
COMPONENT TEST
INTEGRATION TEST
E2E

Conheça:

ZUnit
COBOL Check
Galasa

Mais importante que decorar ferramentas:

faça código testável.


🤖 IA entra no trem

Naturalmente precisamos conversar sobre IA.

Use IA para:

EXPLICAR CÓDIGO
GERAR TESTES
DOCUMENTAR
ANALISAR ERROS
CRIAR HIPÓTESES
EXPLICAR JCL
ENTENDER COPYBOOKS
SUGERIR REFACTORING

Mas lembre:

IA
   ↓
HIPÓTESE

não:

IA
   ↓
VERDADE ABSOLUTA

Compile.

Teste.

Valide.


🏁 DIAS 78–80 — ATLÂNTICO → LONDRES

A prova final

Phileas Fogg está voltando.

Passepartout olha para o calendário.

Três dias.

Agora não existe curso.

Não existe tutorial.

Não existe instrutor segurando sua mão.

Existe apenas uma especificação.


🎯 PROJETO FINAL — FOGG BANK

Construa uma pequena aplicação:

Cadastro e movimentação de clientes.

Ela deverá possuir:

COBOL
+
JCL
+
DATASET
+
VSAM ou Db2
+
CICS ou interface batch

Fluxo:

CLIENTE
   ↓
VALIDAÇÃO
   ↓
CONSULTA
   ↓
MOVIMENTAÇÃO
   ↓
ATUALIZAÇÃO
   ↓
RELATÓRIO

Depois coloque o source em Git.

Documente.

Teste.

Provoque erros.

Corrija.

Crie README.

Explique a arquitetura.

Se possível, exponha alguma funcionalidade como API.

Agora você possui algo muito mais importante que:

ASSISTI 80 HORAS DE CURSO

Você possui:

EU CONSTRUÍ ISTO.

🧭 O MAPA COMPLETO

Depois de 80 dias nossa viagem ficou assim:

                    🌍 MAINFRAME ROAD MAP

                         IBM Z
                           │
                         z/OS
                           │
              ┌────────────┴────────────┐
              │                         │
           TSO/ISPF                    USS
              │                         │
           DATASETS                  SHELL
              │
             JCL
              │
            JES2
              │
            SDSF
              │
            COBOL
        ┌──────┼───────┐
        │      │       │
      VSAM    Db2     CICS
        │      │       │
        └──────┼───────┘
               │
              RACF
               │
             APIs
               │
         z/OS Connect
               │
              Git
               │
            DevOps
               │
            Testing
               │
               IA

Agora existe uma coisa preciosa:

CONTEXTO.


🎓 O que você NÃO será depois de 80 dias

Vamos destruir uma promessa de marketing antes que ela nasça.

Depois de 80 dias você provavelmente não será:

SYSTEM PROGRAMMER
DBA DB2
CICS ADMIN
RACF SPECIALIST
STORAGE SPECIALIST
PERFORMANCE SPECIALIST
SMP/E WIZARD
ASSEMBLER JEDI

E está tudo bem.

Mainframe é um continente.

Não uma tecnologia.

Ninguém conhece tudo.


🧠 O que você PODE ser

Você pode conseguir olhar para:

JOB
 ↓
JCL
 ↓
COBOL
 ↓
CICS
 ↓
DB2

e compreender aproximadamente o caminho.

Pode receber:

S0C7

e não fugir pela janela.

Pode abrir SDSF.

Pode procurar o step.

Pode ler SYSOUT.

Pode compreender um programa COBOL.

Pode alterar.

Compilar.

Executar.

Investigar.

Testar.

E principalmente:

saber qual é a próxima pergunta.

Esse é um enorme avanço.


🎩 O relógio de Phileas Fogg

Londres.

Reform Club.

80º dia.

Os cavalheiros estão esperando.

Relógio:

20:44

Nenhum sinal.

20:45.

Porta fechada.

A aposta parece perdida.

Então:

20:45:57

A porta abre.

Phileas Fogg entra.

Passepartout atrás dele carrega um notebook.

Na tela:

FOGG80.COBOL
FOGG80.JCL
FOGG80.COPYLIB
FOGG80.TEST

Um cavalheiro pergunta:

— Então aprendeu mainframe?

Fogg responde:

— Não.

Silêncio.

— Como assim?

Ele coloca o chapéu sobre a mesa.

Aprendi o suficiente para compreender o tamanho daquilo que ainda preciso aprender.

O velho mainframeiro no fundo da sala sorri.

Porque essa talvez seja a primeira evidência de que Phileas Fogg realmente aprendeu alguma coisa.


☕ Epílogo — A aposta

Passepartout aproxima-se do terminal.

Submete o projeto final.

SUBMIT 'FOGG80.JCL(MOONJOB)'

Não.

Arquivo errado.

Fogg olha para ele.

Passepartout:

— Desculpe, monsieur.

Agora:

SUBMIT 'FOGG80.JCL(FINALJOB)'

JES2 recebe.

$HASP100 FINALJOB ON READER

Executando.

$HASP373 FINALJOB STARTED

Todos aguardam.

SDSF atualiza.

STEP010   RC 0000
STEP020   RC 0000
STEP030   RC 0000
STEP040   RC 0000

Finalmente:

$HASP395 FINALJOB ENDED

Fogg olha para o relógio.

Ainda dentro dos 80 dias.

Passepartout grita:

MAXCC=0000!

Champanhe.

Aplausos.

A aposta está ganha.

Então o instrutor Bellacosa aproxima-se lentamente.

Olha o relatório.

Franze a testa.

Pergunta:

— Fogg...

— Sim?

— O total deveria ser £20.000.

Na tela:

TOTAL = £200.000

Silêncio absoluto.

Fogg tira o paletó.

Senta diante do terminal.

Abre o source.

Passepartout prepara café.

Porque Phileas Fogg acaba de descobrir a última e mais importante etapa do Road Map Mainframe:

DIA 81 — DEBUG.

🎩🌍🚂🚢☕🦖

E essa viagem...

meu caro Padawan...

não termina em 80 dias.

//WORLD80 JOB (COBOL),'PHILEAS FOGG'
//STEP01  EXEC PGM=LEARN
//SYSOUT  DD SYSOUT=*

LEARNING IN PROGRESS...
DESTINATION: MAINFRAME
RETURN CODE: NEVER STOP
O que um jovem padawan deve aprender para ser um especialista na Stack Mainframe. Um caminho com inúmeras possibilidades, requer esforço e dedicação, porém os frutos condizem ao esforço. Descubra o z/OS, codifique em COBOL, crie queries no SQL DB2 e vá além. #ibm #mainframe #cobol #cics #db2 #jcl #sdsf #qsam #vsam #query #sql #etl #jobs #procs #jes2 #lpar #sysplex
 

sábado, 13 de abril de 2024

Conheça unidade de armazenamento CARTRIDGE Storage


A
storage mainframe cartridge e robot de leitura

FUJIFILM Corporation e a IBM anunciaram o desenvolvimento de um sistema de armazenamento em fita nativo de 50 TB, apresentando a maior capacidade nativa de cartucho de fita de dados do mundo.




 

segunda-feira, 8 de abril de 2024

O COBOL em sua primeira reunião

Codasyl em 1959 o pontapé inicial do COBOL



Em 08 de Abril de 1959, foi dado o pontapé inicial da criação do COBOL. Muita coisa aconteceu desde então, surgiu o armazenamento em cartão perfurado, tape, disco e cartridge, surgiram o qsam, vsam, db2. Acompanhe-nos e descubra mais

domingo, 10 de setembro de 2023

Viagem ao Fundo dos Dados — O Dia em que o Programador COBOL Entrou no Db2 e Descobriu um IMS Morando no Porão

Bellacosa Mainframe e a modelagem de dados para o db2

☕ Um Café no Bellacosa Mainframe

Viagem ao Fundo dos Dados — O Dia em que o Programador COBOL Entrou no Db2 e Descobriu um IMS Morando no Porão

Ou: por que trocar segmentos por tabelas não elimina a hierarquia, como diferenciar QSAM, VSAM, IMS e banco relacional, e o que Edgar Codd diria ao encontrar uma chave de 47 bytes carregando toda a árvore genealógica do cliente


Prólogo — A entrada para o mundo subterrâneo

O professor Otto Lidenbrock encontrou um manuscrito misterioso escondido dentro de um livro antigo. O documento indicava uma passagem para o centro da Terra através da cratera de um vulcão islandês. Um programador COBOL iniciante, por sua vez, encontrou algo igualmente inquietante: uma tabela Db2 com uma chave composta por empresa, filial, departamento, cliente, contrato, produto, parcela e sequência.

Não havia runas. Havia um copybook de 1989.

Na primeira página, alguém escrevera:

01  CHAVE-MESTRA.
    05 CD-EMPRESA       PIC 9(03).
    05 CD-FILIAL        PIC 9(04).
    05 NR-CLIENTE       PIC 9(09).
    05 NR-CONTRATO      PIC 9(12).
    05 NR-PARCELA       PIC 9(03).

O sistema utilizava uma versão moderna do Db2, possuía SQL, índices, tablespaces, packages e planos. Mesmo assim, para chegar a uma parcela, o programa precisava conhecer empresa, filial, cliente e contrato. Qualquer consulta começava pela raiz e descia pelos mesmos túneis. As tabelas pareciam segmentos. Os cursores pareciam GN. Algumas rotinas faziam tantos SELECT encadeados que quase se podia ouvir um distante GNP ecoando nas cavernas.

Foi então que surgiu a pergunta que leva muitos veteranos do mainframe a desconfiar do chão sob seus pés:

Se estou usando Db2, por que ainda sinto que os dados são IMS/DL/I?

A resposta curta é: porque tecnologia relacional e pensamento relacional não são a mesma coisa. É possível colocar dados num SGBD relacional e continuar projetando, navegando e mantendo tudo como se fosse uma velha hierarquia. A placa na entrada diz Db2, mas a planta dos túneis continua sendo IMS.

Vamos descer.



1. Hierarquia não é pecado; prisão de caminho é outra história

A realidade está cheia de hierarquias legítimas:

  • uma empresa contém departamentos;

  • um pedido contém itens;

  • uma conta recebe lançamentos;

  • um funcionário pode responder a um gerente;

  • um produto pode ser formado por componentes;

  • um país possui estados, que possuem municípios.

Portanto, encontrar relações pai-filho dentro de um Db2 não prova que a modelagem esteja errada. O modelo relacional representa hierarquias perfeitamente bem. A questão decisiva é saber se a hierarquia descreve o negócio ou aprisiona o acesso ao dado.

No banco hierárquico, o caminho é parte essencial da estrutura. Imagine:

CLIENTE
  └── CONTA
       └── LANÇAMENTO

Para alcançar determinado lançamento, a navegação tradicional começa no cliente, localiza a conta e finalmente desce ao lançamento. O programador não faz apenas uma pergunta sobre os dados; ele informa ou conhece o caminho para encontrá-los.

No modelo relacional, o lançamento pode ser encontrado diretamente por sua identidade:

SELECT *
  FROM LANCAMENTO
 WHERE ID_LANCAMENTO = 987654;

Também pode ser encontrado pela conta:

SELECT *
  FROM LANCAMENTO
 WHERE ID_CONTA = 12345;

Ou relacionado ao cliente:

SELECT L.*
  FROM CLIENTE C
  JOIN CONTA A
    ON A.ID_CLIENTE = C.ID_CLIENTE
  JOIN LANCAMENTO L
    ON L.ID_CONTA = A.ID_CONTA
 WHERE C.ID_CLIENTE = 100;

O dado não deixa de ter parentes. Ele apenas deixa de possuir um único roteiro obrigatório de visitação.

Essa é uma das diferenças mais importantes entre os dois mundos: no modelo hierárquico, pensamos em percorrer caminhos; no relacional, pensamos em combinar conjuntos de fatos.



2. IMS — a caverna desenhada antes da expedição

O IMS organiza dados em segmentos. Existe um segmento raiz e, abaixo dele, segmentos dependentes. Um desenho simplificado poderia ser:

CLIENTE
├── ENDEREÇO
├── TELEFONE
└── CONTA
    └── LANÇAMENTO

Cada ocorrência de CONTA vive sob determinado CLIENTE; cada LANÇAMENTO vive sob determinada CONTA. A aplicação percorre essa estrutura usando chamadas DL/I como:

  • GU — Get Unique;

  • GN — Get Next;

  • GNP — Get Next Within Parent;

  • ISRT — Insert;

  • REPL — Replace;

  • DLET — Delete.

É uma lógica navegacional. Ela se parece com a expedição de Júlio Verne: entre pela cratera correta, atravesse a galeria indicada, contorne o lago subterrâneo e procure a passagem depois da rocha marcada. Se você quiser chegar ao mesmo ponto por outro lado, talvez precise de outro índice, outro caminho lógico ou uma nova solução estrutural.

Isso não torna o IMS primitivo. Muito pelo contrário. O IMS continua sendo uma tecnologia poderosa, madura e extremamente eficiente em cargas com caminhos previsíveis. Possui índices secundários, logical relationships e diversos recursos que tornam o modelo muito mais sofisticado do que uma árvore escolar desenhada no quadro.

Suas qualidades aparecem quando:

  • o relacionamento pai-filho é estável;

  • os caminhos de acesso são conhecidos;

  • o volume transacional é elevado;

  • a previsibilidade é valiosa;

  • a estrutura combina naturalmente com o negócio.

As dificuldades aparecem quando consultas novas exigem atravessar a árvore de maneiras não previstas, quando muitos-para-muitos se multiplicam ou quando alterar a estrutura obriga muitos programas a reaprender o mapa subterrâneo.

3. Db2 — a pergunta lógica e o caminho escolhido pelo otimizador

No modelo relacional, uma tabela representa uma relação: um conjunto de fatos do mesmo tipo. Cada linha deveria afirmar algo claro sobre o mundo.

Uma tabela CLIENTE pode declarar:

Existe um cliente identificado por este código, com este nome e esta data de nascimento.

Uma tabela CONTA pode declarar:

Existe uma conta identificada por este código e relacionada a determinado cliente.

O relacionamento não deveria morar apenas na memória do analista ou numa condição dentro do COBOL. Ele pode ser declarado ao SGBD:

ALTER TABLE CONTA
  ADD CONSTRAINT FK_CONTA_CLIENTE
  FOREIGN KEY (ID_CLIENTE)
  REFERENCES CLIENTE (ID_CLIENTE);

Quando a regra existe somente no programa, temos uma convenção. Quando é declarada como constraint, temos uma regra protegida pelo banco para todos os programas autorizados a alterar aqueles dados.

No Db2, escrevemos o que desejamos obter. O otimizador decide como alcançar o resultado, considerando estatísticas, índices, cardinalidades, custos e alternativas de acesso. Pode escolher a ordem dos joins e diferentes estratégias físicas sem exigir que a regra de negócio seja reescrita.

É como pedir:

Quero todos os fósseis encontrados por expedições islandesas entre duas datas.

Em vez de ordenar:

Entre pelo túnel A, caminhe 300 metros, vire à esquerda, abra a terceira caixa e leia registro por registro.

Essa separação entre intenção lógica e acesso físico é uma das grandes conquistas do modelo relacional.

4. Quando o Db2 usa gravata, mas pensa em DL/I

Existem sintomas clássicos de que o sistema migrou de tecnologia sem migrar de pensamento.

4.1 Chaves que contêm todo o caminho dos ancestrais

Imagine estas chaves:

CLIENTE
  CD_EMPRESA + CD_FILIAL + NR_CLIENTE

CONTA
  CD_EMPRESA + CD_FILIAL + NR_CLIENTE + NR_CONTA

LANÇAMENTO
  CD_EMPRESA + CD_FILIAL + NR_CLIENTE + NR_CONTA + DT_MOVIMENTO + SEQUENCIA

Uma chave composta não é automaticamente ruim. Em muitos casos, a composição representa a verdadeira identidade do negócio. O problema começa quando o filho transporta toda a ancestralidade apenas porque antigamente o caminho físico precisava estar embutido na chave.

Uma possibilidade mais independente seria:

CLIENTE
  ID_CLIENTE PK

CONTA
  ID_CONTA PK
  ID_CLIENTE FK

LANCAMENTO
  ID_LANCAMENTO PK
  ID_CONTA FK

Agora, cada entidade tem identidade própria. O relacionamento continua existindo, mas não se confunde com a identidade completa do registro.

Não existe mandamento dizendo “usarás sempre chave artificial”. O bom projetista pergunta: a chave é estável? É curta? Tem significado duradouro? Pode mudar por correção cadastral ou legislação? Expõe informação sensível? Realmente identifica a entidade ou simplesmente reproduz a trilha de acesso?

4.2 O programa que faz uma excursão linha a linha

Outro sinal é o programa que seleciona clientes e, para cada cliente, abre uma consulta de contas; para cada conta, consulta lançamentos; para cada lançamento, busca informações complementares.

Em espírito:

SELECT CLIENTE
  SELECT CONTA
    SELECT LANCAMENTO
      SELECT TIPO_LANCAMENTO

É uma navegação hierárquica reconstruída com SQL. Também pode produzir o conhecido problema de muitas consultas repetitivas.

Uma abordagem relacional tenta formular o conjunto desejado:

SELECT C.ID_CLIENTE,
       A.ID_CONTA,
       SUM(L.VALOR) AS TOTAL
  FROM CLIENTE C
  JOIN CONTA A
    ON A.ID_CLIENTE = C.ID_CLIENTE
  JOIN LANCAMENTO L
    ON L.ID_CONTA = A.ID_CONTA
 GROUP BY C.ID_CLIENTE,
          A.ID_CONTA;

Não significa transformar qualquer processamento COBOL em um SQL gigantesco e impossível de manter. Significa reconhecer quando o SGBD pode trabalhar eficientemente com conjuntos, evitando que o programa imite um explorador abrindo cada caixote individualmente.

4.3 Relações protegidas apenas pelo COBOL

Alguns programas verificam se o pai existe antes de inserir o filho:

EXEC SQL
   SELECT COUNT(*)
     INTO :WS-COUNT
     FROM CLIENTE
    WHERE ID_CLIENTE = :WS-ID-CLIENTE
END-EXEC

Depois, se WS-COUNT for maior que zero, inserem a conta. Além de duplicar a regra em diferentes programas, essa estratégia pode sofrer com concorrência: a realidade pode mudar entre a verificação e a inserção.

Uma foreign key expressa diretamente a regra. O COBOL continua tratando o retorno SQL e produzindo a mensagem apropriada, mas o Db2 assume a proteção central da integridade.

4.4 A ordem “natural” da tabela

Uma tabela relacional não possui ordem lógica garantida. Este comando:

SELECT * FROM CLIENTE;

não promete retornar clientes por código, nome, horário de inclusão nem posição física. Se a ordem importa, ela deve ser declarada:

SELECT *
  FROM CLIENTE
 ORDER BY NOME, ID_CLIENTE;

Programa que depende da ordem observada sem ORDER BY está tratando a tabela como arquivo sequencial. Pode funcionar por anos e mudar depois de uma reorganização, alteração de índice ou novo access path. O monstro não nasceu naquele dia; naquele dia alguém apenas acendeu a lanterna.

5. QSAM — a longa estrada em linha reta

QSAM é associado ao acesso sequencial a registros bloqueados e aparece diariamente em processamento batch. É natural encontrá-lo em entradas, saídas, relatórios, interfaces, cargas, descargas e arquivos de erros.

No COBOL:

READ ARQ-CLIENTES
   AT END
      SET FIM-ARQUIVO TO TRUE
END-READ

O layout pode estar num copybook:

01  REG-CLIENTE.
    05 REG-ID       PIC 9(09).
    05 REG-NOME     PIC X(40).
    05 REG-STATUS   PIC X(01).

Para o mecanismo de acesso, existem registros e bytes. O significado “as posições 10 a 49 representam o nome” está no layout conhecido pela aplicação.

QSAM é como uma ferrovia subterrânea: excelente quando se deseja seguir do primeiro ao último vagão. Para processar quarenta milhões de registros numa passada, uma leitura sequencial pode ser exatamente a solução correta.

Entretanto, QSAM não oferece por si só joins, foreign keys ou integridade referencial entre diferentes datasets. Se um arquivo de contas contém o código do cliente, cabe aos programas garantir que esse cliente exista no arquivo correspondente.

Eis uma curiosidade importante para o iniciante: dataset é um termo amplo no z/OS. QSAM não é “um tipo de banco”; é um método de acesso normalmente empregado com datasets sequenciais. Confundir dataset, organização e método de acesso é como chamar toda criatura subterrânea de dinossauro. Algumas nem sequer viveram no mesmo período.

6. VSAM — as galerias com placas e atalhos

VSAM é uma família de organizações e serviços de acesso. O mais famoso no universo COBOL é o KSDS, que permite acesso por chave e também processamento sequencial.

READ ARQ-CLIENTE
   KEY IS WS-ID-CLIENTE
   INVALID KEY
      CONTINUE
END-READ

As organizações mais conhecidas incluem:

  • KSDS — registros acessíveis por chave e em sequência de chave;

  • ESDS — registros mantidos conforme a ordem de entrada, com acesso por endereço relativo;

  • RRDS — registros associados a números relativos;

  • LDS — espaço linear, utilizado em cenários específicos e por componentes que gerenciam sua própria estrutura.

Um KSDS possui entradas indexadas e pode encontrar rapidamente um registro. Ainda assim, o fato de dois clusters terem campos com o mesmo código não cria automaticamente um relacionamento protegido entre eles.

Se o arquivo CONTA contém ID-CLIENTE, um programa pode excluir o cliente e deixar contas órfãs, a menos que as aplicações e os processos impeçam isso. O VSAM não interpreta espontaneamente aquela igualdade como uma foreign key.

VSAM também não é “inferior” ao Db2. Há problemas para os quais sua simplicidade, previsibilidade e acesso direto são excelentes. A pergunta madura não é “qual tecnologia é mais moderna?”, mas “qual semântica, integridade, concorrência e padrão de acesso este problema exige?”.

7. O mapa comparativo da expedição

TecnologiaVisão predominanteRelacionamentosAcesso típicoQuem conhece grande parte da semântica?
QSAMsequência de registrosmantidos pela aplicaçãoleitura/gravação sequencialcopybook e programa
VSAM KSDSregistros indexados por chavemantidos principalmente pela aplicaçãochave ou sequênciadefinição do cluster, copybook e programa
IMSsegmentos numa hierarquiapai-filho estruturado pelo banconavegação DL/IDBD, PSB/PCB e aplicação
Db2conjuntos de fatos relacionadosPK, FK, constraints e valoresSQL declarativocatálogo, modelo e aplicação

O ponto não é dizer que apenas o Db2 conhece regras. Todos esses ambientes podem formar sistemas sólidos. A diferença está em onde a estrutura e a integridade são declaradas e quanto o programa precisa conhecer sobre o percurso físico ou lógico.

8. O que caracteriza uma boa modelagem relacional

Uma boa modelagem começa quando conseguimos terminar esta frase sem hesitar:

Cada linha desta tabela representa...

“Um cliente” é claro. “Uma conta” também. “A participação de um cliente numa conta durante certo período” pode justificar uma tabela associativa. Já “cliente, contrato, endereço atual, última cobrança e alguns campos reservados” revela vários conceitos presos no mesmo fóssil.

8.1 Identidade clara

Cada linha deve ser distinguível. Uma tabela pode usar uma chave técnica e, ao mesmo tempo, proteger a chave natural:

CREATE TABLE CLIENTE (
    ID_CLIENTE BIGINT       NOT NULL,
    NOME       VARCHAR(100) NOT NULL,
    CPF        CHAR(11),
    CONSTRAINT PK_CLIENTE
       PRIMARY KEY (ID_CLIENTE),
    CONSTRAINT UK_CLIENTE_CPF
       UNIQUE (CPF)
);

ID_CLIENTE fornece identidade técnica estável; CPF expressa uma possível regra de unicidade do negócio. O modelo real ainda precisa decidir como tratar estrangeiros, dados provisórios, correções e valores ausentes.

8.2 Relacionamentos declarados

Uma conta pode exigir um cliente existente:

CREATE TABLE CONTA (
    ID_CONTA     BIGINT NOT NULL,
    ID_CLIENTE   BIGINT NOT NULL,
    DATA_ABERTURA DATE  NOT NULL,
    SITUACAO     CHAR(1) NOT NULL,
    CONSTRAINT PK_CONTA
       PRIMARY KEY (ID_CONTA),
    CONSTRAINT FK_CONTA_CLIENTE
       FOREIGN KEY (ID_CLIENTE)
       REFERENCES CLIENTE (ID_CLIENTE),
    CONSTRAINT CK_CONTA_SITUACAO
       CHECK (SITUACAO IN ('A', 'B', 'E'))
);

O DDL passa a documentar e proteger identidade, obrigatoriedade, relacionamento e domínio.

8.3 Um fato em seu devido lugar

Se o limite de crédito pertence à conta, não deveria estar em CLIENTE apenas porque hoje cada cliente possui uma única conta. Se o preço depende do produto e da data de vigência, talvez não pertença simplesmente a PRODUTO.

A pergunta de ouro é:

Este atributo depende de quê?

Se depende da chave, da chave inteira e de nada além da chave, provavelmente está no lugar correto. Eis, em linguagem prática, a alma da normalização.

8.4 Muitos-para-muitos sem colunas numeradas

Um cliente pode participar de várias contas e uma conta pode ter vários titulares. Criar ID_CLIENTE_1, ID_CLIENTE_2 e ID_CLIENTE_3 estabelece um limite artificial e espalha lógica condicional.

O modelo apropriado pode usar:

CLIENTE
  ID_CLIENTE

CONTA
  ID_CONTA

CONTA_TITULAR
  ID_CONTA
  ID_CLIENTE
  TIPO_TITULARIDADE
  DATA_INICIO
  DATA_FIM

CONTA_TITULAR não é apenas uma ponte técnica. Ela representa um fato do negócio: determinada pessoa participa de determinada conta, com certo papel e durante certo intervalo.

8.5 Repetições viram linhas, não colunas numeradas

Uma tabela com TELEFONE_1, TELEFONE_2 e TELEFONE_3 carrega uma pergunta inevitável: o que acontecerá com o quarto telefone?

Uma tabela CLIENTE_TELEFONE permite zero, um ou muitos números, cada um com tipo, preferência, validade e outras regras necessárias.

8.6 NULL não é um saco de mistérios

NULL não deveria significar simultaneamente “não informado”, “não existe”, “não se aplica”, “será calculado”, “ocorreu erro” e “veio em branco no arquivo de 1997”. Esses estados podem exigir tratamentos diferentes.

O modelo precisa definir o significado da ausência. Caso contrário, cada programa inventará sua própria interpretação e o banco ganhará pequenas cavernas particulares.

8.7 O tempo precisa ser modelado

Pergunte sempre:

  • a data é de ocorrência, processamento ou vigência?

  • o dado atual substitui o anterior ou deve existir histórico?

  • períodos podem se sobrepor?

  • DATA_FIM IS NULL significa registro vigente?

  • alterações retroativas são permitidas?

  • precisamos saber quem alterou e quando?

Muitos modelos parecem ótimos até alguém perguntar: “Como essa conta estava no fechamento do mês passado?”. Nesse instante, descobre-se que atualizar uma linha apagou a história.

9. Normalização sem transformar o Db2 num labirinto

Normalizar significa reduzir redundâncias e anomalias, não dividir o universo em centenas de tabelas minúsculas por devoção religiosa.

Na primeira forma normal, evitamos guardar listas escondidas numa coluna:

TELEFONES = "11999999999;11888888888;11777777777"

Esse campo dificulta validação, pesquisa, indexação e alteração individual.

Na segunda forma normal, quando existe chave composta, cada atributo não-chave deve depender da chave inteira. Se ITEM_PEDIDO tem chave ID_PEDIDO + ID_PRODUTO, o nome do cliente não depende dessa combinação; a descrição geral do produto tampouco.

Na terceira forma normal, evitamos dependências indiretas. Se CLIENTE contém ID_CIDADE, NOME_CIDADE e UF, mas nome e UF dependem de ID_CIDADE, talvez esses atributos pertençam a CIDADE.

Entretanto, snapshots, trilhas históricas, integrações e estruturas analíticas podem duplicar dados intencionalmente. A distinção importante é esta:

  • redundância acidental cria várias verdades concorrentes;

  • redundância projetada identifica a fonte oficial, o momento da cópia e o mecanismo de reconciliação.

Desnormalizar por desempenho antes de medir é como abrir uma passagem com dinamite porque talvez exista um atalho atrás da parede. Pode existir. Também pode haver um oceano subterrâneo esperando para entrar.

10. Passo a passo para construir um bom modelo

Passo 1 — Escreva as regras em português

Antes do primeiro CREATE TABLE, registre frases como:

  • um cliente pode participar de várias contas;

  • uma conta pode ter vários titulares;

  • um lançamento pertence a exatamente uma conta;

  • uma conta pode existir sem lançamento;

  • a titularidade possui início, fim e tipo;

  • um lançamento cancelado não desaparece: ganha estado e referência de estorno.

Essas frases revelam entidades, cardinalidades, opcionalidade e tempo.

Passo 2 — Separe entidades, eventos e classificações

Entidades são coisas reconhecíveis, como cliente, conta e produto. Eventos registram algo ocorrido, como pagamento, transferência ou lançamento. Classificações descrevem categorias e estados.

Misturar tudo em TB_CADASTRO_GERAL pode parecer econômico no início, mas logo cria colunas sem sentido para metade das linhas e códigos mágicos decidindo qual formato cada registro possui.

Passo 3 — Defina as cardinalidades

Para cada relacionamento, pergunte:

  • a ocorrência relacionada é obrigatória?

  • pode existir uma ou várias?

  • o relacionamento muda com o tempo?

  • há exceções reais?

Não escolha 1:N porque o arquivo antigo parecia possuir um cabeçalho e vários detalhes. Escolha porque essa é a regra do negócio.

Passo 4 — Escolha chaves com consciência

Examine estabilidade, tamanho, privacidade e significado. Uma chave natural ótima hoje pode mudar amanhã. Uma chave artificial facilita identidade, mas não elimina a necessidade de proteger unicidades do negócio.

Passo 5 — Declare constraints

Use PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL e CHECK quando representam regras verdadeiras. Criar tudo como nullable para “facilitar a carga” apenas transfere a dificuldade para milhares de consultas futuras.

Passo 6 — Teste o ciclo de vida, não apenas o cadastro

Simule:

  • criação;

  • correção;

  • cancelamento;

  • reativação;

  • troca de titular;

  • evento retroativo;

  • auditoria;

  • anonimização;

  • consulta histórica;

  • exclusão permitida e exclusão proibida.

Um modelo que funciona somente no primeiro INSERT ainda não atravessou a primeira galeria.

Passo 7 — Valide com consultas reais

Escreva as perguntas principais que o negócio fará. Se para responder a algo básico for necessário interpretar cinco códigos obscuros e reconstruir manualmente uma sequência implícita, talvez o modelo não represente o negócio com clareza.

Passo 8 — Planeje o físico depois do lógico

Somente então avalie índices, particionamento, clustering, compressão, tablespaces, estatísticas, padrões batch, concorrência, recuperação e retenção.

Índice não corrige semântica. Ele encontra depressa aquilo que talvez tenha sido armazenado errado.

11. A fronteira que nunca parece clara nos projetos reais

Na prática, as fronteiras ficam nebulosas porque sistemas empresariais acumulam décadas de decisões:

  • tabelas nasceram de layouts VSAM;

  • segmentos IMS foram convertidos quase mecanicamente;

  • interfaces batch exigiram registros autocontidos;

  • projetos evitaram foreign keys por medo de desempenho ou dificuldade de carga;

  • regras ficaram duplicadas em COBOL, Java, stored procedures e ETLs;

  • aquisições juntaram conceitos diferentes sob nomes iguais;

  • cada equipe modelou apenas a parte que conhecia;

  • urgências transformaram exceções temporárias em arquitetura permanente.

Por isso, sua sensação não é nostalgia técnica nem impressão equivocada. Muitas instalações Db2 contêm estratos arqueológicos. Na superfície há SQL moderno; alguns metros abaixo aparecem tabelas tratadas como KSDS; mais fundo, chaves carregam caminhos de segmentos; no último nível, um programa ainda acredita que branco, zero e ausência são a mesma criatura.

Uma boa modernização começa reconhecendo esses estratos. Não é necessário demolir tudo. Pode-se:

  1. documentar o significado real das tabelas;

  2. identificar fontes oficiais e redundâncias;

  3. localizar relações sem constraints;

  4. medir órfãos e inconsistências antes de criar FKs;

  5. encapsular legados por views e serviços;

  6. corrigir novas extensões segundo um modelo melhor;

  7. migrar por domínios, com reconciliação e rollback;

  8. manter desempenho e operação envolvidos desde o desenho.

Colocar uma foreign key numa base histórica sem verificar dados existentes pode revelar milhões de órfãos. A constraint não criou o problema; ela apenas encontrou os esqueletos.

12. Checklist do explorador relacional

Ao examinar uma tabela, pergunte:

  1. Cada linha representa exatamente o quê?

  2. Qual regra torna uma linha única?

  3. A chave representa identidade ou caminho de navegação?

  4. Quais foreign keys deveriam existir?

  5. Há registros órfãos?

  6. Existem listas dentro de colunas?

  7. Há colunas numeradas como ENDERECO_1, ENDERECO_2 e ENDERECO_3?

  8. O mesmo fato aparece em várias tabelas?

  9. Qual delas é a fonte oficial?

  10. O programa depende da ordem sem ORDER BY?

  11. Existem sequências de SELECT que imitam pai-filho-neto?

  12. As regras vivem no banco ou espalhadas por programas?

  13. É possível reconstruir o passado?

  14. Branco, zero e NULL possuem significados definidos?

  15. Alterar um relacionamento exige alterar a identidade do registro?

Se muitas respostas causarem desconforto, provavelmente existe um IMS, um VSAM ou um QSAM conceitual vivendo por baixo das tabelas. Isso não condena o sistema, mas indica onde começar a investigação.

Epílogo — O centro da Terra não era o fim da viagem

Depois de atravessar galerias de QSAM, atalhos de VSAM, árvores de IMS e salões relacionais do Db2, nosso programador COBOL finalmente entendeu que nenhuma dessas tecnologias é vilã.

QSAM pode ser perfeito para uma grande varredura batch. VSAM pode oferecer o acesso direto e previsível de que determinada aplicação necessita. IMS pode processar hierarquias estáveis com eficiência extraordinária. Db2 pode representar conjuntos relacionados, proteger integridade e permitir múltiplos caminhos lógicos de consulta.

O erro não está em conservar tecnologia antiga quando ela resolve bem o problema. O erro está em usar uma tecnologia sem compreender seu modelo — ou esperar que a simples migração física transforme automaticamente a maneira de pensar.

Uma boa modelagem relacional apresenta:

  • conceitos com fronteiras compreensíveis;

  • linhas com identidade clara;

  • fatos colocados onde realmente pertencem;

  • relacionamentos declarados e protegidos;

  • cardinalidades fiéis ao negócio;

  • ausência e tempo com significado definido;

  • redundância consciente, quando necessária;

  • independência entre a pergunta lógica e o caminho físico;

  • capacidade de evoluir sem obrigar cada programa a memorizar a árvore inteira.

No final de Viagem ao Centro da Terra, os exploradores não retornam pelo mesmo caminho: são expelidos por outro vulcão, muito longe do ponto de entrada. É um belo easter egg relacional. Num mundo governado por caminhos hierárquicos, a saída deveria repetir a rota conhecida. Num mundo relacional, diferentes caminhos podem alcançar o mesmo conjunto de fatos.

E se Edgar F. Codd estivesse sentado numa poltrona do Bellacosa Mainframe, tomando café enquanto examinava aquela chave de 47 bytes, talvez dissesse com toda a elegância britânica:

Meu caro, isto não é uma relação. É uma árvore genealógica tentando passar pela catraca do Db2.

O programador olharia novamente para o copybook, respiraria fundo e abriria o catálogo.

A expedição verdadeira estaria apenas começando.

Vagner Renato Bellacosa, IBM Champion e especialista em IBM Mainframe
IBM Z17 SYSTEM ONLINE
Sobre o autor

Vagner Renato Bellacosa

IBM Champion 2026 • Especialista em IBM Mainframe

Vagner Renato Bellacosa trabalha com IBM Mainframe desde 1988 , é IBM Champion e especialista em COBOL, CICS, Db2, z/OS e IBM Z. Compartilha experiências profissionais, conhecimento técnico, história da computação e práticas do universo mainframe para aproximar novas gerações das tecnologias que sustentam empresas, bancos e governos ao redor do mundo.

IBM Champion IBM Z COBOL CICS Db2 z/OS Mainframe desde 1988
GitHub LinkedIn
Inicializando conteúdo...