Translate

segunda-feira, 30 de setembro de 2024

🔥 JCL no z/OS 3.2 — o silêncio que sustenta tudo

 

Bellacosa Maiframe apresenta JCL V3.2 Job Control Language

🔥 JCL no z/OS 3.2 — o silêncio que sustenta tudo



📅 Datas importantes

  • Release (GA): setembro de 2024

  • Final de suporte IBM (EoS): 30 de setembro de 2029 (ciclo padrão de suporte)

O z/OS 3.2 não veio para “mudar o jogo”.
Ele veio para confirmar quem sempre mandou no jogo.


🧬 Contexto histórico

O z/OS 3.2 nasce num mundo onde:

  • Cloud híbrida já é chão de fábrica

  • Observabilidade virou obrigação

  • Segurança é contínua

  • Automação é regra

  • APIs e eventos disparam tudo

E mesmo assim…

👉 o JCL continua sendo o último elo confiável entre intenção e execução.

Bellacosa resumiria assim:

“O mundo ficou barulhento.
O JCL continua em silêncio… funcionando.”


JCL V3.2 Job Control Language

✨ O que há de novo no JCL no z/OS 3.2

A resposta curta (e honesta):

❌ Nada mudou na linguagem
✅ Tudo mudou no peso estratégico do JCL

🆕 1. JCL como fundação do core digital

No z/OS 3.2:

  • O batch é oficialmente serviço corporativo

  • JCL é disparado por:

    • APIs

    • eventos

    • pipelines

    • schedulers cognitivos

  • O JCL vira o contrato final de execução

👉 Se passou pelo JCL, aconteceu de verdade.


🆕 2. JES2 no ponto máximo de previsibilidade

  • Escala massiva de jobs concorrentes

  • Spool estável como rocha

  • Restart e recovery totalmente previsíveis

  • Integração total com automação e monitoramento

O operador agora governa fluxo,
não apaga incêndio.


🆕 3. DFSMS completamente orientado a políticas

  • Storage cada vez mais autônomo

  • Menos parâmetros manuais

  • Menos erro humano

  • Mais inteligência sistêmica

O resultado?
👉 JCL mais limpo, mais legível e mais durável.


🔧 Melhorias percebidas no dia a dia

✔ Batch 24x7 sem drama
✔ Menos “gambiarras históricas”
✔ Mais padronização
✔ JCL tratado como código crítico
✔ Auditoria e rastreabilidade nativas

Nada mudou no //STEP EXEC.
Tudo mudou na responsabilidade do job.


🥚 Easter Eggs (para mainframer raiz)

  • 🥚 JCL escrito no OS/360 ainda roda no z/OS 3.2

  • 🥚 IEFBR14 segue vivo e respeitado

  • 🥚 Comentários em JCL mais antigos que DevOps 😅

  • 🥚 O erro mais comum continua sendo:

    • RC ignorado

    • DISP mal planejado

    • dataset em uso em produção

👉 Tecnologia evolui. Erro humano é backward compatible.


💡 Dicas Bellacosa para JCL no z/OS 3.2

🔹 Trate JCL como ativo estratégico corporativo
🔹 Pense no job como serviço crítico, não script
🔹 Versione JCL como código
🔹 Padronize nomes, comentários e RC
🔹 Documente decisões, não só comandos

🔹 Sempre use:

  • IF / THEN / ELSE

  • RC explícito

  • SYSOUT claro

  • comentários pensando em décadas

Esse JCL vai rodar quando você não estiver mais aqui.


📈 Evolução do JCL até o z/OS 3.2

EraPapel do JCL
OS/360Controle batch
MVSAutomação
OS/390Base corporativa
z/OS V1.xOrquestração
z/OS V2.xMundo híbrido
z/OS 3.1Core digital
z/OS 3.2Alicerce definitivo

👉 No z/OS 3.2, o JCL não é discutido.
Ele é assumido.


📜 Exemplo de JCL “cara de z/OS 3.2”

//BELL32 JOB (ACCT),'JCL z/OS 3.2', // CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID //* //* JOB EXPOSTO COMO SERVIÇO CORPORATIVO //* DISPARADO POR API / EVENTO / PIPELINE //* //STEP01 EXEC PGM=COREPROC //STEPLIB DD DSN=BELLACOSA.LOADLIB,DISP=SHR //SYSOUT DD SYSOUT=* //* //IF (STEP01.RC = 0) THEN //STEP02 EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DELETE BELLACOSA.WORK.DATA SET MAXCC = 0 /* //ENDIF

💬 Comentário Bellacosa:

“Esse job não sabe quem o chamou.
E isso é exatamente o motivo pelo qual ele é confiável.”


🧠 Comentário final

O JCL no z/OS 3.2 é a confirmação definitiva de uma verdade antiga:

🔥 Confiabilidade não se reinventa.
Ela se preserva.

Enquanto novas plataformas prometem estabilidade,
o JCL segue entregando há mais de 60 anos.

JCL não é passado.
JCL é o chão onde o futuro pisa.

domingo, 29 de setembro de 2024

Data Mining vs Data Analytics: Como um Programador Júnior Pode Transformar Dados em Inteligência de Negócios (e por que isso também importa no IBM Z)

 

Bellacosa Mainframe data mining versus data analytucs

☕ Um Café no Bellacosa Mainframe

Data Mining vs Data Analytics: Como um Programador Júnior Pode Transformar Dados em Inteligência de Negócios (e por que isso também importa no IBM Z)

"No mundo da tecnologia, dados são o novo petróleo. Mas petróleo bruto não move um carro. Primeiro ele precisa ser refinado. Com dados acontece exatamente a mesma coisa."

Quando alguém começa sua carreira em desenvolvimento de software, principalmente no universo do IBM Mainframe, costuma imaginar que seu trabalho será apenas escrever programas COBOL, criar JCLs, consultar DB2 ou desenvolver transações CICS.

E durante algum tempo isso realmente acontece.

Mas, conforme você evolui, percebe uma verdade importante:

Programadores não desenvolvem apenas software. Desenvolvem conhecimento.

Toda aplicação corporativa existe por um motivo: gerar, armazenar ou consumir dados.

E é justamente aí que entram dois conceitos que aparecem cada vez mais em entrevistas, projetos modernos e iniciativas de Inteligência Artificial:

  • Data Mining

  • Data Analytics

Muita gente acredita que são sinônimos.

Não são.

Na verdade, um complementa o outro.

Hoje vamos tomar mais um café e entender essa diferença de uma maneira que faça sentido para um desenvolvedor iniciante, principalmente para quem pretende trabalhar com sistemas corporativos de grande porte.


O tesouro escondido dentro do banco de dados

Imagine que você trabalha em um grande banco.

Todos os dias são registrados:

  • 25 milhões de transações

  • 8 milhões de PIX

  • 4 milhões de compras no cartão

  • 900 mil empréstimos simulados

  • milhares de acessos ao Internet Banking

Agora imagine isso acontecendo durante vinte anos.

Estamos falando de bilhões de registros.

Você conseguiria abrir uma planilha com tudo isso?

Nem o Excel teria coragem.

Então surge uma pergunta.

Como descobrir informações úteis dentro dessa montanha de dados?

É exatamente essa pergunta que deu origem ao Data Mining.


O que é Data Mining?

A tradução literal seria algo como:

Mineração de Dados.

O nome não foi escolhido por acaso.

Imagine um garimpeiro.

Ele não está interessado em toda a terra da mina.

Ele quer encontrar ouro.

Para isso precisa cavar toneladas de pedras.

O Data Mining faz exatamente isso.

Ele "escava" enormes bases de dados procurando algo valioso.

Pode ser:

  • padrões

  • tendências

  • correlações

  • comportamentos

  • anomalias

  • oportunidades

  • riscos

O objetivo não é produzir relatórios bonitos.

O objetivo é descobrir conhecimento escondido.


Data não é informação

Essa é uma das primeiras lições da Ciência de Dados.

Imagine esta sequência.

235
842
129
842
235
991

São apenas números.

Agora imagine que você descubra que representam códigos de produtos vendidos.

Ainda assim são apenas dados.

Agora descubra que:

  • 842 vende três vezes mais nas sextas-feiras;

  • 235 sempre é comprado junto com 991;

  • clientes que compram 129 têm alta chance de cancelar o serviço em até 90 dias.

Agora sim existe informação.

E foi o Data Mining que encontrou isso.


Data Analytics entra em cena

Suponha que o Data Mining encontrou o seguinte padrão:

Clientes entre 20 e 30 anos cancelam o serviço três vezes mais que os demais.

Excelente descoberta.

Mas...

E agora?

O que fazer com essa informação?

É aqui que entra o Data Analytics.

Analytics responde perguntas como:

  • Isso representa quanto de prejuízo?

  • Qual campanha devemos lançar?

  • Vale a pena oferecer desconto?

  • Quanto vamos economizar?

  • Qual decisão deve ser tomada?

Perceba a diferença.

Data Mining encontra.

Data Analytics interpreta.


Uma analogia simples

Imagine um arqueólogo.

Ele encontra uma antiga espada enterrada.

Esse trabalho é o Data Mining.

Agora entra um historiador.

Ele analisa a espada.

Descobre:

  • de qual época veio;

  • quem provavelmente a utilizava;

  • sua importância histórica;

  • seu valor.

Esse é o Data Analytics.


A grande confusão

Uma das frases da imagem diz que:

Data Mining é apenas parte do Data Analytics.

Na prática, isso está correto.

Analytics é muito mais amplo.

Ele envolve:

  • Estatística

  • Business Intelligence

  • Dashboards

  • KPIs

  • Visualização

  • Inteligência Artificial

  • Machine Learning

  • Forecast

  • Otimização

  • Data Mining

Ou seja:

Data Analytics

│

├── Estatística

├── BI

├── Dashboards

├── Visualização

├── IA

├── Machine Learning

└── Data Mining

Mining é uma ferramenta.

Analytics é a estratégia.


Onde entra o Machine Learning?

Outra dúvida bastante comum.

Machine Learning não substitui Data Mining.

Na verdade, ele fornece muitos dos algoritmos utilizados durante a mineração.

Por exemplo:

  • Árvores de decisão

  • Redes neurais

  • Random Forest

  • K-Means

  • Regressão

  • SVM

Todos podem ser utilizados para descobrir padrões.


As quatro grandes perguntas da análise de dados

Existe um modelo bastante conhecido.

1. O que aconteceu?

Análise Descritiva.

Exemplo.

"As vendas caíram 15%."


2. Por que aconteceu?

Análise Diagnóstica.

"O concorrente lançou uma promoção."


3. O que vai acontecer?

Análise Preditiva.

"Existe 82% de chance de queda nas vendas no próximo trimestre."


4. O que devemos fazer?

Análise Prescritiva.

"Aumentar o investimento em marketing digital na região Sudeste."

Perceba como o Analytics evolui da observação para a ação.


Um exemplo usando COBOL

Imagine um programa COBOL responsável por registrar pagamentos.

Todos os dias ele grava milhões de registros.

Durante cinco anos ele acumulou:

CLIENTE

VALOR

DATA

HORA

AGÊNCIA

CANAL

TIPO DE PAGAMENTO

Agora imagine um cientista de dados analisando tudo isso.

O Data Mining descobre que:

  • clientes acima de 65 anos utilizam mais caixas eletrônicos;

  • pagamentos acima de determinado valor aumentam nas sextas-feiras;

  • determinadas agências apresentam comportamento incomum.

Nenhum programador escreveu essas regras.

Os algoritmos descobriram.


Agora entra o Analytics

O Analytics recebe essas descobertas.

Calcula:

  • impacto financeiro;

  • risco;

  • ROI;

  • custo operacional.

Depois responde:

Vale abrir mais caixas eletrônicos?

Vale reforçar a equipe?

Vale oferecer novos produtos?

É por isso que Analytics está diretamente ligado ao negócio.


E no IBM Mainframe?

Muitos iniciantes imaginam que Mainframe apenas executa programas COBOL.

Nada poderia estar mais distante da realidade.

Todos os dias um IBM Z produz uma quantidade gigantesca de informações.

Exemplos.

SMF Records.

RMF.

JES2.

JES3.

SDSF.

RACF.

DB2.

IMS.

MQ.

OMEGAMON.

CICS.

z/OSMF.

Cada componente registra milhares de eventos.

Isso significa milhões de linhas diariamente.


Um Sysprog também faz Analytics

Imagine analisar os registros SMF.

O Data Mining pode descobrir:

  • Jobs que sempre falham juntos.

  • Crescimento gradual do consumo de CPU.

  • Programas responsáveis por gargalos.

  • Horários de pico.

  • Tendências de utilização do DASD.

  • Perfis suspeitos de acesso RACF.

Depois entra o Analytics.

Ele responde.

Devemos comprar mais processadores?

Precisamos aumentar memória?

Vale reorganizar o DB2?

Precisamos alterar políticas do WLM?

Ou seja.

Até mesmo um Administrador Mainframe trabalha com Analytics sem perceber.


Curiosidade

Você sabia que grandes bancos analisam bilhões de registros diariamente usando dados originados no próprio Mainframe?

Isso acontece porque o IBM Z continua sendo responsável por boa parte das transações financeiras do planeta.

Não é exagero dizer que boa parte do dinheiro movimentado diariamente passa por algum sistema que gera dados para análises.


O ciclo completo

Visualmente seria algo assim.

Aplicações

↓

COBOL

↓

CICS

↓

DB2

↓

Dados

↓

ETL

↓

Data Warehouse

↓

Data Mining

↓

Machine Learning

↓

Data Analytics

↓

Dashboards

↓

Decisões

↓

Novas Estratégias

Perceba.

Tudo começa com um bom software.


O futuro: IA + Analytics

Nos últimos anos surgiu um novo personagem.

A Inteligência Artificial Generativa.

Agora imagine o seguinte diálogo.

"ChatGPT, quais foram os cinco produtos com maior crescimento no último trimestre?"

A IA consulta o banco de dados.

Executa SQL.

Analisa gráficos.

Cruza informações.

Explica os resultados.

Sugere decisões.

Esse é o conceito de Augmented Analytics, em que a IA acelera a interpretação dos dados, permitindo que analistas e gestores se concentrem nas decisões de maior impacto.


Dicas para um Programador Júnior

Se você está começando, não tente aprender tudo ao mesmo tempo. Construa uma base sólida.

1. Aprenda SQL profundamente
Quase todo projeto de dados começa com consultas bem escritas. Saber fazer JOIN, GROUP BY, funções analíticas e otimizar consultas é uma habilidade valiosa.

2. Entenda modelagem de dados
Conheça tabelas normalizadas, chaves primárias, chaves estrangeiras e relacionamentos. Um bom modelo facilita qualquer análise.

3. Domine Excel e Power BI
Mesmo em grandes empresas, essas ferramentas são amplamente utilizadas para explorar dados e criar dashboards.

4. Aprenda Python
Bibliotecas como Pandas, NumPy, Matplotlib e Scikit-learn permitem manipular dados e criar modelos de forma eficiente.

5. Conheça estatística básica
Média, mediana, desvio padrão, correlação e distribuição são conceitos essenciais para interpretar resultados corretamente.

6. Desenvolva visão de negócio
Pergunte sempre: "Como essa análise ajuda a empresa?" A tecnologia existe para resolver problemas reais.

7. Se você é do Mainframe, explore os dados da plataforma
SMF, RMF, Db2, CICS e RACF são verdadeiras minas de informação. Aprender a interpretá-los pode diferenciá-lo no mercado.


Erros comuns dos iniciantes

❌ Acreditar que gráficos são Analytics. Um gráfico sem contexto não responde perguntas de negócio.

❌ Pensar que Machine Learning resolve qualquer problema. Um modelo treinado com dados ruins produzirá resultados ruins.

❌ Ignorar a qualidade dos dados. Dados duplicados, incompletos ou inconsistentes comprometem qualquer análise.

❌ Focar apenas na ferramenta. O mais importante é entender o problema, não apenas dominar uma linguagem ou software.


Easter Eggs Bellacosa Mainframe ☕

🥚 Easter Egg #1 – O Data Miner do século XXI
Se um garimpeiro usa uma peneira para separar ouro da areia, o cientista de dados usa algoritmos para separar conhecimento do ruído. Em ambos os casos, a matéria-prima é abundante, mas o valor está escondido.

🥚 Easter Egg #2 – O COBOL já fazia Analytics sem esse nome
Muitos sistemas COBOL geravam relatórios gerenciais, balanços e estatísticas décadas antes de "Data Analytics" virar um termo popular. A diferença é que hoje utilizamos ferramentas muito mais sofisticadas para explorar esses mesmos dados.

🥚 Easter Egg #3 – O Mainframe é uma fábrica de dados
Cada transação CICS, cada acesso ao Db2, cada Job JES2 e cada registro SMF conta uma parte da história da empresa. Quando unidos, esses eventos formam um dos ativos mais valiosos de qualquer organização.

🥚 Easter Egg #4 – O verdadeiro ouro não está no algoritmo
O algoritmo encontra padrões, mas quem transforma esses padrões em inovação é o ser humano. Conhecimento técnico e entendimento do negócio continuam sendo diferenciais insubstituíveis.

🥚 Easter Egg #5 – O café do Bellacosa
Se você chegou até aqui, já percebeu que programar vai muito além de escrever código. Todo sistema existe para apoiar decisões, e toda decisão de qualidade nasce de dados bem compreendidos. O café é apenas a desculpa para conversarmos sobre isso.


Conclusão

A principal lição deste café é simples: Data Mining e Data Analytics não disputam espaço; eles trabalham em conjunto. O primeiro explora grandes volumes de dados para revelar padrões, tendências e anomalias. O segundo interpreta essas descobertas, contextualiza os resultados e transforma conhecimento em ações estratégicas.

Para um programador júnior — seja em desenvolvimento web, ciência de dados ou IBM Mainframe — compreender essa diferença é um passo importante na evolução profissional. Afinal, cada programa COBOL, cada tabela Db2, cada API ou cada transação CICS produz dados que podem orientar decisões de negócio.

No fim das contas, o código é apenas o começo da jornada. O verdadeiro valor aparece quando esses dados são transformados em conhecimento, e esse conhecimento se converte em melhores produtos, processos mais eficientes e decisões mais inteligentes.

"Quem aprende apenas a programar constrói sistemas. Quem aprende a entender os dados constrói o futuro. No universo IBM Z, onde bilhões de transações acontecem silenciosamente todos os dias, cada registro pode esconder uma oportunidade esperando para ser descoberta."

sábado, 28 de setembro de 2024

🔥 ZOWE: O Mainframe Falando a Língua do Mundo Moderno

 

Bellacosa Mainframe apresenta o Zowe 3.0

🔥 ZOWE: O Mainframe Falando a Língua do Mundo Moderno

Um guia definitivo para quem vive entre COBOL, APIs e DevOps

Se você ainda acha que mainframe é só tela verde, ISPF e 3270, chegou a hora de atualizar o firmware mental.
O nome disso é Zowe — e ele não veio para substituir o z/OS, mas para traduzir o mainframe para o século XXI.

Neste artigo, vamos direto ao ponto, sem marketing vazio, no melhor estilo Bellacosa Mainframe:
o que é Zowe, para que serve, onde brilha, onde NÃO entra e por que ele é essencial hoje.


Zowe 3.0

🧠 O que é o Zowe, afinal?

Zowe é um framework open source criado para permitir que aplicações modernas, desenvolvedores não-mainframe e ferramentas DevOps trabalhem com e sobre o z/OS.

Ele nasce para resolver um problema clássico:

“Como integrar o mainframe ao ecossistema web, cloud e DevOps sem quebrar tudo o que funciona há 40 anos?”

A resposta foi: abstração, APIs, CLI e Web — sem mexer no core.


🧩 Os 3 Pilares do Zowe

1️⃣ Zowe CLI – O mainframe na linha de comando

O Zowe Command Line Interface permite executar operações no z/OS a partir de:

  • Windows

  • Linux

  • macOS

Usando shell local, scripts e pipelines.

Com ele você pode:

  • Submeter batch jobs

  • Emitir comandos TSO e z/OS

  • Manipular datasets MVS e USS

  • Automatizar tarefas em Jenkins, GitHub Actions, Bamboo etc.

⚠️ Importante (pegadinha de prova):
👉 Zowe CLI NÃO emula 3270
👉 Zowe CLI NÃO executa transações CICS interativas

CLI é comando, automação e integração — não tela verde.


2️⃣ Zowe Application Framework – Web no coração do z/OS

Aqui mora o Zowe Desktop, a interface web desktop-like, acessível via browser.

Ele oferece:

  • Navegação e edição de datasets

  • Visualização de jobs e spool

  • Integração com TN3270

  • Aplicações web plugáveis

E o mais importante:

  • Suporte a Angular, React e IFrame

  • Desenvolvimento em JavaScript, Java e tecnologias mainstream

  • Ambiente amigável para devs que nunca ouviram falar de ISPF

📌 Zowe não substitui ISPF, CICS ou IMS
Ele complementa — e muito bem.


3️⃣ Zowe API Mediation Layer – O gateway do mainframe

O API Mediation Layer (API ML) é o tradutor oficial entre o z/OS e o mundo REST.

Ele fornece:

  • Ponto único de acesso a múltiplos serviços REST

  • Catálogo de APIs com Swagger/OpenAPI

  • Segurança centralizada

  • Roteamento e balanceamento de carga

⚠️ Atenção:

  • Zowe não cria APIs automaticamente

  • Zowe não melhora performance das APIs

Ele organiza, protege e expõe o que já existe.


🔐 Segurança: nada de gambiarra

Zowe usa a segurança nativa do z/OS:

  • RACF

  • ACF2

  • Top Secret

Autenticação é feita com:

  • User ID e password válidos

  • Permissões reais do sistema

Nada de “security by JavaScript”.


🟢 Onde o Zowe BRILHA (e muito)

  • Integração do mainframe com DevOps e CI/CD

  • Abertura do z/OS para desenvolvedores não-mainframe

  • Automação moderna sem mexer no core

  • Criação de dashboards web com dados do z/OS

  • Padronização e governança de APIs

  • Open source de verdade, com comunidade ativa


🔴 Onde o Zowe NÃO entra

Vamos ser claros:

Zowe NÃO é:

  • Emulador 3270

  • Substituto do ISPF

  • Substituto do z/OSMF

  • Ferramenta de automação interna (WTOR, exits, SMF)

  • Ambiente J2EE/WebSphere

  • Solução mágica de performance

👉 Se envolve tela verde interativa, exits, automação interna, SDSF raiz
👉 não é Zowe


📊 Regra de ouro Bellacosa Mainframe

Web, API, CLI, DevOps, automação externa → ZOWE
3270, ISPF, CICS interativo, automação interna → NÃO ZOWE

Simples assim.


🚀 Por que o Zowe é estratégico hoje?

Porque ele resolve um problema real:

  • O mainframe continua crítico

  • O mercado exige integração, velocidade e automação

  • Novos desenvolvedores não querem aprender ISPF antes de produzir

Zowe não mata o mainframe.
Ele garante que o mainframe continue vivo, integrado e relevante.


☕ Conclusão – estilo Bellacosa

Zowe não é moda.
Zowe é sobrevivência arquitetural.
Quem entende Zowe hoje, lidera a modernização amanhã — sem quebrar o legado que paga as contas.

Se você trabalha com IBM Z e ainda ignora o Zowe, o problema não é o mainframe.
É a sua estratégia.


sexta-feira, 27 de setembro de 2024

Hypervisor no Mainframe sem Mistérios

 

Bellacosa Mainframe e o hypervisor no mainframe sem misterios

☕ Um Café no Bellacosa Mainframe

Hypervisor no Mainframe sem Mistérios

Como um IBM Z Executa Centenas de Servidores ao Mesmo Tempo — O Guia Definitivo para o Programador COBOL Padawan Inspirado em Star Trek

"A lógica é o começo da sabedoria, não o fim."

— Sr. Spock


Introdução — A Grande Ilusão da Computação

Imagine entrar na ponte da USS Enterprise.

O Capitão Kirk acredita que possui uma nave inteira à sua disposição.

O engenheiro Scotty controla motores, energia e sistemas.

O Dr. McCoy utiliza computadores médicos.

Spock executa simulações científicas.

Cada um acredita possuir recursos exclusivos.

Mas existe apenas uma única nave.

O segredo é que existe um sistema extremamente inteligente distribuindo recursos para todos ao mesmo tempo.

No IBM Z acontece exatamente isso.

Para um programador COBOL iniciante, isso pode parecer magia.

Na realidade, trata-se de uma das maiores invenções da história da computação:

o Hypervisor.

E a parte curiosa?

O mainframe fazia isso quando o restante do mundo ainda estava tentando descobrir como compartilhar um computador entre vários usuários.


Antes de tudo...

Muita gente pensa que virtualização nasceu com VMware.

Spoiler...

Não nasceu.

A IBM já fazia virtualização completa décadas antes da Internet existir.

Quando o primeiro PC da IBM apareceu em 1981, os mainframes já executavam dezenas de sistemas operacionais simultaneamente.

Isso muda completamente a perspectiva histórica.


O que é um Hypervisor?

A definição técnica é simples.

Um Hypervisor é um software (ou firmware especializado) responsável por criar computadores virtuais.

Cada computador virtual recebe:

  • memória

  • CPUs

  • discos

  • placas de rede

  • dispositivos

  • acesso ao hardware

Tudo isso sem possuir fisicamente esses equipamentos.

Para o sistema operacional convidado (Guest OS), parece existir um computador inteiro.

Na verdade...

Ele está dividindo recursos com centenas de outros sistemas.


Uma analogia Bellacosa

Imagine um enorme prédio comercial.

Existe:

  • uma única estrutura

  • um único elevador

  • uma única instalação elétrica

  • um único sistema hidráulico

Mas existem centenas de empresas trabalhando ali.

Cada empresa acredita possuir seu próprio escritório.

Quem administra tudo?

O síndico.

No mundo da computação...

O síndico chama-se Hypervisor.


O problema que ele resolve

Nos anos 60 um computador custava milhões de dólares.

Não fazia sentido deixá-lo executando apenas um sistema.

Era desperdício.

A IBM percebeu isso rapidamente.

A ideia era simples:

"Se o computador é poderoso, por que não criar vários computadores dentro dele?"

Nascia a virtualização.


A origem histórica

Voltamos para 1964.

IBM System/360.

Era revolucionário.

Mas ainda executava apenas um sistema operacional por vez.

Logo depois veio o projeto:

CP-40

Depois:

CP-67

Esses projetos deram origem ao:

VM/370

E praticamente toda a indústria copiou essa ideia décadas depois.

Curiosamente...

A palavra "Virtual Machine" já era usada pela IBM muito antes do VMware existir.


Linha do tempo

1964

System/360

1967

CP-40

1968

CP-67

1972

VM/370

1988

PR/SM

1990

LPAR

2000+

z/VM

Hoje

IBM z16

IBM z17

Linux

z/OS

z/VM

KVM

Todos convivendo na mesma máquina.


O nascimento das Máquinas Virtuais

Imagine possuir um computador enorme.

O Hypervisor cria:

Computador A

Computador B

Computador C

Computador D

Todos são imaginários.

Mas funcionam como computadores reais.

Cada um pode instalar:

  • Linux

  • z/OS

  • z/VM

  • z/VSE

  • z/TPF

Sem interferir uns nos outros.


Como isso funciona?

O Hypervisor controla quatro grandes recursos.

CPU

Quando um sistema precisa processar algo...

Ele pede CPU.

O Hypervisor responde:

"Espere sua vez."

Em microssegundos ele alterna entre centenas de sistemas.

Para cada sistema parece possuir uma CPU exclusiva.


Memória

O mesmo acontece com RAM.

Cada máquina virtual acredita possuir memória exclusiva.

Na realidade...

Toda memória é compartilhada cuidadosamente.


Disco

Cada sistema possui seus próprios discos.

Mas muitas vezes esses discos são apenas áreas reservadas dentro de grandes volumes físicos.


Rede

Cada servidor virtual possui placas de rede.

Elas também podem ser totalmente virtuais.

O Hypervisor conecta tudo internamente.

Sem sequer sair do equipamento.


Parece mágica?

Não.

É matemática.

E engenharia.

Muita engenharia.


Hypervisor Tipo 1

Existem dois tipos.

O mais poderoso é:

Bare Metal.

Ou:

Tipo 1.

Ele roda diretamente sobre o hardware.

Sem Windows.

Sem Linux.

Sem intermediários.

É exatamente o caso do IBM Z.


Hypervisor Tipo 2

Neste caso existe um sistema operacional.

Windows

VMware Workstation

Máquinas Virtuais

O desempenho é menor.


No IBM Z é diferente

Hardware

Firmware

PR/SM

LPARs

z/VM

Linux

Aplicações

Existe uma enorme hierarquia.

Cada camada aumenta a flexibilidade.


PR/SM

Aqui mora um dos segredos do mainframe.

PR/SM significa:

Processor Resource/System Manager.

Ele é considerado um Hypervisor de nível extremamente baixo.

Na prática...

Ele divide o computador físico em diversas LPARs.


O que é uma LPAR?

Significa:

Logical Partition.

É praticamente um computador inteiro.

Pode possuir:

12 CPUs

64 GB RAM

20 discos

10 interfaces de rede

Enquanto outra LPAR possui recursos completamente diferentes.


Imagine uma pizza

Uma pizza inteira representa o IBM Z.

Você corta em:

4 fatias.

Cada fatia torna-se uma LPAR.

Cada LPAR acredita possuir sua própria pizza.

Mesmo pertencendo à mesma pizza original.


E depois entra o z/VM

Agora vem a parte divertida.

Dentro de uma LPAR...

Pode existir outro Hypervisor.

Esse Hypervisor chama-se:

z/VM.

Agora temos:

IBM Z

LPAR

z/VM

500 máquinas Linux

Containers

Aplicações

Sim.

Virtualização dentro da virtualização.

É como um espelho refletindo outro espelho.


Star Trek explica isso muito bem

Lembra do Holodeck?

O Holodeck cria ambientes completos.

Cada personagem acredita estar vivendo num mundo real.

Mas tudo acontece dentro da Enterprise.

O Hypervisor faz exatamente isso.

Cada sistema operacional acredita possuir um computador físico.

Na realidade...

Está dentro do "Holodeck" do IBM Z.


Por que isso é tão importante?

Porque aumenta:

  • utilização

  • segurança

  • disponibilidade

  • economia

  • flexibilidade


Segurança

Cada máquina virtual fica isolada.

Se uma apresentar problema...

As demais continuam funcionando.

É como compartimentos estanques de uma nave estelar.

Uma explosão na Engenharia não destrói a ponte.


Alta disponibilidade

Imagine atualizar um Linux.

Os outros continuam funcionando.

Atualizar uma aplicação.

As demais continuam.

Trocar memória.

Trocar CPU.

Adicionar discos.

Tudo quase sem impacto.


Eficiência absurda

Um servidor x86 costuma operar entre:

15%

30%

de utilização.

Um IBM Z frequentemente trabalha entre:

80%

95%

de utilização.

Sem perda significativa de desempenho.

Esse é um dos grandes diferenciais do mainframe.


Compartilhamento Inteligente

O Hypervisor conhece prioridades.

Um banco pode receber mais CPU.

Uma aplicação de testes recebe menos.

Tudo automático.


Dynamic Resource Allocation

Outro recurso fantástico.

É possível aumentar CPUs.

Adicionar memória.

Modificar prioridades.

Tudo enquanto o sistema continua funcionando.

Sem reboot.

Isso impressiona até hoje.


Como isso afeta um programador COBOL?

Muito mais do que parece.

Seu programa roda dentro de:

COBOL

LE Runtime

z/OS

LPAR

PR/SM

Hardware

Você raramente percebe.

Mas o Hypervisor trabalha silenciosamente por trás.


Quando um COBOL executa

Imagine um programa de folha de pagamento.

Ele solicita CPU.

O z/OS solicita recursos.

O PR/SM entrega processadores.

Tudo acontece em microssegundos.

Você nunca percebe.

Mas existe um verdadeiro maestro coordenando toda essa orquestra.


O que acontece se houver excesso de carga?

O Hypervisor redistribui recursos.

Algumas LPARs recebem mais CPU.

Outras esperam alguns microssegundos.

Tudo automaticamente.


Curiosidade impressionante

Um único IBM Z pode executar milhares de máquinas virtuais Linux.

Tudo dentro do mesmo equipamento.

Consumindo menos energia que centenas de servidores distribuídos.

É por isso que grandes bancos continuam investindo em mainframe.


Easter Egg nº 1

A expressão Virtual Machine ficou famosa nos PCs.

Mas ela nasceu dentro da IBM.

Décadas antes.


Easter Egg nº 2

O VMware foi fundado apenas em 1998.

O VM/370 existia desde 1972.

Mais de 25 anos antes.


Easter Egg nº 3

A maioria dos administradores VMware nunca imaginou que muitos conceitos modernos foram herdados direta ou indiretamente dos laboratórios da IBM.


Easter Egg nº 4

O PR/SM possui certificação de isolamento extremamente rigorosa (EAL5+ em avaliações Common Criteria para determinadas configurações), permitindo que workloads de diferentes níveis de confiança coexistam com forte separação lógica. Isso é um dos motivos pelos quais governos e grandes instituições financeiras confiam na plataforma.


Dicas para o Padawan COBOL

✔ Nunca pense que seu programa "está sozinho".

Sempre existe uma camada abaixo dele.


✔ Aprenda o conceito de LPAR.

Você verá esse termo praticamente todos os dias.


✔ Entenda o z/VM.

Mesmo trabalhando apenas com COBOL.

Ele aparece frequentemente em ambientes Linux on Z.


✔ Estude PR/SM.

Poucos desenvolvedores conhecem.

Mas quem entende virtualização compreende muito melhor o IBM Z.


✔ Não confunda LPAR com Máquina Virtual.

LPAR é uma partição lógica criada diretamente pelo PR/SM. Dentro de uma LPAR, o z/VM pode criar centenas ou milhares de máquinas virtuais.


Comparação rápida

Universo Star TrekIBM Z
USS EnterpriseHardware físico
HolodeckHypervisor
Ponte de ComandoLPAR
Simulações do HolodeckMáquinas Virtuais
ScottyAdministrador do sistema
SpockWLM e gerenciamento inteligente de recursos
Computador da navePR/SM + z/VM

Lições aprendidas

Existe um mito de que virtualização é uma tecnologia moderna.

Na realidade, ela nasceu no mundo dos mainframes.

O IBM Z não apenas executa programas COBOL. Ele hospeda diversos sistemas operacionais, milhares de aplicações e enormes ambientes Linux com isolamento, segurança e desempenho excepcionais. O hypervisor — especialmente o PR/SM, complementado pelo z/VM quando necessário — é o grande responsável por essa façanha.

Quando um programador COBOL envia um JOB pelo JCL, acessa Db2, CICS ou IMS, dificilmente percebe que há uma sofisticada infraestrutura distribuindo CPUs, memória, dispositivos e redes em tempo real. Assim como a tripulação da Enterprise confia que a nave responderá a cada comando, o desenvolvedor confia que o IBM Z entregará recursos quando forem necessários.

E talvez essa seja a maior lição do universo de Star Trek aplicada ao mainframe: a tecnologia mais extraordinária é aquela que trabalha tão bem que quase se torna invisível. O hypervisor é esse "oficial silencioso" da nave. Ele não aparece na tela 3270, não compila programas COBOL e não executa SQL, mas sem ele grande parte da eficiência, da disponibilidade e da confiabilidade que tornaram o IBM Z uma referência mundial simplesmente não existiria.

Como diria o Sr. Spock:

"A eficiência não está em possuir mais recursos, mas em utilizá-los com inteligência."

Essa frase resume perfeitamente a filosofia do hypervisor no IBM Z: transformar um único computador físico em uma verdadeira frota de computadores virtuais, trabalhando em perfeita harmonia há mais de cinco décadas.


quinta-feira, 26 de setembro de 2024

O Guia Definitivo de Boas Práticas para Declarar Variáveis em COBOL Mainframe como os Grandes Bancos Fazem

 

Bellacosa Mainframe e o data division sem misterios

☕ Um Café no Bellacosa Mainframe

Data Division sem Mistérios

O Guia Definitivo de Boas Práticas para Declarar Variáveis em COBOL Mainframe como os Grandes Bancos Fazem

"Um programa COBOL raramente falha porque alguém escreveu um IF errado. Ele costuma falhar porque alguém declarou uma variável errada há vinte anos."


Introdução

Existe um velho ditado entre programadores de mainframe:

"O Procedure Division executa. A Data Division pensa."

Pode parecer exagero, mas basta passar alguns meses trabalhando em um grande banco para perceber que isso é verdade.

Quando um programa COBOL possui milhares de linhas, dezenas de interfaces, centenas de arquivos VSAM, tabelas DB2, chamadas CICS e APIs REST, o verdadeiro segredo não está apenas na lógica.

Está na organização dos dados.

É justamente por isso que os maiores bancos brasileiros possuem padrões extremamente rígidos para a Data Division.

Em muitos lugares, uma variável mal declarada simplesmente não passa pela revisão de código.

Neste artigo vamos aprender como profissionais experientes organizam suas variáveis, entender o motivo dessas regras existirem e descobrir como escrever programas que continuam fáceis de manter mesmo depois de décadas.

Pegue seu café.

Vamos organizar nossa memória principal.


Antes de falar de variáveis...

Imagine construir um prédio.

Você pode contratar o melhor pedreiro do mundo.

Se o engenheiro desenhar uma planta ruim, o prédio será um caos.

No COBOL acontece exatamente isso.

A Data Division é a planta do edifício.

A Procedure Division apenas utiliza aquilo que foi planejado.

Quanto melhor for sua estrutura de dados, mais simples será escrever toda a lógica do programa.


A filosofia dos grandes bancos

Em bancos, normalmente existem padrões semelhantes a estes:

  • nomes padronizados

  • agrupamentos claros

  • nenhuma variável "solta"

  • documentação implícita

  • facilidade para debug

  • facilidade para manutenção

  • reaproveitamento

O objetivo nunca é escrever menos.

É escrever melhor.


A estrutura clássica

Normalmente encontramos algo parecido.

WORKING-STORAGE SECTION.

01 WS-CONTROLE.

01 WS-ENTRADA.

01 WS-SAIDA.

01 WS-CALCULOS.

01 WS-INDICADORES.

01 WS-CONSTANTES.

01 WS-TABELAS.

01 WS-AREAS-DE-TRABALHO.

Só olhando os nomes já sabemos onde procurar qualquer informação.

Essa organização economiza horas de manutenção.


Prefixos fazem diferença

Um dos maiores erros de iniciantes é escrever:

01 NOME.
01 CPF.
01 IDADE.
01 TOTAL.

Imagine um programa com 8.000 variáveis.

Boa sorte.

Os grandes bancos normalmente utilizam prefixos.

WS-NOME
WS-CPF
WS-IDADE
WS-TOTAL

WS significa:

Working Storage.

Quando existem outras áreas:

LK-
DFHCOMMAREA
LS-
CS-
SQL-

Exemplo:

WS-CLIENTE

LK-CLIENTE

LS-CLIENTE

SQL-CLIENTE

Cada uma pertence a uma área diferente.

O nome já explica sua origem.


Nunca use nomes genéricos

Evite:

WS-AUX

WS-TEMP

WS-X

WS-DADOS

WS-AREA

WS-TESTE

Isso não explica absolutamente nada.

Prefira:

WS-SALDO-ATUAL

WS-VALOR-LIMITE

WS-TOTAL-PARCELAS

WS-QTD-CLIENTES

WS-DATA-PROCESSAMENTO

Quem ler o programa daqui a vinte anos agradecerá.


O padrão VERBO + OBJETO

Muitos bancos gostam de indicar o significado da variável.

Exemplo:

WS-QTD-PRODUTOS

WS-VLR-TOTAL

WS-DT-NASCIMENTO

WS-HR-PROCESSAMENTO

WS-FL-ATIVO

WS-CD-AGENCIA

WS-NR-CONTA

Observe as abreviações.

PrefixoSignificado
DTData
HRHora
FLFlag
CDCódigo
NRNúmero
QTDQuantidade
VLRValor
INDIndicador
TPTipo
DESCDescrição

Essas abreviações praticamente viraram um idioma próprio do mercado financeiro.


Os níveis da Data Division

Agora chegamos ao coração do COBOL.

Os famosos Levels.


Level 01

Representa um registro completo.

01 WS-CLIENTE.

Pense nele como uma pasta.

Dentro dela existirão documentos.


Level 05

Representa divisões principais.

01 WS-CLIENTE.

   05 WS-NOME.

   05 WS-CPF.

   05 WS-ENDERECO.

É o nível mais utilizado.


Level 10

Subdivisão.

05 WS-ENDERECO.

   10 WS-RUA.

   10 WS-NUMERO.

   10 WS-BAIRRO.

Level 15, 20, 25...

São apenas níveis hierárquicos.

01 CLIENTE

   05 ENDERECO

      10 CIDADE

         15 CEP

O COBOL não exige números específicos.

Apenas respeita a hierarquia.

Na prática, porém, muitos bancos adotam:

01

05

10

15

20

para manter um padrão visual.


Quando usar Level 77?

No passado era comum.

77 WS-CONTADOR PIC 9(4).

Hoje praticamente todos utilizam:

01 WS-CONTADOR PIC 9(4).

Ou agrupam dentro de áreas.

O uso do 77 tornou-se raro em novos projetos.


O poderoso Level 88

Um dos recursos mais elegantes do COBOL.

Imagine isso.

05 WS-STATUS PIC X.

88 WS-ATIVO VALUE "A".

88 WS-INATIVO VALUE "I".

Depois:

IF WS-ATIVO

Muito melhor que:

IF WS-STATUS = "A"

O código praticamente se transforma em português.

Outro exemplo.

88 WS-SIM VALUE "S".

88 WS-NAO VALUE "N".

Ou ainda:

88 WS-CONTA-CORRENTE VALUE "01".

88 WS-CONTA-POUPANCA VALUE "02".

Esse recurso é amplamente utilizado em bancos.


Agrupe informações relacionadas

Errado:

WS-NOME

WS-CPF

WS-RUA

WS-SALDO

WS-IDADE

WS-CIDADE

Correto.

01 WS-CLIENTE.

   05 WS-NOME.

   05 WS-CPF.

   05 WS-ENDERECO.

      10 WS-RUA.

      10 WS-CIDADE.

   05 WS-SALDO.

A estrutura fica muito mais intuitiva.


REDEFINES

Poucos recursos são tão poderosos.

Imagine um arquivo.

1234567890

Pode representar:

CPF

ou

Código interno

Não faz sentido duplicar memória.

Usamos:

01 WS-AREA.

   05 WS-DADOS PIC X(10).

01 WS-CPF REDEFINES WS-DADOS.

   05 WS-NUMERO PIC 9(10).

A memória é exatamente a mesma.

Apenas muda a interpretação.


Onde bancos usam REDEFINES?

Muito frequentemente em:

  • layouts CNAB

  • buffers CICS

  • mensagens MQ

  • áreas de comunicação

  • protocolos

  • APIs

  • conversões numéricas

  • interpretação de bytes


Cuidados com REDEFINES

Nunca faça isso sem entender o layout.

Porque alterar uma redefinição altera todas.

É literalmente a mesma memória.


RENAMES

Pouca gente conhece.

Exemplo.

01 WS-REGISTRO.

   05 WS-NOME.

   05 WS-ENDERECO.

   05 WS-CIDADE.

66 WS-DADOS-CADASTRAIS
RENAMES WS-NOME THRU WS-CIDADE.

Agora podemos manipular todo esse trecho como um único grupo lógico.

Hoje aparece menos que REDEFINES, mas ainda existe em sistemas legados e alguns frameworks internos.


CONSTANTES

Nunca escreva:

IF WS-TIPO = "A"

Prefira:

78 ATIVO VALUE "A".

IF WS-TIPO = ATIVO

Ou

01 WS-CONSTANTES.

   05 WS-TP-ATIVO VALUE "A".

   05 WS-TP-INATIVO VALUE "I".

O significado fica explícito.


PIC correto faz diferença

Texto.

PIC X(30)

Numérico.

PIC 9(5)

Decimal.

PIC S9(9)V99 COMP-3

Valor monetário.

PIC S9(11)V99 COMP-3

Nunca utilize texto para armazenar números quando eles serão calculados.


COMP, COMP-3 e DISPLAY

Nos bancos é comum encontrar a seguinte estratégia:

DISPLAY

para entrada e saída.

COMP

para cálculos inteiros.

COMP-3

para valores financeiros.

Exemplo.

05 WS-SALDO
PIC S9(11)V99 COMP-3.

Além de economizar espaço, melhora desempenho e precisão decimal.


Inicialização

Sempre inicialize.

VALUE ZERO.

VALUE SPACES.

VALUE LOW-VALUES.

VALUE HIGH-VALUES.

Ou utilize

INITIALIZE

Evite depender do conteúdo anterior da memória.


Um erro clássico

05 WS-NOME PIC X(30).

Depois.

MOVE "JOAO" TO WS-NOME

Comparação.

IF WS-NOME = "JOAO"

Pode funcionar.

Pode não funcionar.

Por quê?

Porque existem espaços restantes.

Muitos bancos utilizam:

FUNCTION TRIM

ou

INSPECT

para evitar problemas.


Tabelas OCCURS

Sempre nomeie corretamente.

05 WS-CLIENTES OCCURS 100 TIMES.

   10 WS-NOME.

   10 WS-SALDO.

Índices separados.

77 WS-IDX PIC S9(4) COMP.

Ou

INDEXED BY IDX-CLIENTE

Muito mais eficiente.


Evite mágicas

Nunca faça:

MOVE 1 TO WS-X.

Depois.

IF WS-X = 1

Prefira.

88 WS-PROCESSADO VALUE 1.

Muito mais legível.


Organização visual

Bancos normalmente alinham tudo.

05 WS-NOME            PIC X(40).

05 WS-CPF             PIC 9(11).

05 WS-SALDO           PIC S9(09)V99 COMP-3.

05 WS-DATA-NASC       PIC 9(08).

Pode parecer detalhe.

Mas melhora muito a leitura.


Comentários úteis

Evite.

* Nome.

Prefira.

* Dados recebidos do cadastro central.

* Área utilizada para integração com PIX.

* Buffer utilizado pelo CICS.

Explique o motivo.

Não o óbvio.


╔══════════════════════════════════════════════════════════════════════╗
║                     COBOL DATA DIVISION                             ║
║               "Tudo começa pelos dados."                            ║
╚══════════════════════════════════════════════════════════════════════╝

                       PROGRAMA COBOL
                             │
                             ▼
                  WORKING-STORAGE SECTION
                             │
        ┌────────────────────┼────────────────────┐
        │                    │                    │
        ▼                    ▼                    ▼
   WS-CONTROLE          WS-ENTRADA          WS-SAÍDA
        │                    │                    │
        ▼                    ▼                    ▼
     Variáveis           Arquivos           Resultados
     de Trabalho         Entrada            Processados



              Hierarquia dos Levels (Níveis)

01 WS-CLIENTE
│
├──05 WS-DADOS-PESSOAIS
│    ├──10 WS-NOME
│    ├──10 WS-CPF
│    └──10 WS-DATA-NASCIMENTO
│
├──05 WS-ENDERECO
│    ├──10 WS-RUA
│    ├──10 WS-NUMERO
│    ├──10 WS-CIDADE
│    └──10 WS-CEP
│
└──05 WS-DADOS-BANCARIOS
     ├──10 WS-AGENCIA
     ├──10 WS-CONTA
     └──10 WS-SALDO


             Quanto maior o nível...
                   menor o detalhe.

        01  → Registro completo
        05  → Grupo principal
        10  → Campo
        15  → Subcampo
        20+ → Especializações



                Organização Recomendada

                 +-------------------+
                 |   01 WS-CLIENTE   |
                 +-------------------+
                          │
          ┌───────────────┼───────────────┐
          ▼               ▼               ▼
     IDENTIFICAÇÃO    ENDEREÇO       FINANCEIRO
          │               │               │
          ▼               ▼               ▼
     CPF / Nome      Rua / CEP     Conta / Saldo



                Prefixos Mais Utilizados

WS-  → Working Storage
LK-  → Linkage Section
LS-  → Local Storage
DFH- → CICS
SQL- → DB2
IX-  → Índice
CT-  → Constante
FL-  → Flag
TP-  → Tipo
DT-  → Data
HR-  → Hora
NR-  → Número
CD-  → Código
VLR- → Valor
QTD- → Quantidade



            REDEFINES (Mesma memória)

          +-------------------------+
          |      WS-DADOS           |
          |        X(20)            |
          +-------------------------+
                    ▲
                    │
         REDEFINES  │
                    │
          +-------------------------+
          |       WS-CPF            |
          |        9(20)            |
          +-------------------------+

      Uma única área de memória.
      Duas interpretações diferentes.



             RENAMES (Grupo Lógico)

01 WS-REGISTRO
│
├──05 WS-NOME
├──05 WS-ENDERECO
├──05 WS-CIDADE
└──05 WS-CEP

          │
          ▼

66 WS-DADOS-CADASTRAIS
   RENAMES WS-NOME THRU WS-CEP



             Nível 88 (Legibilidade)

        +-------------------+
        | WS-STATUS    PIC X|
        +-------------------+
               │
        ┌──────┴──────┐
        ▼             ▼
88 WS-ATIVO      88 WS-INATIVO
 VALUE "A"         VALUE "I"

Ao invés de:

IF STATUS = "A"

Escrevemos:

IF WS-ATIVO



              O Fluxo de uma Variável

 Declaração
      │
      ▼
 Inicialização
      │
      ▼
 Validação
      │
      ▼
 Processamento
      │
      ▼
 Saída
      │
      ▼
 Encerramento



      O que um iniciante costuma fazer...

WS-X
WS-AUX
WS-TEMP
WS-AREA
WS-DADOS

                 😢



      O que um profissional faz...

WS-VLR-SALDO-ATUAL
WS-DT-PROCESSAMENTO
WS-QTD-CLIENTES
WS-FL-CONTA-ATIVA
WS-CD-AGENCIA

                 😎



╔════════════════════════════════════════════════════════════╗
║ "Programas envelhecem. Dados permanecem."                 ║
║                                                           ║
║ Quanto melhor a Data Division...                          ║
║ ...mais simples será todo o restante do programa.         ║
╚════════════════════════════════════════════════════════════╝ .


Os erros mais comuns dos iniciantes

  • Variáveis com nomes sem significado.

  • Misturar entrada, saída e trabalho na mesma área.

  • Não utilizar grupos.

  • Declarar tudo como PIC X.

  • Ignorar COMP-3 para valores monetários.

  • Não utilizar nível 88.

  • Criar dezenas de variáveis AUX.

  • Usar REDEFINES sem conhecer o layout.

  • Não inicializar variáveis.

  • Declarar estruturas sem padronização.

  • Copiar layouts diferentes para a mesma área.

  • Esquecer alinhamento e organização.


O estado da arte em 2024

Embora o COBOL tenha mais de seis décadas, a Data Division continua evoluindo.

Nos ambientes modernos do IBM Enterprise COBOL 6.x e z/OS 3.1, as melhores práticas incluem:

  • nomes semânticos e consistentes;

  • estruturas alinhadas a modelos de negócio;

  • uso intensivo de COPYBOOKs compartilhados para evitar duplicação;

  • integração com JSON, XML e APIs REST preservando tipos corretos;

  • preferência por COMP-3 para valores financeiros e COMP/BINARY para cálculos;

  • uso de USAGE INDEX, 88-level, INITIALIZE e funções intrínsecas;

  • validação por ferramentas de análise estática como IBM Application Delivery Foundation, SonarQube (quando integrado) e padrões internos de qualidade.

Em muitos bancos, nenhuma variável nasce por acaso. Ela segue convenções documentadas, passa por revisão técnica e, frequentemente, é reutilizada por dezenas ou centenas de programas por meio de copybooks corporativos. Isso reduz erros, facilita integrações e garante consistência entre sistemas.


Curiosidades

  • O COBOL foi criado em 1959, e sua estrutura hierárquica de dados influenciou diversas linguagens posteriores.

  • Muitos layouts bancários brasileiros (CNAB 240 e 400 posições) dependem diretamente de grupos de níveis (01, 05, 10...) para mapear registros.

  • REDEFINES foi um dos primeiros mecanismos eficientes de reutilização de memória da história das linguagens comerciais.

  • Grandes bancos possuem programas com mais de 40 anos em produção cujas declarações de variáveis permanecem praticamente inalteradas, justamente porque foram bem projetadas desde o início.


A Filosofia Bellacosa Mainframe

Imagine uma biblioteca.

Cada livro possui uma prateleira.

Cada prateleira possui uma categoria.

Cada categoria possui uma etiqueta.

Agora imagine uma biblioteca onde todos os livros estão jogados no chão.

Ambas funcionam.

Mas apenas uma continua funcionando depois de cinquenta anos.

A Data Division é essa biblioteca.

Cada variável é um livro.

Cada nível é uma prateleira.

Cada nome é uma etiqueta.

Quando você declara uma variável pensando apenas no programa de hoje, escreve código.

Quando a declara pensando no colega que fará manutenção daqui a vinte anos, constrói engenharia de software.

E é exatamente essa mentalidade que diferencia um programador COBOL de um verdadeiro profissional de mainframe.

No fim das contas, programas mudam, regras de negócio evoluem e tecnologias se renovam. Uma Data Division bem organizada, porém, continua sendo uma das maiores demonstrações de maturidade técnica que um desenvolvedor pode deixar como legado.


quarta-feira, 25 de setembro de 2024

🌌 Trilogia Gesto – Toque – Ausência

 


🕯️ El Jefe Midnight Lunch apresenta

🌌 Trilogia Gesto – Toque – Ausência

Por Bellacosa Mainframe


Há ideias que não nascem — acontecem.
E há trilogias que não são planejadas — fluem, como se o próprio universo tivesse decidido escrevê-las por nossas mãos.

Foi assim com esta série, nascida nas madrugadas insones do El Jefe Midnight Lunch, quando o café já esfriou, o cursor pisca em silêncio e a mente vibra entre o código e a contemplação.

Hoje, apresento oficialmente a Trilogia Gesto – Toque – Ausência:
um mergulho no que não se diz, no que se sente, e no que permanece.


🫱 Capítulo I — As Mãos no Japão

“O gesto é a primeira linguagem — anterior à fala, anterior ao medo.”

Neste primeiro capítulo, exploramos a mística das mãos japonesas — o toque que cura, o gesto que comunica sem palavras, o símbolo que atravessa eras.
Das mudras budistas às mãos que dobram origamis, das que empunham katanas às que servem chá com precisão milenar.

Falamos de respeito, de energia, de ki — e de como cada movimento é uma oração discreta, uma linha de código entre corpo e alma.

💡 Curiosidades:

  • A palavra japonesa “te” (手) aparece em dezenas de expressões idiomáticas — cada uma revelando uma emoção humana.

  • Nos animes, o gesto da mão estendida (como o de Tanjiro ou o toque de Naruto e Sasuke) é metáfora pura: redenção, laço, promessa.

🔗 Leitura recomendada: “As Mãos no Japão — entre gestos, símbolos e alma digital.”

Parte I


✋ Capítulo II — As Mãos nos Animes

“Cada toque é uma variável entre o destino e o acaso.”

Aqui o gesto se transforma em emoção animada.
Revisitamos os toques mais icônicos dos animes — do aperto de mãos entre Luffy e Shanks, à despedida muda entre Edward e Alphonse, à palma de Tanjiro se erguendo contra o vento.

A mão é o elo entre mundos: carne e alma, amizade e perda, criação e destruição.
Em frames e trilhas, o toque se torna poesia visual — e o silêncio que o segue, confissão.

🎬 Cenas eternas:

  • Fullmetal Alchemist — o toque que separa irmãos e reescreve o mundo.

  • Naruto — a mão que rompe o ciclo do ódio.

  • One Piece — a mão que sela o sonho e o adeus.

🔗 Leitura recomendada: “As Mãos nos Animes — o toque que move o coração.”

Parte II


🕯️ Capítulo III — As Palavras Não Ditam: o Silêncio nos Animes

“O vazio é o código-fonte da emoção.”

Fechando o ciclo, chegamos à ausência.
Depois do gesto (intenção) e do toque (ação), resta o silêncio — o espaço entre as notas, o instante que ressoa depois da música.

No Japão, esse espaço tem nome: 間 (Ma) — o tempo suspenso entre o que é e o que será.
Nos animes, o “Ma” é aquele momento em que o som para e o coração escuta: o último olhar, o vento antes da batalha, a respiração antes da confissão.

É o não-dito que diz tudo.
O silêncio que fala — e, por isso, comove.

🎧 Animes que o eternizaram:

  • Grave of the Fireflies — o luto que não grita.

  • Your Name — o amor que não precisa de palavras.

  • Attack on Titan — o peso do vazio após o sacrifício.

🔗 Leitura recomendada: “As Palavras Não Ditam — o silêncio nos animes.”

Parte III


🌙 A Trilogia em Harmonia

🫱 Gesto — a intenção.
Toque — a conexão.
🕯️ Ausência — a eternidade.

Três capítulos, três camadas da mesma emoção:
o humano, o espiritual e o etéreo.
Assim como o som precisa do silêncio, e a luz precisa da sombra, cada parte desta trilogia se apoia na outra para existir.


💬 Pós-créditos de uma mente insone

Essa trilogia nasceu como tudo no El Jefe:
sem planejamento, sem briefing, sem algoritmo — apenas um lampejo às 2h47 da madrugada, quando a mente e o mainframe vibram no mesmo clock.

Talvez seja o início de algo maior: um ciclo sobre emoções codificadas, espiritualidade digital, filosofia otaku — e tudo o mais que habita esse espaço entre o raciocínio e a poesia.


📜 “O gesto abre o ciclo, o toque o revela, e o silêncio o encerra.”
Bellacosa Mainframe,
em alguma madrugada entre o café frio e o logoff.


terça-feira, 24 de setembro de 2024

COBOL razões por dominar o CPD.

Por que o COBOL continua a dominar o Processamento de Dados no Mundo dos Negócios? Uma linguagem orientada a negócios precisa declarar, gerenciar e manipular dados heterogêneos. Programas de negócios misturam strings de comprimento fixo e variável, dados de ponto flutuante, inteiros e decimais com abandono selvagem em estruturas de registro complicadas, geralmente com partes variáveis. Os programadores de banco de dados estão familiarizados com alguns desses problemas, e ferramentas de mapeamento objeto-relacional tropeçam nessas complexidades regularmente.

Cobol o Rei dos CPDs

Por que o COBOL continua a dominar o processamento de dados no mundo dos negócios? Os dados comerciais e financeiros precisam ser gerenciados usando tipos de dados decimais verdadeiros. Os sistemas de contabilidade devem estar corretos até o último dígito decimal e precisam reproduzir exatamente os resultados do cálculo manual; números convencionais de ponto flutuante levam a complexidades e erros.

Fluxo de Compilação de um programa COBOL com DB2

 

Bellacosa Mainframe e o fluxo de compilação cobol com db2

☕ Um Café no Bellacosa Mainframe

O Caso do Programa que Precisava de Duas Identidades

O Fluxo de Compilação de um Programa COBOL com Db2

A chuva caía sobre as janelas do CPD como uma sequência interminável de registros sendo gravados em um arquivo sequencial.

Do lado de dentro, os monitores 3270 lançavam uma luz esverdeada sobre as mesas. O relógio marcava 23h47. Os operadores já falavam baixo, como se soubessem que, depois de certo horário, os programas começavam a revelar segredos que escondiam durante o expediente.

Foi quando encontrei o programa.

Estava abandonado em uma biblioteca de fontes, cercado por COPYBOOKs, comandos SQL e comentários escritos por programadores que provavelmente já haviam se aposentado.

Na primeira linha, ele parecia apenas mais um programa COBOL.

Mas havia alguma coisa diferente.

No meio da PROCEDURE DIVISION, encontrei a pista:

EXEC SQL
    SELECT NOME_CLIENTE,
           SALDO_CONTA
      INTO :WS-NOME-CLIENTE,
           :WS-SALDO-CONTA
      FROM CLIENTES
     WHERE COD_CLIENTE = :WS-COD-CLIENTE
END-EXEC.

Aquilo mudava tudo.

Um compilador COBOL comum não saberia o que fazer com aquelas instruções.

EXEC SQL não era COBOL.

Era SQL infiltrado dentro de um programa COBOL.

O programa possuía duas identidades: uma destinada ao compilador COBOL e outra destinada ao Db2.

Para transformar aquele fonte em um módulo executável, seria necessário conduzi-lo por uma cadeia de interrogatórios, traduções, compilações, ligações e registros.

No mundo COBOL com Db2, ninguém sai do fonte diretamente para a execução.

Antes de chegar ao CICS, ao batch ou ao ambiente de produção, o programa precisa atravessar o chamado fluxo de compilação COBOL–Db2.

E cada etapa produz uma nova pista.


1. A cena do crime: o programa-fonte

Tudo começa com um membro contendo o código-fonte COBOL.

Em um ambiente tradicional, ele poderia estar em uma biblioteca como:

BANCO.DESENV.COBOL(PROGCLI1)

Dentro desse programa encontramos instruções COBOL normais:

MOVE 1001 TO WS-COD-CLIENTE.
DISPLAY 'INICIANDO CONSULTA'.

Mas também encontramos comandos SQL embutidos:

EXEC SQL
    SELECT NOME_CLIENTE
      INTO :WS-NOME-CLIENTE
      FROM CLIENTES
     WHERE COD_CLIENTE = :WS-COD-CLIENTE
END-EXEC.

Esses comandos são chamados de SQL estático embutido, ou embedded static SQL.

O termo “estático” significa que, em linhas gerais, a instrução SQL já está conhecida antes da execução do programa.

O Db2 pode analisar essa instrução previamente, determinar como ela poderá acessar as tabelas e registrar essas informações durante o processo de BIND.

Mas existe um problema.

O compilador COBOL não entende diretamente:

EXEC SQL

Ele entende MOVE, PERFORM, IF, EVALUATE, READ, WRITE e outras instruções da linguagem.

SQL pertence ao território do Db2.

Portanto, antes da compilação COBOL, alguém precisa separar as duas identidades do programa.

Esse alguém é o pré-compilador Db2.


2. O primeiro interrogatório: o pré-compilador Db2

O pré-compilador recebe o programa-fonte como entrada.

Sua missão é localizar todas as instruções existentes entre:

EXEC SQL

e:

END-EXEC

Quando encontra uma instrução SQL, o pré-compilador não simplesmente a apaga.

Ele realiza duas operações fundamentais.

Primeiro, substitui o SQL por chamadas que poderão ser compiladas como parte do programa COBOL.

Segundo, extrai informações sobre as instruções SQL e as registra em um arquivo chamado DBRM.

Assim, de um único programa-fonte surgem duas evidências:

Fonte COBOL com SQL
        |
        v
Pré-compilador Db2
        |
        +--> Fonte COBOL modificado
        |
        +--> DBRM

Essa divisão é a chave de todo o caso.

O programa passa a ter dois caminhos paralelos.

Um caminho segue para o compilador COBOL.

O outro segue para o BIND do Db2.

Mais tarde, os dois caminhos precisarão se reencontrar durante a execução.


3. O fonte modificado

Depois do pré-processamento, o SQL original não permanece exatamente como foi escrito.

Uma instrução como:

EXEC SQL
    SELECT NOME_CLIENTE
      INTO :WS-NOME-CLIENTE
      FROM CLIENTES
     WHERE COD_CLIENTE = :WS-COD-CLIENTE
END-EXEC.

é transformada em estruturas e chamadas que o compilador COBOL consegue processar.

O resultado é conhecido como fonte modificado, fonte traduzido ou fonte expandido, dependendo da terminologia usada no ambiente.

Esse fonte contém lógica responsável por conversar com a interface do Db2 em tempo de execução.

O programador normalmente não precisa editar esse código gerado.

Ele existe para que o compilador COBOL consiga trabalhar com um programa que originalmente continha SQL.

É como se o pré-compilador retirasse o estrangeiro da sala, traduzisse seu depoimento e entregasse ao compilador apenas aquilo que ele consegue compreender.


4. A ficha que acompanha o suspeito: SQLCA

Programas COBOL que acessam Db2 normalmente precisam de uma área chamada SQLCA, SQL Communication Area.

Ela pode ser incluída com:

EXEC SQL
    INCLUDE SQLCA
END-EXEC.

A SQLCA contém informações sobre o resultado da última instrução SQL executada.

Entre seus campos, o mais famoso é:

SQLCODE

O SQLCODE informa se a operação terminou corretamente ou se algo inesperado aconteceu.

Alguns valores comuns são:

SQLCODE = 0
Operação concluída com sucesso.

SQLCODE = +100
Nenhuma linha encontrada ou fim do resultado.

SQLCODE negativo
Ocorreu algum erro.

Exemplo:

EXEC SQL
    SELECT NOME_CLIENTE
      INTO :WS-NOME-CLIENTE
      FROM CLIENTES
     WHERE COD_CLIENTE = :WS-COD-CLIENTE
END-EXEC.

EVALUATE TRUE
    WHEN SQLCODE = 0
         DISPLAY 'CLIENTE: ' WS-NOME-CLIENTE

    WHEN SQLCODE = 100
         DISPLAY 'CLIENTE NAO ENCONTRADO'

    WHEN OTHER
         DISPLAY 'ERRO DB2. SQLCODE: ' SQLCODE
END-EVALUATE.

Um programa COBOL–Db2 que ignora o SQLCODE é como um detetive que interroga uma testemunha e sai da sala sem ouvir a resposta.


5. O segundo interrogatório: o compilador COBOL

Depois do pré-compilador, o fonte modificado é enviado ao compilador COBOL.

Agora o compilador encontra apenas estruturas que consegue entender.

Ele verifica:

  • sintaxe COBOL;

  • definição de variáveis;

  • compatibilidade de tipos;

  • referências a parágrafos;

  • COPYBOOKs;

  • tamanho de campos;

  • opções de compilação;

  • regras da linguagem.

Se tudo estiver correto, o compilador gera um módulo objeto.

O módulo objeto ainda não é o programa final pronto para executar.

Ele contém código de máquina e referências que ainda precisam ser resolvidas.

Podemos representar essa fase assim:

Fonte COBOL modificado
          |
          v
Compilador COBOL
          |
          v
Módulo objeto

Durante essa etapa, também é produzido o listing de compilação.

Esse listing pode mostrar:

  • erros;

  • avisos;

  • opções utilizadas;

  • mapa de dados;

  • referências cruzadas;

  • estatísticas da compilação;

  • mensagens do compilador.

O retorno da compilação costuma ser avaliado por meio do condition code do step.

Uma interpretação frequente é:

RC 0
Compilação concluída sem mensagens relevantes.

RC 4
Compilação concluída com avisos.

RC 8 ou superior
Existem erros que normalmente impedem a geração válida do programa.

Os significados exatos dependem das mensagens e das políticas do ambiente.

Um RC=4 não deve ser tratado automaticamente como “está tudo bem”.

Aviso também é pista.


6. O dossiê secreto: DBRM

Enquanto o fonte modificado segue para o compilador COBOL, o DBRM toma outro caminho.

DBRM significa:

Database Request Module

Ele contém uma representação das instruções SQL estáticas extraídas do programa.

O DBRM não é um programa COBOL executável.

Ele também não é uma tabela do Db2.

É uma espécie de dossiê contendo os pedidos de acesso ao banco de dados.

Nesse dossiê, o Db2 encontra informações sobre instruções como:

SELECT
INSERT
UPDATE
DELETE
DECLARE CURSOR
OPEN
FETCH
CLOSE

O DBRM será usado mais tarde durante o processo chamado BIND.

Sem BIND, o Db2 sabe que o programa tem intenções.

Mas ainda não concedeu autorização operacional para que essas intenções sejam executadas.


7. O BIND: quando o Db2 monta o plano

O BIND é uma das etapas mais importantes do fluxo.

Durante o BIND, o Db2 examina as instruções SQL registradas no DBRM.

Ele verifica:

  • se os objetos referenciados existem;

  • se tabelas, views e colunas podem ser localizadas;

  • se os tipos são compatíveis;

  • se o usuário responsável possui os privilégios necessários;

  • quais caminhos de acesso podem ser utilizados;

  • quais opções de isolamento e validação foram definidas.

O resultado normalmente é a criação ou atualização de um PACKAGE.

Em arquiteturas mais antigas ou em determinados ambientes, também pode existir o conceito de PLAN associado à execução.

De forma simplificada:

DBRM
 |
 v
BIND PACKAGE
 |
 v
PACKAGE Db2

O PACKAGE contém informações que o Db2 utilizará para executar o SQL estático.

Entre essas informações está o access path, isto é, o caminho escolhido para alcançar os dados.

Por exemplo, o Db2 poderá decidir entre:

  • utilizar um índice;

  • realizar uma varredura da tabela;

  • acessar índices em determinada sequência;

  • executar joins em uma ordem específica;

  • utilizar mecanismos de ordenação;

  • aplicar predicados em etapas diferentes.

O BIND é o momento em que o Db2 estuda o mapa do bairro antes de mandar seus agentes à rua.


8. VALIDATE(BIND) e VALIDATE(RUN)

Durante o BIND, uma opção importante pode determinar quando determinadas verificações serão exigidas.

Com:

VALIDATE(BIND)

o Db2 tenta validar os objetos e privilégios durante o próprio BIND.

Caso algo necessário não esteja disponível, o BIND pode falhar.

Com:

VALIDATE(RUN)

algumas verificações podem ser adiadas até o momento da execução.

Isso pode ser útil em certos cenários, mas também transfere parte do risco para o ambiente de execução.

Em uma produção crítica, adiar problemas não significa eliminá-los.

Significa apenas permitir que eles apareçam quando o programa estiver diante do usuário, do fechamento contábil ou do lote de milhões de registros.


9. O PACKAGE

O PACKAGE é o objeto Db2 que representa o SQL preparado para execução.

Ele está associado a elementos como:

  • nome da collection;

  • nome do programa;

  • versão;

  • opções do BIND;

  • access paths;

  • consistência do programa;

  • nível de isolamento;

  • qualificador;

  • proprietário;

  • validação.

Um comando conceitual de BIND poderia lembrar:

BIND PACKAGE(COLLECT1)
     MEMBER(PROGCLI1)
     ACTION(REPLACE)
     ISOLATION(CS)
     VALIDATE(BIND)

A sintaxe real depende do utilitário, da versão, do padrão de nomenclatura e das práticas adotadas na instalação.

O ponto essencial é que o PACKAGE vive no Db2.

Ele não é armazenado dentro do load module COBOL.

Isso explica por que o programa executável e seu PACKAGE podem existir em lugares diferentes e, mesmo assim, precisar corresponder exatamente.


10. O elo invisível: consistency token

Aqui surge uma das pistas mais elegantes do processo.

O módulo executável COBOL e o PACKAGE Db2 precisam reconhecer um ao outro.

Para isso, o processo utiliza uma identificação de consistência frequentemente relacionada ao consistency token.

O pré-compilador e o BIND produzem elementos que permitem ao Db2 verificar se o código executável corresponde ao PACKAGE disponível.

Considere este cenário:

  1. O programa foi pré-compilado.

  2. O DBRM foi gerado.

  3. O COBOL foi compilado.

  4. O load module foi criado.

  5. Um novo BIND não foi executado corretamente.

  6. O programa antigo ou um PACKAGE incompatível permaneceu no ambiente.

Durante a execução, o Db2 pode detectar que o executável e o PACKAGE não combinam.

O famoso resultado pode ser:

SQLCODE -805

Em linguagem de romance policial:

O sujeito apresentado pelo load module não era o mesmo registrado nos arquivos do Db2.


11. O terceiro interrogatório: o link-edit

O módulo objeto criado pelo compilador ainda contém referências externas.

Ele pode precisar de rotinas de tempo de execução, interfaces do Db2 e bibliotecas do sistema.

Por isso, o módulo objeto passa pelo link-edit, atualmente frequentemente executado pelo Binder do z/OS.

Fluxo:

Módulo objeto
      |
      v
Binder / Link-edit
      |
      v
Load module ou program object

Durante essa etapa, referências externas são resolvidas.

O resultado é colocado em uma load library, por exemplo:

BANCO.DESENV.LOAD(PROGCLI1)

Esse membro é o programa que poderá ser carregado para execução.

Dependendo da tecnologia e das opções adotadas, ele poderá ser chamado de:

  • load module;

  • program object;

  • módulo de carga;

  • executável.

É importante não confundir o load module com o PACKAGE.

Load module
Código COBOL executável.

PACKAGE
Representação executável das instruções SQL estáticas dentro do Db2.

Os dois fazem parte do mesmo caso, mas vivem em delegacias diferentes.


12. A montagem completa do fluxo

O fluxo clássico pode ser representado assim:

+----------------------------------+
| Fonte COBOL com SQL embutido     |
| EXEC SQL ... END-EXEC            |
+----------------+-----------------+
                 |
                 v
+----------------------------------+
| Pré-compilador Db2               |
+----------------+-----------------+
                 |
        +--------+--------+
        |                 |
        v                 v
+---------------+   +---------------+
| Fonte COBOL   |   | DBRM          |
| modificado    |   | SQL estático  |
+-------+-------+   +-------+-------+
        |                   |
        v                   v
+---------------+   +---------------+
| Compilador    |   | BIND PACKAGE  |
| COBOL         |   | no Db2        |
+-------+-------+   +-------+-------+
        |                   |
        v                   v
+---------------+   +---------------+
| Módulo objeto |   | PACKAGE       |
+-------+-------+   +---------------+
        |
        v
+---------------+
| Binder /      |
| Link-edit     |
+-------+-------+
        |
        v
+---------------+
| Load module   |
| ou program    |
| object        |
+---------------+

Na execução, os dois lados finalmente se encontram:

Load module COBOL
        |
        | chamada SQL
        v
Subsistema Db2
        |
        v
PACKAGE correspondente
        |
        v
Tabelas, índices e dados

Esse é o fluxo essencial.

Mas, como em toda investigação, os detalhes podem mudar conforme as ferramentas utilizadas.


13. Pré-compilador tradicional ou coprocessador SQL

Em ambientes modernos, o fluxo pode usar um SQL coprocessor integrado à compilação COBOL.

Nesse modelo, a compilação e o tratamento do SQL podem parecer uma única operação dentro do JCL ou da ferramenta de build.

Isso não elimina os conceitos fundamentais.

Mesmo com automação, continuam existindo:

  • análise do SQL;

  • geração de informações para o Db2;

  • compilação COBOL;

  • criação do executável;

  • criação ou atualização do PACKAGE;

  • necessidade de correspondência entre código e PACKAGE.

A diferença é que as ferramentas modernas escondem parte do corredor escuro atrás de uma porta automática.

O corredor continua lá.


14. Exemplo simplificado de programa

Considere o seguinte programa:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. PROGCLI1.

       DATA DIVISION.

       WORKING-STORAGE SECTION.

       01  WS-COD-CLIENTE     PIC 9(09) COMP-3.
       01  WS-NOME-CLIENTE    PIC X(40).
       01  WS-SALDO-CONTA     PIC S9(11)V99 COMP-3.

           EXEC SQL
               INCLUDE SQLCA
           END-EXEC.

       PROCEDURE DIVISION.

       0000-PRINCIPAL.

           MOVE 1001 TO WS-COD-CLIENTE

           EXEC SQL
               SELECT NOME_CLIENTE,
                      SALDO_CONTA
                 INTO :WS-NOME-CLIENTE,
                      :WS-SALDO-CONTA
                 FROM CLIENTES
                WHERE COD_CLIENTE = :WS-COD-CLIENTE
           END-EXEC

           EVALUATE TRUE
               WHEN SQLCODE = 0
                    DISPLAY 'CLIENTE: ' WS-NOME-CLIENTE
                    DISPLAY 'SALDO  : ' WS-SALDO-CONTA

               WHEN SQLCODE = 100
                    DISPLAY 'CLIENTE NAO ENCONTRADO'

               WHEN OTHER
                    DISPLAY 'ERRO SQL: ' SQLCODE
           END-EVALUATE

           GOBACK.

Antes que o programa execute, várias condições precisam ser atendidas:

  1. A tabela CLIENTES precisa existir.

  2. As colunas precisam existir.

  3. Os tipos precisam ser compatíveis.

  4. O programa precisa ser pré-processado.

  5. O código COBOL precisa ser compilado.

  6. O executável precisa ser linkado.

  7. O PACKAGE precisa ser criado.

  8. O usuário de execução precisa ter os acessos necessários.

  9. O load module e o PACKAGE precisam corresponder.

  10. O subsistema Db2 correto precisa estar disponível.

Uma única instrução SELECT pode parecer simples no fonte.

Mas por trás dela existe uma organização inteira trabalhando durante a madrugada.


15. Host variables: os informantes do COBOL

As variáveis utilizadas pelo SQL são chamadas de host variables.

Elas pertencem ao programa COBOL, mas são apresentadas ao SQL com dois-pontos:

:WS-COD-CLIENTE

Exemplo:

WHERE COD_CLIENTE = :WS-COD-CLIENTE

A coluna COD_CLIENTE pertence à tabela.

A variável WS-COD-CLIENTE pertence ao programa COBOL.

Os dois-pontos avisam ao pré-compilador:

Este nome não é uma coluna do banco. É uma variável do programa.

No INTO:

INTO :WS-NOME-CLIENTE

o Db2 coloca o valor retornado dentro da variável COBOL.

As host variables fazem a ponte entre dois mundos:

Mundo COBOL               Mundo Db2

WS-COD-CLIENTE   ------>  COD_CLIENTE

WS-NOME-CLIENTE  <------  NOME_CLIENTE

Se os tipos forem incompatíveis, o caso pode terminar em erro, truncamento ou comportamento indesejado.

Por isso, o programador deve entender tanto o PIC COBOL quanto o tipo da coluna Db2.


16. Variáveis indicadoras e o mistério do NULL

COBOL tradicional não possui um conceito nativo idêntico ao NULL do banco de dados.

Por isso, quando uma coluna pode conter NULL, utiliza-se uma indicator variable.

Exemplo:

01  WS-TELEFONE        PIC X(20).
01  WS-IND-TELEFONE    PIC S9(04) COMP.

No SQL:

EXEC SQL
    SELECT TELEFONE
      INTO :WS-TELEFONE :WS-IND-TELEFONE
      FROM CLIENTES
     WHERE COD_CLIENTE = :WS-COD-CLIENTE
END-EXEC.

Depois da execução:

Indicator >= 0
O valor normalmente está presente.

Indicator = -1
A coluna retornou NULL.

Sem a variável indicadora, um SELECT que encontre NULL pode gerar erro.

O programador iniciante frequentemente acusa a coluna.

Mas o verdadeiro culpado foi a ausência da indicator variable.


17. O PLAN

Em muitos ambientes Db2 for z/OS, packages são associados a um PLAN ou acessados por meio de mecanismos como collection lists.

Historicamente, o PLAN representa uma estrutura utilizada para a execução de programas SQL.

Simplificando:

Programa
   |
   v
PLAN
   |
   v
PACKAGE
   |
   v
SQL e dados

Em arquiteturas atuais, o PACKAGE ganhou grande importância porque permite maior modularidade.

Vários programas podem possuir seus próprios packages.

O PLAN pode utilizar uma lista de collections por meio de PKLIST.

Isso evita a necessidade de colocar todo o SQL de uma aplicação dentro de um único objeto gigantesco.


18. Erros clássicos da investigação

SQLCODE -805

Normalmente indica que o PACKAGE necessário não foi encontrado ou que existe incompatibilidade de identificação.

Possíveis causas:

  • PACKAGE não bindado;

  • collection incorreta;

  • versão incorreta;

  • ambiente errado;

  • load module e PACKAGE incompatíveis;

  • PLAN sem acesso à collection adequada.


SQLCODE -818

É frequentemente associado a incompatibilidade de timestamp ou consistency token entre o módulo executável e o DBRM/PACKAGE.

Em termos práticos:

  • o código foi compilado;

  • o BIND foi feito com outro DBRM;

  • as peças pertencem a versões diferentes.

É como tentar abrir um cofre novo com a combinação do cofre antigo.


SQLCODE -204

Objeto não encontrado.

Exemplo:

Tabela, view, alias ou outro objeto não localizado.

Possíveis causas:

  • nome incorreto;

  • qualifier incorreto;

  • objeto inexistente;

  • ambiente incorreto;

  • uso de tabela de desenvolvimento em produção ou vice-versa.


SQLCODE -206

Coluna não encontrada ou inválida no contexto.

Possíveis causas:

  • nome digitado incorretamente;

  • coluna removida;

  • alias de tabela ausente;

  • SQL desatualizado em relação à estrutura do banco.


SQLCODE -551

Problema de autorização.

O usuário ou authid não possui privilégio suficiente para realizar a operação.

O programa pode estar perfeito.

O BIND pode existir.

A tabela pode existir.

Mas a porta permanece trancada.


SQLCODE +100

Nenhuma linha encontrada.

Não é necessariamente um erro.

Em um SELECT INTO, pode significar que nenhum registro correspondeu à condição.

Em um cursor, pode indicar fim das linhas.

O erro verdadeiro é tratar +100 como se nunca pudesse acontecer.


19. JCL conceitual do processo

Um JCL real varia muito entre instalações, mas conceitualmente o processo pode ter steps como:

STEP 1 - Pré-compilação Db2
STEP 2 - Compilação COBOL
STEP 3 - Link-edit
STEP 4 - BIND PACKAGE
STEP 5 - BIND PLAN, quando necessário

Ou, em outra organização:

STEP 1 - Compilação com SQL coprocessor
STEP 2 - Link-edit
STEP 3 - BIND PACKAGE

Pipelines modernos podem executar essas etapas por meio de:

  • JCLs padronizados;

  • procedures catalogadas;

  • Endevor;

  • ISPW;

  • DBB;

  • Jenkins;

  • Git;

  • scripts de automação;

  • ferramentas DevOps para IBM Z.

Mesmo que o programador clique em um botão chamado “Build”, o botão não faz magia.

Ele apenas dispara uma sequência semelhante à investigação que acabamos de seguir.


20. A ordem das etapas importa

Imagine que o programa tenha sido alterado.

O desenvolvedor adiciona uma coluna ao SELECT:

SELECT NOME_CLIENTE,
       SALDO_CONTA,
       LIMITE_CREDITO

O fonte é pré-processado e compilado.

O novo load module é promovido.

Mas o novo DBRM não é utilizado no BIND.

O resultado é um executável novo tentando conversar com um PACKAGE antigo.

Isso pode gerar incompatibilidade.

Agora imagine o contrário:

O PACKAGE novo é bindado, mas o load module antigo permanece na biblioteca de produção.

Mais uma vez, versões diferentes se encontram.

Por isso, uma promoção correta precisa tratar como uma unidade:

Fonte
DBRM
Load module
PACKAGE
Configuração de execução

Em ambientes controlados, o processo de change management deve garantir que todas as peças da mesma versão avancem juntas.


21. O que acontece em tempo de execução

Quando o programa é executado, o z/OS carrega o load module.

Ao alcançar uma instrução SQL, a lógica gerada durante o pré-processamento encaminha a solicitação ao Db2.

O Db2 identifica:

  • o subsistema;

  • o plano ou contexto de execução;

  • a collection;

  • o PACKAGE;

  • a seção SQL correspondente.

Depois, executa o access path registrado ou reavaliado conforme as características do ambiente e as opções utilizadas.

O resultado é devolvido às host variables.

O SQLCODE é atualizado.

O programa COBOL continua.

Fluxo simplificado:

Programa COBOL executando
          |
          v
Encontra instrução SQL
          |
          v
Interface com Db2
          |
          v
Localiza PACKAGE
          |
          v
Executa SQL
          |
          v
Acessa tabela ou índice
          |
          v
Retorna dados e SQLCODE
          |
          v
Programa COBOL prossegue

Para o usuário, tudo isso pode acontecer em milésimos de segundo.

Para o programador, são décadas de engenharia condensadas em um único EXEC SQL.


22. Compile não é BIND

Uma das confusões mais comuns entre iniciantes é pensar:

O programa compilou, então o SQL está correto.

Nem sempre.

A compilação COBOL valida o código COBOL e as estruturas geradas.

O BIND é que realiza boa parte da validação relacionada ao Db2.

Dependendo das opções usadas, alguns problemas só aparecerão durante o BIND ou até durante a execução.

Portanto:

Compilação bem-sucedida
não garante
BIND bem-sucedido.

E:

BIND bem-sucedido
não garante
execução funcionalmente correta.

Um SELECT pode executar perfeitamente e devolver o cliente errado porque a regra de negócio foi escrita de maneira incorreta.

Nenhum compilador consegue condenar uma lógica que é sintaticamente válida, mas conceitualmente equivocada.


23. BIND não é apenas burocracia

É comum enxergar o BIND apenas como uma etapa obrigatória.

Mas ele também está ligado à performance.

Durante o BIND ou REBIND, o Db2 pode determinar access paths com base em informações como:

  • índices disponíveis;

  • estatísticas de tabelas;

  • estatísticas de colunas;

  • cardinalidade;

  • distribuição dos dados;

  • custo estimado;

  • métodos de join;

  • quantidade de páginas;

  • seletividade dos predicados.

Se as estatísticas estiverem desatualizadas, o Db2 poderá tomar decisões baseadas em uma fotografia antiga da cena.

É por isso que operações como RUNSTATS possuem tanta importância.

O otimizador só pode investigar com as evidências que recebe.


24. REBIND

O REBIND permite reconstruir informações de um PACKAGE existente sem necessariamente recompilar o programa COBOL.

Ele pode ser utilizado quando:

  • estatísticas foram atualizadas;

  • índices foram criados ou alterados;

  • ocorreu mudança de versão;

  • deseja-se recalcular access paths;

  • políticas de performance exigem revisão;

  • objetos sofreram alterações.

Mas um REBIND deve ser tratado com cuidado.

Um novo access path pode melhorar a performance.

Também pode piorá-la.

Em ambientes críticos, equipes analisam EXPLAIN, histórico de access paths e comportamento anterior antes de aceitar mudanças.

Todo bom detetive sabe que reabrir um caso pode revelar a verdade.

Mas também pode destruir uma pista que ainda era útil.


25. COLLECTION, PACKAGE e versão

Packages podem ser organizados em collections.

Isso permite separar ambientes ou versões.

Exemplo conceitual:

Collection: DESENV
Package: PROGCLI1

Collection: HOMOLOG
Package: PROGCLI1

Collection: PRODUCAO
Package: PROGCLI1

O nome do programa pode ser o mesmo.

Mas cada collection representa um contexto diferente.

Também podem existir estratégias de versionamento:

PROGCLI1 versão V1
PROGCLI1 versão V2

Esses mecanismos ajudam em:

  • implantação;

  • rollback;

  • testes paralelos;

  • manutenção;

  • coexistência de versões.

Entretanto, quanto maior a flexibilidade, maior a necessidade de controle.

Sem governança, uma collection se transforma em uma rua escura cheia de packages com identidades falsas.


26. Static SQL e Dynamic SQL

O fluxo descrito é principalmente associado ao SQL estático.

No SQL estático, a instrução é conhecida antes da execução:

EXEC SQL
    SELECT NOME_CLIENTE
      INTO :WS-NOME
      FROM CLIENTES
     WHERE COD_CLIENTE = :WS-COD
END-EXEC.

No SQL dinâmico, o texto da instrução pode ser montado durante a execução.

Exemplo conceitual:

MOVE 'SELECT NOME_CLIENTE FROM CLIENTES'
  TO WS-COMANDO-SQL.

Depois, o programa pode usar comandos como:

PREPARE
EXECUTE
OPEN

O SQL dinâmico oferece flexibilidade.

Mas pode aumentar a complexidade relacionada a:

  • segurança;

  • autorização;

  • performance;

  • cache;

  • validação;

  • construção de comandos;

  • risco de SQL injection, quando entradas são tratadas incorretamente.

O SQL estático é como uma operação planejada.

O SQL dinâmico é como receber uma missão enquanto o carro já está em movimento.


27. O papel do programador COBOL

O programador COBOL–Db2 precisa enxergar além do fonte.

Ele deve saber responder:

  • Qual pré-processador está sendo usado?

  • Onde o DBRM é gerado?

  • Em qual biblioteca o load module é gravado?

  • Qual collection contém o PACKAGE?

  • Qual PLAN ou PKLIST participa da execução?

  • Qual subsistema Db2 será acessado?

  • Qual qualifier está sendo utilizado?

  • Qual authid realiza o BIND?

  • Quem executa o programa?

  • Qual é o nível de isolamento?

  • O programa verifica SQLCODE?

  • Existem colunas nullable?

  • As host variables são compatíveis?

  • O BIND acompanha a promoção do load module?

Essas perguntas separam o programador que apenas altera linhas daquele que compreende o ciclo de vida da aplicação.


28. Checklist para o iniciante

Antes de declarar o caso encerrado, verifique:

[ ] O fonte COBOL está correto?

[ ] Todas as instruções EXEC SQL possuem END-EXEC?

[ ] As host variables estão declaradas?

[ ] Os tipos COBOL combinam com as colunas Db2?

[ ] Colunas nullable possuem indicator variables?

[ ] A SQLCA foi incluída?

[ ] O programa testa SQLCODE?

[ ] O pré-processamento terminou corretamente?

[ ] O DBRM foi gerado?

[ ] A compilação COBOL terminou sem erros?

[ ] O link-edit criou o load module?

[ ] O BIND PACKAGE foi executado?

[ ] A collection está correta?

[ ] O PLAN ou PKLIST encontra o PACKAGE?

[ ] O executável e o PACKAGE pertencem à mesma versão?

[ ] O usuário possui autorização?

[ ] A load library correta está sendo utilizada?

[ ] O subsistema Db2 correto está ativo?

Esse checklist não evita todos os crimes.

Mas reduz bastante o número de suspeitos.


29. O fluxo resumido em uma frase

Um programa COBOL com Db2 passa pelo pré-processamento para separar COBOL e SQL, pela compilação para gerar o código objeto, pelo link-edit para criar o executável e pelo BIND para transformar o SQL estático em um PACKAGE reconhecido pelo Db2.

Ou, em linguagem de rua:

O pré-compilador separa.
O compilador traduz.
O Binder monta.
O BIND registra.
O Db2 executa.

30. Conclusão: dois caminhos, uma única execução

Às 3h12 da manhã, o caso finalmente estava resolvido.

O programa não era apenas COBOL.

Também não era apenas SQL.

Ele era uma aliança entre dois mundos.

O lado COBOL cuidava da lógica, dos campos, dos arquivos, dos cálculos e das decisões.

O lado Db2 cuidava das tabelas, dos índices, dos access paths, dos locks e da persistência dos dados.

Entre os dois, o pré-compilador atuava como intérprete.

O DBRM carregava o depoimento das instruções SQL.

O compilador transformava COBOL em código objeto.

O Binder criava o módulo executável.

O BIND registrava o PACKAGE no submundo do Db2.

Na execução, todas essas peças precisavam apresentar os mesmos documentos.

Quando tudo correspondia, o SELECT retornava seus dados e o programa continuava tranquilamente.

Quando alguma peça pertencia à versão errada, surgiam os suspeitos habituais:

-805
-818
-204
-206
-551

Apaguei a última luz do CPD e deixei o programa executando.

Lá fora, a chuva ainda caía.

Dentro do mainframe, milhões de instruções SQL atravessavam o mesmo caminho sem que ninguém percebesse.

Porque esta é uma das grandes verdades do IBM Z:

quando o fluxo de compilação funciona, ninguém nota.

Mas quando o BIND desaparece, o DBRM não combina ou o PACKAGE está na collection errada, sempre haverá um programador COBOL caminhando pelos corredores da madrugada, seguindo as pistas deixadas no spool.

E pedindo mais um café.

Posso também transformar esse conteúdo em uma versão ampliada com JCL completo de pré-compilação, compilação, link-edit e BIND PACKAGE.




Infografico demonstrando o fluxo de compilação de um programa mainframe COBOL com acesso ao Banco de Dados DB2. 

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