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.

sábado, 20 de julho de 2024

Road Map para Aprender Mainframe

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

sábado, 31 de dezembro de 2022

COBOL, QSAM e Db2 sem Mistérios: a Jornada do Arquivo Sequencial até o INSERT na Tabela

 

Bellacosa Mainframe executando cobol com db2 e qsam

☕ Um Café no Bellacosa Mainframe

COBOL, QSAM e Db2 sem Mistérios: a Jornada do Arquivo Sequencial até o INSERT na Tabela

Imagine a cena: madrugada no datacenter, luzes azuis refletindo nos corredores, o IBM Z trabalhando silenciosamente e, diante da tela 3270, um programador COBOL padawan observa um pequeno JCL.

À primeira vista, são poucas linhas:

//EXECDB2 EXEC PGM=IKJEFT01,DYNAMNBR=20
//STEPLIB DD DSN=DSN910.SDSNLOAD,DISP=SHR
//LISTCOPAC DD DSN=INFEF00.COPIA.MUNDO,DISP=SHR
//SYSTSPRT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSTSIN  DD *
  DSN SYSTEM(DB9G)
  RUN PROGRAM(COBDB501) PLAN(HERP0001) -
      LIB('ADCD.Z112.USERLOAD')
/*

Mas o verdadeiro mainframe nunca entrega todos os seus segredos de imediato.

Por trás dessas linhas existe uma cadeia completa de tecnologias:

JES2
  ↓
JCL
  ↓
IKJEFT01
  ↓
TSO Batch
  ↓
DSN Command Processor
  ↓
Db2 Attachment Facility
  ↓
PLAN
  ↓
PACKAGE
  ↓
Programa COBOL
  ↓
QSAM
  ↓
Arquivo sequencial
  ↓
INSERT no Db2
  ↓
COMMIT ou ROLLBACK

O JCL é pequeno, mas representa o último estágio de uma fábrica inteira de software. Antes de chegar a essa execução, alguém escreveu um programa COBOL, processou SQL pelo precompiler, compilou, linkeditou, gerou um load module, criou um DBRM, executou BIND PACKAGE, criou ou atualizou um PLAN e autorizou o usuário.

Vamos abrir cada porta desse templo tecnológico.


Bellacosa Mainframe executando um programa cobol db2 e qsam

1. Qual é a missão deste programa?

O próprio comentário do JCL entrega a missão:

//* PROGRAMA LE QSAM E INSERE TABELAS DB2

Em linguagem simples, o programa deverá:

  1. abrir um arquivo sequencial;

  2. ler cada registro;

  3. separar os campos;

  4. validar os dados;

  5. executar um INSERT em uma tabela Db2;

  6. tratar registros inválidos;

  7. realizar COMMIT;

  8. fechar o arquivo;

  9. retornar um código ao sistema operacional.

Um fluxo provável seria:

Abrir arquivo LISTCOPAC
        ↓
Ler primeiro registro
        ↓
Registro válido?
   ┌────┴────┐
   │         │
  Sim       Não
   │         │
INSERT      Registrar erro
   │         │
   └────┬────┘
        ↓
Atingiu intervalo de COMMIT?
        ↓
Executar COMMIT
        ↓
Ler próximo registro
        ↓
Fim do arquivo?
   ┌────┴────┐
   │         │
  Não       Sim
   │         │
Repetir     COMMIT final
             ↓
        Fechar arquivo
             ↓
           GOBACK

Esse tipo de programa é muito comum em sistemas corporativos.

Ele pode carregar:

  • clientes;

  • contas;

  • pagamentos;

  • movimentações;

  • produtos;

  • contratos;

  • dados de interfaces;

  • informações recebidas de outros sistemas;

  • arquivos produzidos por plataformas distribuídas.

É uma ponte entre o mundo dos arquivos batch e o mundo relacional do Db2.


2. O papel do JES

Antes que qualquer programa seja executado, o job precisa ser entregue ao JES.

JES significa Job Entry Subsystem.

Em muitos ambientes z/OS utiliza-se o JES2. Ele recebe o JCL, analisa as instruções, prepara os recursos, controla a execução e organiza as saídas no spool.

Quando o programador digita:

SUB

no ISPF Edit, não está executando o COBOL diretamente.

Na realidade, está entregando um pedido ao JES:

“JES, aceite este conjunto de instruções, valide o JCL, encontre os recursos e execute os steps na ordem indicada.”

O JES então:

  1. atribui um JOBID;

  2. lê o JCL;

  3. faz a conversão;

  4. verifica procedimentos;

  5. coloca o job na fila;

  6. seleciona uma initiator;

  7. executa os steps;

  8. recolhe as mensagens;

  9. grava os resultados no spool.

O nome mostrado na tela:

CATPGM1

é o nome do job.

O identificador:

JOB00056

é o JOBID atribuído pelo JES.

Esses dois nomes parecem semelhantes, mas representam coisas diferentes:

CATPGM1  = nome lógico fornecido no cartão JOB
JOB00056 = número atribuído pelo JES

3. A biblioteca JOBLIB

Na imagem existe:

//JOBLIB DD DSN=IBMUSER.CBL.LOADLIB,DISP=SHR

A JOBLIB define uma biblioteca de módulos executáveis para o job inteiro.

É como dizer:

“Ao procurar programas deste job, inclua esta biblioteca na busca.”

A biblioteca:

IBMUSER.CBL.LOADLIB

deve ser uma PDS ou PDSE contendo load modules ou program objects.

Um programa COBOL não é executado diretamente a partir do fonte:

IBMUSER.CBL.SOURCE(COBDB501)

O fonte precisa atravessar um processo:

Fonte COBOL
     ↓
Precompile Db2
     ↓
Compilação COBOL
     ↓
Object module
     ↓
Binder ou Link-edit
     ↓
Load module

O resultado final pode estar armazenado como:

IBMUSER.CBL.LOADLIB(COBDB501)

Um detalhe importante

No step da imagem também existe uma STEPLIB:

//STEPLIB DD DSN=DSN910.SDSNLOAD,DISP=SHR

Quando um step possui STEPLIB, ela normalmente substitui a JOBLIB para a busca de módulos naquele step.

Portanto, a existência de JOBLIB não significa que ela será usada pelo step EXECDB2.

Essa é uma daquelas curiosidades que derrubam muitos padawans.

O programador pensa:

“Meu programa está na JOBLIB, portanto será encontrado.”

Mas o sistema responde:

“Existe uma STEPLIB neste step. Minha busca seguirá outro caminho.”

No caso do JCL apresentado, o programa da aplicação é localizado por meio da cláusula:

LIB('ADCD.Z112.USERLOAD')

Isso evita que ele dependa da JOBLIB.


4. O step EXECDB2

//EXECDB2 EXEC PGM=IKJEFT01,DYNAMNBR=20

Essa linha cria um step chamado:

EXECDB2

O nome do step é escolhido pelo desenvolvedor.

Ele poderia ser:

//STEP01
//RUNCOB
//DB2RUN
//CARREGA

Um bom nome melhora a análise do spool.

Ao observar:

EXECDB2

já sabemos que aquele step provavelmente executará alguma coisa em um ambiente Db2.

A instrução:

EXEC PGM=IKJEFT01

determina o programa que o z/OS carregará inicialmente.

E aqui surge uma pergunta importante:

Por que o JCL não executa diretamente COBDB501?

Porque COBDB501 contém SQL estático e precisa executar conectado ao subsistema Db2. O IKJEFT01 cria o ambiente TSO batch, dentro do qual o command processor DSN estabelece essa conexão.

Assim, a sequência real é:

IKJEFT01
   ↓
Comando DSN
   ↓
DSN SYSTEM(DB9G)
   ↓
RUN PROGRAM(COBDB501)

5. O que é o IKJEFT01?

O IKJEFT01 é um programa do z/OS utilizado para executar comandos TSO em batch.

O TSO é normalmente associado ao trabalho interativo:

READY

O usuário digita comandos e recebe respostas.

Com IKJEFT01, não existe uma pessoa digitando os comandos. Eles são fornecidos por um dataset ou por dados instream no DD SYSTSIN.

Uma analogia Bellacosa:

  • TSO interativo é o Jedi no terminal;

  • IKJEFT01 é o droide que repete os comandos durante a madrugada;

  • SYSTSIN é o pergaminho com as ordens;

  • SYSTSPRT é o diário da missão.

O IKJEFT01 pode executar:

  • comandos TSO;

  • CLISTs;

  • execuções REXX;

  • comandos do Db2;

  • utilitários que dependem do ambiente TSO.


6. O parâmetro DYNAMNBR=20

DYNAMNBR=20

Esse parâmetro está relacionado ao número de alocações dinâmicas que o ambiente TSO pode utilizar.

Durante a execução, o IKJEFT01, o command processor DSN ou programas chamados podem precisar alocar datasets dinamicamente.

Exemplos:

  • bibliotecas;

  • arquivos temporários;

  • arquivos de controle;

  • mensagens;

  • datasets de trabalho.

O valor:

20

costuma ser suficiente para execuções simples.

Em ambientes maiores aparecem valores como:

DYNAMNBR=50

ou:

DYNAMNBR=100

Não significa que o sistema abrirá imediatamente 20 datasets. É uma capacidade reservada para o ambiente.

Um valor insuficiente pode provocar falhas de alocação em execuções mais complexas.


7. A STEPLIB do Db2

//STEPLIB DD DSN=DSN910.SDSNLOAD,DISP=SHR

A STEPLIB informa as bibliotecas usadas na procura dos programas daquele step.

A biblioteca:

DSN910.SDSNLOAD

contém módulos relacionados ao Db2.

Entre eles podem existir componentes necessários para:

  • iniciar o command processor DSN;

  • usar o TSO Attachment Facility;

  • conectar-se ao subsistema;

  • carregar rotinas internas;

  • interagir com os serviços Db2.

O nome DSN910 pode indicar uma instalação antiga, uma versão ou apenas uma convenção local.

Não devemos presumir que o nome da biblioteca representa exatamente a versão atual do Db2. Muitas instalações mantêm nomes históricos para evitar alterar centenas de JCLs.

Contudo, é essencial que essa biblioteca seja compatível com o subsistema usado.

O subsistema do exemplo é:

DB9G

Se a SDSNLOAD não for a correta, podem surgir:

  • mensagens de conexão;

  • módulo não encontrado;

  • falhas no attachment;

  • abends;

  • incompatibilidade de nível.


8. DISP=SHR

Tanto a JOBLIB quanto a STEPLIB e o arquivo de entrada utilizam:

DISP=SHR

O parâmetro DISP descreve o estado e o tratamento do dataset.

SHR significa que o dataset já existe e pode ser compartilhado.

Exemplo:

//STEPLIB DD DSN=DSN910.SDSNLOAD,DISP=SHR

Essa biblioteca poderá ser usada simultaneamente por vários jobs.

Isso é normal para load libraries, pois dezenas ou centenas de aplicações podem carregar módulos da mesma biblioteca.

No arquivo de entrada:

//LISTCOPAC DD DSN=INFEF00.COPIA.MUNDO,DISP=SHR

o SHR indica leitura compartilhada.

Se o programa estivesse atualizando diretamente um dataset, talvez fosse necessário:

DISP=OLD

Mas para leitura QSAM, SHR é a escolha mais comum.


9. O DD LISTCOPAC

//LISTCOPAC DD DSN=INFEF00.COPIA.MUNDO,DISP=SHR

Essa linha liga um nome lógico a um dataset físico.

O nome lógico é:

LISTCOPAC

O dataset físico é:

INFEF00.COPIA.MUNDO

No programa COBOL provavelmente existe:

SELECT ARQUIVO-COPAC
    ASSIGN TO LISTCOPAC
    ORGANIZATION IS SEQUENTIAL
    ACCESS MODE IS SEQUENTIAL
    FILE STATUS IS WS-FILE-STATUS.

O COBOL conhece o arquivo pelo nome lógico. O JCL informa qual dataset real será usado.

Essa separação é poderosa.

O mesmo programa pode processar arquivos diferentes sem precisar ser recompilado.

Hoje:

//LISTCOPAC DD DSN=INFEF00.COPIA.MUNDO,DISP=SHR

Amanhã:

//LISTCOPAC DD DSN=INFEF00.COPIA.MUNDO.NOVO,DISP=SHR

O programa continua igual.

É o JCL que conecta a aplicação ao dado certo.


10. O que é QSAM?

QSAM significa Queued Sequential Access Method.

É um método de acesso para datasets sequenciais.

O programa COBOL executa comandos simples:

OPEN INPUT
READ
CLOSE

Mas o QSAM trabalha nos bastidores com:

  • buffers;

  • blocos;

  • movimentação de dados;

  • controle de fim de arquivo;

  • tratamento de registros;

  • acesso ao dispositivo;

  • otimização de entrada e saída.

Imagine um arquivo com registros de 100 bytes:

LRECL=100

O sistema não precisa necessariamente ler um registro físico por operação de disco.

Ele pode ler um bloco contendo vários registros:

BLKSIZE=27900

Nesse caso, um bloco pode conter 279 registros de 100 bytes.

O programa continua pedindo um registro por vez, mas o QSAM já trouxe vários registros para a memória.

Essa é a magia silenciosa do buffering.


11. Exemplo de definição COBOL

Um arquivo poderia ter esta estrutura:

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.

    SELECT ARQ-COPAC
        ASSIGN TO LISTCOPAC
        ORGANIZATION IS SEQUENTIAL
        ACCESS MODE IS SEQUENTIAL
        FILE STATUS IS WS-FS-COPAC.

DATA DIVISION.
FILE SECTION.

FD  ARQ-COPAC
    RECORDING MODE IS F.

01  REG-COPAC.
    05 CP-CODIGO           PIC 9(05).
    05 CP-NOME             PIC X(40).
    05 CP-PAIS             PIC X(30).
    05 CP-POPULACAO        PIC 9(11).
    05 FILLER              PIC X(14).

O tamanho total seria:

5 + 40 + 30 + 11 + 14 = 100 bytes

Logo, o dataset deveria ter:

RECFM=FB
LRECL=100

Se o arquivo tiver LRECL=80, a definição estará incompatível.

O resultado pode ser:

  • erro de abertura;

  • registros truncados;

  • campos deslocados;

  • dados inválidos;

  • abend;

  • inserções incorretas no banco.


12. File Status: o sensor do arquivo

Todo programa COBOL profissional deveria usar FILE STATUS.

Exemplo:

01  WS-FS-COPAC         PIC XX.

Após o OPEN:

OPEN INPUT ARQ-COPAC

IF WS-FS-COPAC NOT = '00'
    DISPLAY 'ERRO NO OPEN DO ARQUIVO: ' WS-FS-COPAC
    MOVE 12 TO RETURN-CODE
    GOBACK
END-IF

Alguns estados comuns:

00 = operação concluída
10 = fim de arquivo
35 = arquivo não encontrado
39 = conflito de atributos
41 = arquivo já aberto
42 = arquivo não aberto
46 = tentativa inválida de READ

O status 39 merece atenção especial.

Ele pode ocorrer quando a definição física do arquivo não combina com o que o programa espera.

É o mainframe dizendo:

“Padawan, o arquivo existe, mas sua descrição não corresponde à realidade.”


13. O DD SYSTSPRT

//SYSTSPRT DD SYSOUT=*

O SYSTSPRT recebe mensagens do TSO e do command processor DSN.

É uma das saídas mais importantes para análise.

Ali podem aparecer:

  • início do DSN;

  • conexão com o subsistema;

  • processamento do comando RUN;

  • mensagens sobre PLAN;

  • falha na localização do programa;

  • retorno do ambiente Db2;

  • encerramento do command processor.

Quando o job falhar antes de entrar no programa COBOL, o SYSTSPRT deve ser uma das primeiras saídas examinadas.


14. O significado de SYSOUT=*

DD SYSOUT=*

Isso não significa “um arquivo chamado SYSOUT”.

SYSOUT=* envia a saída ao spool, usando normalmente a classe de saída definida pelo job.

Exemplo:

//SYSTSPRT DD SYSOUT=*

As mensagens poderão ser vistas no SDSF.

O asterisco significa, em termos práticos:

“Use a classe de saída padrão associada ao job.”

Também seria possível especificar uma classe:

//SYSTSPRT DD SYSOUT=X

A classe depende das regras da instalação.


15. O problema dos DDs duplicados

Na imagem aparecem duas linhas:

//SYSOUT DD SYSOUT=*
//SYSOUT DD SYSOUT=*

Esse é um provável erro.

Dentro do mesmo step, dois DD statements não devem possuir o mesmo DDNAME dessa maneira.

Se o programa precisa de duas saídas, use nomes diferentes:

//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*

Ou:

//RELATORI DD SYSOUT=*
//ERROS    DD SYSOUT=*

Os nomes devem corresponder ao que o programa espera.

Exemplo no COBOL:

SELECT ARQ-RELATORIO
    ASSIGN TO RELATORI.

SELECT ARQ-ERROS
    ASSIGN TO ERROS.

O JCL seria:

//RELATORI DD SYSOUT=*
//ERROS    DD SYSOUT=*

E se a intenção era concatenar?

A concatenação correta seria:

//ENTRADA  DD DSN=ARQUIVO.PARTE1,DISP=SHR
//         DD DSN=ARQUIVO.PARTE2,DISP=SHR

Observe que apenas a primeira linha possui DDNAME.

Portanto:

//SYSOUT DD SYSOUT=*
//SYSOUT DD SYSOUT=*

não é a maneira adequada de concatenar.


16. O DD SYSTSIN

//SYSTSIN DD *

O SYSTSIN fornece comandos ao ambiente TSO batch.

Tudo entre:

//SYSTSIN DD *

e:

/*

será entregue ao IKJEFT01.

No exemplo:

DSN SYSTEM(DB9G)
RUN PROGRAM(COBDB501) PLAN(HERP0001) -
    LIB('ADCD.Z112.USERLOAD')

Essas linhas não são JCL.

São comandos processados dentro do ambiente TSO/Db2.

Essa diferença é fundamental.

JCL:

//SYSTSIN DD *

Comando TSO:

DSN SYSTEM(DB9G)

Subcomando Db2:

RUN PROGRAM(COBDB501)

17. O comando DSN SYSTEM(DB9G)

DSN SYSTEM(DB9G)

O comando DSN inicia o command processor do Db2.

O parâmetro:

SYSTEM(DB9G)

identifica o subsistema desejado.

O nome de quatro caracteres:

DB9G

é o subsystem ID.

Em outros ambientes poderíamos encontrar:

DB2D
DB2T
DB2H
DB2P
D91A
DSN1

A convenção varia.

Por exemplo:

DB2D = desenvolvimento
DB2T = teste
DB2H = homologação
DB2P = produção

Mas essa nomenclatura não é uma regra do Db2. É apenas uma convenção possível.

Quando o comando é executado, o sistema tenta:

  1. localizar o subsistema;

  2. estabelecer o attachment;

  3. criar uma thread;

  4. validar o ambiente;

  5. preparar a execução do programa.

Se o subsistema estiver parado, o programa nem chegará a ser carregado.


18. O comando RUN PROGRAM

RUN PROGRAM(COBDB501)

O DSN recebe a ordem para executar o programa:

COBDB501

Esse nome deve corresponder ao load module ou program object gerado no link-edit.

O DSN não executa o fonte COBOL.

Ele procura algo como:

ADCD.Z112.USERLOAD(COBDB501)

O membro deve ser um executável válido.

Se o membro não existir, pode ocorrer uma mensagem de programa não encontrado ou até um abend S806, dependendo do ponto da falha.


19. A cláusula PLAN(HERP0001)

PLAN(HERP0001)

O PLAN representa o contexto de execução Db2 da aplicação.

Historicamente, o PLAN continha diretamente os DBRMs.

Nos ambientes modernos, é comum o PLAN apontar para PACKAGES:

PLAN
  ↓
PKLIST
  ↓
COLLECTION
  ↓
PACKAGE
  ↓
Seções SQL

O PLAN:

HERP0001

deve existir no subsistema DB9G.

Também precisa estar autorizado para o usuário que executa o job.

Caso contrário, podem surgir erros relacionados a:

  • autorização;

  • PLAN inexistente;

  • PACKAGE não localizado;

  • collection incorreta;

  • inconsistência entre programa e PACKAGE.


20. DBRM, PACKAGE e PLAN

Quando um programa COBOL contém SQL:

EXEC SQL
    INSERT INTO TB_COPAC
           (CODIGO, NOME, PAIS)
    VALUES (:CP-CODIGO, :CP-NOME, :CP-PAIS)
END-EXEC

o compilador COBOL não entende sozinho esse SQL.

Antes da compilação, ocorre o precompile Db2.

O precompiler produz dois resultados:

1. Fonte COBOL modificado
2. DBRM

O fonte modificado contém chamadas à interface Db2.

O DBRM contém as instruções SQL extraídas.

Fluxo completo:

COBOL + SQL
    ↓
PRECOMPILE
    ├── COBOL modificado
    └── DBRM
          ↓
      BIND PACKAGE
          ↓
       PACKAGE

Enquanto isso:

COBOL modificado
    ↓
COMPILER
    ↓
OBJECT MODULE
    ↓
LINK-EDIT
    ↓
LOAD MODULE

Na execução, o load module e o PACKAGE precisam pertencer à mesma geração lógica.


21. O clássico SQLCODE -818

O -818 ocorre quando o programa executável e o DBRM ou PACKAGE não possuem o mesmo consistency token.

Em linguagem Bellacosa:

O sabre de luz e o cristal kyber vieram de treinamentos diferentes.

Isso acontece quando:

  1. o programa é precompilado;

  2. é gerado um novo DBRM;

  3. o COBOL é compilado;

  4. o load module é atualizado;

  5. o PACKAGE antigo continua no Db2.

Ou o contrário:

  1. um novo PACKAGE é criado;

  2. o load module antigo continua na loadlib.

Resultado:

SQLCODE -818

A correção normalmente exige refazer o ciclo com os mesmos artefatos:

PRECOMPILE
COMPILE
LINK-EDIT
BIND PACKAGE

22. O SQLCODE -805

O -805 também é extremamente comum.

Ele indica que o Db2 não encontrou o PACKAGE necessário.

Possíveis causas:

  • PACKAGE não bindado;

  • collection errada;

  • PLAN não contém a collection;

  • nome do programa diferente;

  • ambiente errado;

  • PACKAGE removido;

  • load module promovido sem o BIND correspondente.

A mensagem geralmente fornece informações sobre:

  • localização;

  • collection;

  • package;

  • consistency token.

Esses dados devem ser analisados cuidadosamente.


23. A cláusula LIB

LIB('ADCD.Z112.USERLOAD')

A cláusula LIB informa a biblioteca onde o programa deve ser localizado.

Portanto:

RUN PROGRAM(COBDB501)
    PLAN(HERP0001)
    LIB('ADCD.Z112.USERLOAD')

significa:

Execute o programa COBDB501, utilizando o PLAN HERP0001, procurando o módulo na biblioteca ADCD.Z112.USERLOAD.

Essa instrução é importante porque a STEPLIB contém apenas a biblioteca Db2.

Sem a cláusula LIB, o programa da aplicação talvez não fosse encontrado.

Atenção à biblioteca antiga

A imagem também mostra:

//JOBLIB DD DSN=IBMUSER.CBL.LOADLIB,DISP=SHR

Temos então duas bibliotecas que podem conter o programa:

IBMUSER.CBL.LOADLIB
ADCD.Z112.USERLOAD

É importante confirmar onde está a versão correta.

Talvez exista:

IBMUSER.CBL.LOADLIB(COBDB501)

e também:

ADCD.Z112.USERLOAD(COBDB501)

Se a versão nova foi gravada na primeira biblioteca, mas o comando RUN aponta para a segunda, o job continuará executando o programa antigo.

Esse é um easter egg clássico do mainframe:

O código está correto, a compilação terminou com RC 0, mas o comportamento não mudou porque o job está carregando outra cópia do programa.

Para investigar, use ISPF 3.4 e compare:

  • data;

  • hora;

  • tamanho;

  • atributos;

  • usuário da última alteração.


24. O hífen de continuação

PLAN(HERP0001) -

O hífen informa que o comando continua na linha seguinte.

A continuação é:

LIB('ADCD.Z112.USERLOAD')

Sem o hífen, o DSN poderia tratar a primeira linha como um comando completo e a segunda como outro comando.

Uma versão bem formatada seria:

RUN PROGRAM(COBDB501) -
    PLAN(HERP0001)     -
    LIB('ADCD.Z112.USERLOAD')

O estilo depende do padrão da empresa, mas a legibilidade melhora bastante.


25. O comando END

O JCL da imagem não apresenta explicitamente:

END

É recomendável encerrar a sessão DSN:

//SYSTSIN DD *
  DSN SYSTEM(DB9G)
  RUN PROGRAM(COBDB501) PLAN(HERP0001) -
      LIB('ADCD.Z112.USERLOAD')
  END
/*

O fim do arquivo de comandos pode encerrar o command processor, mas o END deixa a intenção explícita.

É uma boa prática.


26. Exemplo completo de JCL corrigido

//CATPGM1 JOB (ACCT),'CARGA COBOL DB2',
//             CLASS=A,
//             MSGCLASS=X,
//             MSGLEVEL=(1,1),
//             NOTIFY=&SYSUID
//*
//*-------------------------------------------------------------------*
//* PROGRAMA COBOL LE ARQUIVO QSAM E INSERE DADOS NO DB2
//*-------------------------------------------------------------------*
//EXECDB2 EXEC PGM=IKJEFT01,DYNAMNBR=20
//*
//* MODULOS DO DB2
//*
//STEPLIB DD DSN=DSN910.SDSNLOAD,DISP=SHR
//*
//* ARQUIVO SEQUENCIAL DE ENTRADA
//*
//LISTCOPAC DD DSN=INFEF00.COPIA.MUNDO,DISP=SHR
//*
//* SAIDAS DO AMBIENTE E DO PROGRAMA
//*
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//CEEDUMP  DD SYSOUT=*
//*
//* COMANDOS TSO E DB2
//*
//SYSTSIN DD *
  DSN SYSTEM(DB9G)
  RUN PROGRAM(COBDB501) PLAN(HERP0001) -
      LIB('ADCD.Z112.USERLOAD')
  END
/*
//

27. Explicação do cartão JOB

//CATPGM1 JOB (ACCT),'CARGA COBOL DB2',

CATPGM1 é o nome do job.

(ACCT)

representa informações contábeis da instalação.

'CARGA COBOL DB2'

é uma descrição.


CLASS=A

CLASS=A

Define a classe de execução.

A classe pode determinar:

  • prioridade;

  • initiator;

  • limites;

  • ambiente;

  • políticas de scheduling.

O significado de A varia conforme a instalação.


MSGCLASS=X

MSGCLASS=X

Define a classe das mensagens de saída.

Ela influencia onde e como o spool será tratado.


MSGLEVEL=(1,1)

MSGLEVEL=(1,1)

Controla o nível de detalhes registrado no spool.

O primeiro valor controla a impressão das instruções JCL.

O segundo controla mensagens de alocação e execução.


NOTIFY=&SYSUID

NOTIFY=&SYSUID

Solicita que o usuário que submeteu o job seja notificado quando ele terminar.

&SYSUID é substituído pelo ID do usuário.


28. Exemplo de programa COBOL

       IDENTIFICATION DIVISION.
       PROGRAM-ID. COBDB501.

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.

           SELECT ARQ-COPAC
               ASSIGN TO LISTCOPAC
               ORGANIZATION IS SEQUENTIAL
               ACCESS MODE IS SEQUENTIAL
               FILE STATUS IS WS-FS-COPAC.

       DATA DIVISION.
       FILE SECTION.

       FD  ARQ-COPAC
           RECORDING MODE IS F.

       01  REG-COPAC.
           05 CP-CODIGO           PIC 9(05).
           05 CP-NOME             PIC X(40).
           05 CP-PAIS             PIC X(30).
           05 CP-POPULACAO        PIC 9(11).
           05 FILLER              PIC X(14).

       WORKING-STORAGE SECTION.

       01  WS-FS-COPAC            PIC XX.
       01  WS-FIM-ARQUIVO         PIC X VALUE 'N'.
           88 FIM-ARQUIVO               VALUE 'S'.

       01  WS-CONTADORES.
           05 WS-LIDOS            PIC 9(09) COMP-3 VALUE ZERO.
           05 WS-INSERIDOS        PIC 9(09) COMP-3 VALUE ZERO.
           05 WS-REJEITADOS       PIC 9(09) COMP-3 VALUE ZERO.
           05 WS-COMMIT           PIC 9(05) COMP-3 VALUE ZERO.

       01  WS-SQLCODE-AUX         PIC -9(09).

           EXEC SQL
               INCLUDE SQLCA
           END-EXEC.

       PROCEDURE DIVISION.

       0000-PRINCIPAL.

           PERFORM 1000-INICIALIZAR

           PERFORM 2000-PROCESSAR
               UNTIL FIM-ARQUIVO

           PERFORM 9000-FINALIZAR

           GOBACK.

29. Inicialização do programa

       1000-INICIALIZAR.

           DISPLAY 'INICIO DO PROGRAMA COBDB501'

           OPEN INPUT ARQ-COPAC

           IF WS-FS-COPAC NOT = '00'
               DISPLAY 'ERRO NO OPEN LISTCOPAC: ' WS-FS-COPAC
               MOVE 12 TO RETURN-CODE
               GOBACK
           END-IF

           PERFORM 2100-LER-ARQUIVO.

A primeira leitura é realizada na inicialização.

Esse padrão evita que o programa execute o processamento com um registro não carregado.


30. Leitura e processamento

       2000-PROCESSAR.

           ADD 1 TO WS-LIDOS

           PERFORM 3000-VALIDAR-REGISTRO

           IF CP-CODIGO IS NUMERIC
               PERFORM 4000-INSERIR-DB2
           ELSE
               ADD 1 TO WS-REJEITADOS
               DISPLAY 'CODIGO INVALIDO: ' CP-CODIGO
           END-IF

           PERFORM 2100-LER-ARQUIVO.

A leitura:

       2100-LER-ARQUIVO.

           READ ARQ-COPAC
               AT END
                   SET FIM-ARQUIVO TO TRUE
               NOT AT END
                   CONTINUE
           END-READ

           IF WS-FS-COPAC NOT = '00'
              AND WS-FS-COPAC NOT = '10'
               DISPLAY 'ERRO DE LEITURA: ' WS-FS-COPAC
               PERFORM 8000-ROLLBACK
               MOVE 12 TO RETURN-CODE
               GOBACK
           END-IF.

O status 10 representa fim de arquivo e não deve ser tratado como erro.


31. O INSERT Db2

       4000-INSERIR-DB2.

           EXEC SQL
               INSERT INTO TB_COPAC
               (
                   CODIGO,
                   NOME,
                   PAIS,
                   POPULACAO
               )
               VALUES
               (
                   :CP-CODIGO,
                   :CP-NOME,
                   :CP-PAIS,
                   :CP-POPULACAO
               )
           END-EXEC

           EVALUATE SQLCODE
               WHEN ZERO
                   ADD 1 TO WS-INSERIDOS
                   ADD 1 TO WS-COMMIT

               WHEN -803
                   ADD 1 TO WS-REJEITADOS
                   DISPLAY 'CHAVE DUPLICADA: ' CP-CODIGO

               WHEN OTHER
                   MOVE SQLCODE TO WS-SQLCODE-AUX
                   DISPLAY 'ERRO SQL: ' WS-SQLCODE-AUX
                   DISPLAY 'REGISTRO: ' CP-CODIGO
                   PERFORM 8000-ROLLBACK
                   MOVE 12 TO RETURN-CODE
                   GOBACK
           END-EVALUATE

           IF WS-COMMIT >= 1000
               PERFORM 7000-COMMIT
           END-IF.

32. Por que não fazer apenas um COMMIT no final?

Imagine uma carga de dez milhões de registros.

Se o programa executar um único COMMIT, poderá manter durante horas:

  • locks;

  • espaço de log;

  • páginas modificadas;

  • recursos;

  • unidade de trabalho gigantesca.

Se ocorrer erro no registro 9.999.999, o rollback poderá desfazer tudo.

Uma estratégia mais segura é:

COMMIT a cada 1.000 registros

Ou:

COMMIT a cada 5.000 registros

O valor ideal depende do ambiente.

Não existe um número mágico.

É preciso considerar:

  • volume;

  • concorrência;

  • log;

  • índices;

  • tempo de recuperação;

  • SLA;

  • restart;

  • regras de negócio.

Rotina:

       7000-COMMIT.

           EXEC SQL
               COMMIT
           END-EXEC

           IF SQLCODE NOT = ZERO
               DISPLAY 'ERRO NO COMMIT: ' SQLCODE
               MOVE 12 TO RETURN-CODE
               GOBACK
           END-IF

           MOVE ZERO TO WS-COMMIT.

33. ROLLBACK

       8000-ROLLBACK.

           EXEC SQL
               ROLLBACK
           END-EXEC

           DISPLAY 'ROLLBACK EXECUTADO'.

O rollback desfaz alterações realizadas desde o último commit.

Mas atenção: ele não desfaz tudo desde o início do programa se já ocorreram commits intermediários.

Exemplo:

1.000 registros → COMMIT
1.000 registros → COMMIT
500 registros → erro → ROLLBACK

Nesse caso:

  • os primeiros 2.000 permanecem;

  • os últimos 500 são desfeitos.


34. Finalização

       9000-FINALIZAR.

           IF WS-COMMIT > ZERO
               PERFORM 7000-COMMIT
           END-IF

           CLOSE ARQ-COPAC

           DISPLAY '--------------------------------'
           DISPLAY 'REGISTROS LIDOS     : ' WS-LIDOS
           DISPLAY 'REGISTROS INSERIDOS : ' WS-INSERIDOS
           DISPLAY 'REGISTROS REJEITADOS: ' WS-REJEITADOS
           DISPLAY 'FIM DO PROGRAMA COBDB501'
           DISPLAY '--------------------------------'.

Esses totais serão enviados ao SYSOUT ou à saída padrão do Language Environment, dependendo da configuração.

Eles são fundamentais para auditoria.


35. Códigos de retorno

O programa pode usar:

MOVE 0 TO RETURN-CODE

para sucesso.

Outros códigos comuns:

RC 0  = sucesso
RC 4  = sucesso com aviso
RC 8  = erro de aplicação
RC 12 = erro grave
RC 16 = falha crítica

Esses valores são convenções. A empresa pode definir outros padrões.

Um scheduler pode usar o retorno:

RC <= 4  → continuar
RC >= 8  → interromper fluxo

36. Possíveis falhas

JCL ERROR

Causa provável:

//SYSOUT DD SYSOUT=*
//SYSOUT DD SYSOUT=*

Correção: usar DDNAMEs distintos.


S806

O programa não foi encontrado.

Verificar:

ADCD.Z112.USERLOAD(COBDB501)

S013

Pode estar relacionado à incompatibilidade de atributos do dataset.

Verificar:

  • RECFM;

  • LRECL;

  • BLKSIZE;

  • modo de abertura;

  • definição FD.


SQLCODE -803

Chave duplicada.

O programa tentou inserir um valor único já existente.


SQLCODE -805

PACKAGE não encontrado.

Verificar:

  • collection;

  • BIND PACKAGE;

  • PLAN;

  • consistency token.


SQLCODE -818

Load module e PACKAGE incompatíveis.

Refazer compilação e BIND de forma sincronizada.


SQLCODE -904

Recurso indisponível.

Pode existir:

  • tablespace parado;

  • utility pendente;

  • objeto em estado restritivo;

  • problema de storage.


SQLCODE -911

Deadlock ou timeout com rollback.

A aplicação precisa registrar:

  • chave;

  • SQLCODE;

  • unidade de trabalho;

  • momento do erro.


SQLCODE -922

Problema de autorização ou conexão.

Verificar permissões para:

  • PLAN;

  • PACKAGE;

  • tabela;

  • operação INSERT;

  • subsistema.


37. Como investigar no SDSF

Depois de submeter o job, abra:

SDSF

Depois:

ST

Localize o job e abra com S.

Analise na seguinte ordem:

JESJCL

Mostra o JCL interpretado.

Útil para detectar:

  • erro de sintaxe;

  • DD duplicado;

  • PROC expandida;

  • símbolos substituídos.

JESYSMSG

Mostra mensagens do sistema.

Procure por prefixos:

IEF
IEC
IGD
ICH

SYSTSPRT

Mostra mensagens do TSO e DSN.

SYSOUT

Mostra os DISPLAY do COBOL.

CEEDUMP

Mostra informações de falhas do Language Environment.

SYSUDUMP

Pode conter detalhes de abend e registradores.


38. Easter egg: o programa antigo que nunca morre

Um dos problemas mais misteriosos do mainframe ocorre assim:

  1. o programador altera o fonte;

  2. compila com RC 0;

  3. submete o job;

  4. o comportamento antigo continua;

  5. compila novamente;

  6. nada muda;

  7. começa a desconfiar do compilador, do Db2 e talvez da própria realidade.

A causa:

O load module foi gravado em uma biblioteca,
mas o RUN está usando outra.

Exemplo:

Novo:
IBMUSER.CBL.LOADLIB(COBDB501)

Executado:
ADCD.Z112.USERLOAD(COBDB501)

O mainframe não está errado.

Ele apenas obedeceu exatamente ao que foi pedido.

Essa é uma das grandes lições do IBM Z:

O sistema raramente faz o que imaginamos. Ele faz o que realmente declaramos.


39. O grande mapa da missão

INFEF00.COPIA.MUNDO
          │
          │ LISTCOPAC
          ▼
     Programa COBOL
       COBDB501
          │
          │ EXEC SQL INSERT
          ▼
      PLAN HERP0001
          │
          ▼
        PACKAGE
          │
          ▼
       Db2 DB9G
          │
          ▼
       TB_COPAC

Ao redor dessa execução, estão:

JES2
IKJEFT01
SDSNLOAD
TSO Attachment
Language Environment
QSAM
RACF
SDSF
Logs do Db2

Nada acontece isoladamente.


Conclusão: poucas linhas, muitas engrenagens

O JCL apresentado é um excelente exemplo da filosofia mainframe: comandos pequenos podem coordenar estruturas gigantescas.

Uma linha como:

RUN PROGRAM(COBDB501) PLAN(HERP0001)

carrega décadas de evolução tecnológica.

Ela conecta:

  • um executável COBOL;

  • um ambiente TSO batch;

  • um subsistema Db2;

  • um PLAN;

  • PACKAGES;

  • SQL estático;

  • um arquivo sequencial;

  • QSAM;

  • segurança;

  • logging;

  • controle transacional.

Para o programador COBOL padawan, a principal lição é não observar o JCL como uma simples receita de execução.

Cada DD representa um contrato.

LISTCOPAC → contrato com o arquivo
STEPLIB   → contrato com as bibliotecas
SYSTSIN   → contrato com o TSO
SYSTSPRT  → contrato com as mensagens
PLAN      → contrato com o Db2
LIB       → contrato com o executável
COMMIT    → contrato com a integridade

Quando esses contratos estão alinhados, milhões de registros podem ser processados com precisão.

Quando um deles está errado, o sistema pode responder com um JCL ERROR, um S806, um -805, um -818 ou um silencioso arquivo lido com layout incorreto.

O verdadeiro domínio do mainframe não vem apenas de decorar comandos.

Ele nasce quando entendemos a jornada completa:

Fonte
  → Precompile
  → Compile
  → Link-edit
  → DBRM
  → BIND PACKAGE
  → BIND PLAN
  → JCL
  → IKJEFT01
  → DSN
  → COBOL
  → QSAM
  → Db2
  → COMMIT
  → SDSF

E assim, diante da tela verde, com uma caneca de café ao lado, o padawan percebe que aquele pequeno JCL não é apenas um arquivo de comandos.

É a porta de entrada para uma das arquiteturas de processamento corporativo mais robustas já construídas.

sexta-feira, 15 de abril de 2022

Da Compilação à Execução de um Programa COBOL — Parte IV

 

Bellacosa Mainframe apresenta compilando e executando programa cobol

☕ Um Café no Bellacosa Mainframe

Da Compilação à Execução de um Programa COBOL — Parte IV

Da Load Library à CPU: Como JES2, JCL, QSAM, VSAM, Memória e z/OS Colocam o Programa para Trabalhar

Introdução

Nas três primeiras partes desta jornada, acompanhamos o nascimento e a transformação de um programa COBOL.

Primeiro, vimos que tudo começa com o código-fonte e com os copybooks, que funcionam como contratos de dados compartilhados entre programas, arquivos e subsistemas.

Depois, conhecemos o papel de ambientes especializados como:

  • CICS;

  • Db2;

  • IMS;

  • Adabas.

Descobrimos que comandos EXEC CICS precisam ser traduzidos, que instruções EXEC SQL precisam ser processadas pelo Db2 e que aplicações IMS ou Adabas dependem de interfaces específicas.

Na terceira parte, entramos na fábrica de software do IBM Z.

O compilador transformou o fonte em código objeto.

O Binder resolveu referências, reuniu módulos e criou o executável.

Ao final, o programa foi armazenado em uma load library:

EMPRESA.SISTEMA.LOADLIB(PGMCLI01)

Agora, finalmente, chegou a hora de responder à pergunta que todo Programador COBOL Padawan faz:

Como esse membro armazenado em uma biblioteca realmente começa a executar?

Ter um load module não significa que o programa já esteja trabalhando.

Ele ainda precisa ser:

  • solicitado;

  • localizado;

  • carregado;

  • associado aos arquivos;

  • colocado em memória;

  • entregue ao ambiente de execução;

  • despachado para um processador;

  • monitorado até o término.

Nesta quarta e última parte, acompanharemos essa jornada completa.

Veremos como o JCL solicita a execução, como o JES2 administra o job, como o initiator inicia os steps, como QSAM e VSAM são conectados ao programa, como o z/OS administra memória e processadores e por que a CPU nunca enxerga uma única linha de COBOL.

Prepare a última xícara desta série.

O programa já foi construído.

Agora ele precisa entrar em produção.


1. O executável está pronto, mas ainda está parado

Depois da linkedição, temos um módulo executável armazenado em uma biblioteca:

EMPRESA.SISTEMA.LOADLIB(PGMCLI01)

Esse módulo contém instruções de máquina, pontos de entrada, referências resolvidas e estruturas necessárias para a execução.

Porém, sozinho, ele não realiza trabalho algum.

É como um automóvel estacionado dentro de uma garagem.

O veículo está montado.

O motor existe.

Os sistemas estão disponíveis.

Mas alguém ainda precisa:

  • localizar o carro;

  • abrir a garagem;

  • fornecer combustível;

  • ligar o motor;

  • definir o destino;

  • colocá-lo na estrada.

No ambiente batch, essa missão normalmente começa com um JCL.


2. O JCL solicita a execução

JCL significa Job Control Language.

Ele não é uma linguagem de programação de negócio como COBOL.

Sua função é descrever ao sistema operacional:

  • qual programa deverá ser executado;

  • quais arquivos serão utilizados;

  • quais bibliotecas contêm os módulos;

  • para onde enviar as saídas;

  • quais recursos serão necessários;

  • quais condições controlam os steps;

  • como o job deverá ser classificado.

Um exemplo simples:

//EXECUTA  JOB (1234),'BELLACOSA',
//             CLASS=A,
//             MSGCLASS=X,
//             NOTIFY=&SYSUID
//*
//STEP01   EXEC PGM=PGMCLI01
//STEPLIB  DD DISP=SHR,
//            DSN=EMPRESA.SISTEMA.LOADLIB
//CLIENTES DD DISP=SHR,
//            DSN=EMPRESA.DADOS.CLIENTES
//RELATORIO DD SYSOUT=*
//SYSOUT   DD SYSOUT=*

A instrução principal é:

//STEP01 EXEC PGM=PGMCLI01

Ela informa ao sistema:

Execute o programa chamado PGMCLI01.

Mas para isso funcionar, o z/OS precisa encontrar esse módulo.


3. Como o sistema encontra o programa?

O nome informado em:

PGM=PGMCLI01

não contém o nome completo da biblioteca.

O sistema precisa pesquisar em bibliotecas disponíveis para localizar o módulo.

Em batch, uma das formas mais comuns é utilizar STEPLIB:

//STEPLIB DD DISP=SHR,
//           DSN=EMPRESA.SISTEMA.LOADLIB

Isso informa que, durante aquele step, a biblioteca deverá participar da procura pelo executável.

Também podem existir outros mecanismos, como:

  • JOBLIB;

  • TASKLIB;

  • LNKLST;

  • bibliotecas do sistema;

  • bibliotecas privadas;

  • bibliotecas concatenadas;

  • ambientes especializados.

O princípio é:

Nome do programa
       ↓
Pesquisa nas bibliotecas
       ↓
Módulo localizado
       ↓
Carga e execução

4. A ordem das bibliotecas importa

Imagine:

//STEPLIB DD DISP=SHR,
//           DSN=EMPRESA.TESTE.LOADLIB
//        DD DISP=SHR,
//           DSN=EMPRESA.ANTIGA.LOADLIB

Se PGMCLI01 existir na primeira biblioteca, essa versão será utilizada.

Agora imagine a ordem inversa:

//STEPLIB DD DISP=SHR,
//           DSN=EMPRESA.ANTIGA.LOADLIB
//        DD DISP=SHR,
//           DSN=EMPRESA.TESTE.LOADLIB

O programa antigo poderá ser encontrado primeiro.

O programador compila uma alteração, executa o job e não percebe nenhuma mudança.

Então começa a revisar:

  • o COBOL;

  • o copybook;

  • o IF;

  • o MOVE;

  • o SQL;

  • os dados.

Mas o problema real é muito mais simples:

O sistema está executando outro load.

Essa situação é tão comum que todo profissional mainframe deveria verificar primeiro:

  • em qual load library o módulo foi gerado;

  • qual biblioteca está no JCL;

  • qual é a ordem da concatenação;

  • se existe outro membro com o mesmo nome;

  • se o ambiente online já carregou a nova versão.


5. O que acontece se o programa não for encontrado?

Quando o módulo não está disponível nas bibliotecas pesquisadas, o sistema pode produzir um erro associado a programa não encontrado.

Um exemplo clássico é o abend:

S806

Isso geralmente significa que o sistema tentou localizar o módulo, mas não encontrou uma versão executável disponível.

As causas podem incluir:

  • STEPLIB ausente;

  • biblioteca incorreta;

  • membro inexistente;

  • erro no nome do programa;

  • programa gravado em outra load library;

  • módulo não promovido;

  • biblioteca indisponível;

  • ponto de entrada incorreto.

Observe que o fonte COBOL pode estar perfeito.

A compilação pode ter terminado com RC=0.

A linkedição também pode ter terminado corretamente.

Mesmo assim, a execução falha porque o executável não foi encontrado.

Essa é a diferença entre:

Criar o programa

e:

Disponibilizar o programa para execução

6. O programa precisa de dados

Localizar o executável é apenas o começo.

Um programa real costuma depender de:

  • arquivos sequenciais;

  • clusters VSAM;

  • tabelas Db2;

  • bancos IMS;

  • arquivos Adabas;

  • mensagens MQ;

  • filas CICS;

  • parâmetros;

  • relatórios;

  • arquivos de trabalho.

No batch, muitos desses recursos são associados ao programa por DD statements no JCL.

É aqui que entramos no universo de QSAM e VSAM.


7. O que é QSAM?

QSAM significa Queued Sequential Access Method.

Ele é um método tradicional de acesso sequencial a datasets no z/OS.

Em um arquivo sequencial, os registros normalmente são processados na ordem em que estão armazenados.

No COBOL:

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.

           SELECT ARQ-CLIENTES
               ASSIGN TO CLIENTES
               ORGANIZATION IS SEQUENTIAL
               ACCESS MODE IS SEQUENTIAL
               FILE STATUS IS WS-FILE-STATUS.

Na FILE SECTION:

       FD  ARQ-CLIENTES.

       01  REGISTRO-CLIENTE.
           05 REG-CODIGO        PIC 9(09).
           05 REG-NOME          PIC X(40).
           05 REG-SALDO         PIC S9(11)V99 COMP-3.

Na lógica:

           OPEN INPUT ARQ-CLIENTES

           PERFORM UNTIL FIM-ARQUIVO
               READ ARQ-CLIENTES
                   AT END
                       SET FIM-ARQUIVO TO TRUE
                   NOT AT END
                       PERFORM PROCESSAR-CLIENTE
               END-READ
           END-PERFORM

           CLOSE ARQ-CLIENTES.

O programa conhece o arquivo pelo nome lógico:

CLIENTES

O JCL conecta esse nome lógico a um dataset físico.


8. O contrato entre COBOL e JCL

No programa:

ASSIGN TO CLIENTES

No JCL:

//CLIENTES DD DISP=SHR,
//            DSN=EMPRESA.DADOS.CLIENTES

A ligação é:

SELECT ARQ-CLIENTES
       ↓
ASSIGN TO CLIENTES
       ↓
DDNAME CLIENTES
       ↓
EMPRESA.DADOS.CLIENTES

Essa separação é extremamente poderosa.

O programa não precisa possuir no fonte:

EMPRESA.DADOS.CLIENTES

O mesmo executável pode ser usado em diferentes ambientes.

Desenvolvimento

//CLIENTES DD DISP=SHR,
//            DSN=DESENV.DADOS.CLIENTES

Homologação

//CLIENTES DD DISP=SHR,
//            DSN=HOMOLOG.DADOS.CLIENTES

Produção

//CLIENTES DD DISP=SHR,
//            DSN=PROD.DADOS.CLIENTES

O load module é o mesmo.

O que muda é o JCL e o ambiente.


9. Quando o DDNAME está errado

Imagine que o COBOL espera:

ASSIGN TO CLIENTES

Mas o JCL fornece:

//ARQCLI DD DISP=SHR,
//          DSN=EMPRESA.DADOS.CLIENTES

O dataset existe.

O programa existe.

A biblioteca está correta.

Porém, o nome lógico não corresponde ao DDNAME esperado.

O programa procura CLIENTES.

O JCL forneceu ARQCLI.

Essa divergência poderá provocar erro de abertura.

Esse problema ensina uma grande lição:

Em mainframe, muitos erros surgem da quebra de contratos entre componentes.

O COBOL, o JCL, os arquivos e os subsistemas precisam falar a mesma língua.


10. OPEN, READ, WRITE e CLOSE

Um programa QSAM normalmente segue um ciclo.

OPEN
  ↓
READ ou WRITE
  ↓
Processamento
  ↓
CLOSE

Exemplo de entrada:

           OPEN INPUT ARQ-ENTRADA

Exemplo de saída:

           OPEN OUTPUT ARQ-SAIDA

Leitura:

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

Gravação:

           WRITE REGISTRO-SAIDA

Finalização:

           CLOSE ARQ-ENTRADA
                 ARQ-SAIDA

O compilador gera chamadas e instruções necessárias para trabalhar com o access method.

Durante a execução, o z/OS e seus componentes realizam o acesso real ao dataset.


11. O que é VSAM?

VSAM significa Virtual Storage Access Method.

Ele fornece diferentes formas de organização de dados.

Entre elas:

  • KSDS;

  • ESDS;

  • RRDS;

  • LDS;

  • VRRDS.

Para um Programador COBOL Padawan, o KSDS é um dos mais importantes.

KSDS significa Key-Sequenced Data Set.

Os registros podem ser acessados por uma chave.

Exemplo:

       FILE-CONTROL.

           SELECT ARQ-CLIENTES
               ASSIGN TO CLIENTES
               ORGANIZATION IS INDEXED
               ACCESS MODE IS DYNAMIC
               RECORD KEY IS REG-CODIGO
               FILE STATUS IS WS-FILE-STATUS.

O campo:

REG-CODIGO

é a chave do registro.


12. Acesso sequencial e direto no VSAM

Um KSDS pode permitir diferentes formas de acesso.

Acesso sequencial

O programa lê os registros em ordem de chave.

           READ ARQ-CLIENTES NEXT RECORD
               AT END
                   SET FIM-ARQUIVO TO TRUE
           END-READ.

Acesso direto

O programa informa uma chave específica.

           MOVE WS-CODIGO-PESQUISA
             TO REG-CODIGO

           READ ARQ-CLIENTES
               KEY IS REG-CODIGO
               INVALID KEY
                   DISPLAY 'CLIENTE NAO ENCONTRADO'
           END-READ.

Acesso dinâmico

Permite combinar acessos sequenciais e diretos.

ACCESS MODE IS DYNAMIC

Esse tipo de flexibilidade tornou VSAM fundamental em muitas aplicações corporativas.


13. FILE STATUS

Um programa não deve presumir que uma operação de arquivo sempre funcionou.

Por isso, pode utilizar:

FILE STATUS IS WS-FILE-STATUS

Definição:

       01  WS-FILE-STATUS       PIC X(02).

Depois de uma operação:

           IF WS-FILE-STATUS NOT = '00'
               DISPLAY 'ERRO NO ARQUIVO: '
                       WS-FILE-STATUS
           END-IF.

Alguns retornos conhecidos são:

00 → operação concluída com sucesso
10 → fim de arquivo
22 → possibilidade de chave duplicada
23 → registro não encontrado
35 → problema na abertura ou arquivo ausente
39 → conflito de atributos

A interpretação exata precisa considerar:

  • operação executada;

  • organização do arquivo;

  • ambiente;

  • documentação;

  • mensagem adicional.


14. FILE STATUS 10 não é necessariamente erro

Em processamento sequencial, o retorno:

10

normalmente indica fim de arquivo.

Isso faz parte do fluxo esperado.

Exemplo:

           READ ARQ-ENTRADA
               AT END
                   SET FIM-ARQUIVO TO TRUE
           END-READ.

O programa precisa distinguir:

Fim normal de arquivo

de:

Erro de leitura

Tratar todos os retornos diferentes de 00 como falha pode produzir lógica incorreta.


15. QSAM e VSAM não ficam dentro do executável

O load module contém o programa.

Os dados permanecem em datasets separados.

LOADLIB
  └── PGMCLI01

Dataset QSAM
  └── registros sequenciais

Cluster VSAM
  └── registros organizados

Tabela Db2
  └── linhas relacionais

Banco IMS
  └── segmentos hierárquicos

Arquivo Adabas
  └── registros gerenciados pelo Nucleus

O executável contém a lógica.

Os datasets e bancos contêm os dados.

O JCL e os subsistemas conectam os dois mundos.


16. O que é JES2?

JES2 significa Job Entry Subsystem 2.

Ele é um dos componentes mais importantes do processamento batch no z/OS.

Uma confusão comum é imaginar que o JES2 executa diretamente o programa COBOL.

Ele não faz isso.

O JES2 administra o fluxo do job.

Entre suas responsabilidades estão:

  • receber jobs;

  • armazenar entrada;

  • organizar filas;

  • considerar classes;

  • controlar prioridades;

  • administrar spool;

  • acompanhar saída;

  • direcionar impressão;

  • reter resultados;

  • fornecer informações ao operador.

Podemos pensar no JES2 como um grande controlador de tráfego batch.


17. O ciclo de um job

Um fluxo simplificado:

Programador submete o JCL
            ↓
JES2 recebe o job
            ↓
Job é colocado no spool
            ↓
JCL é analisado
            ↓
Job aguarda em uma fila
            ↓
Um initiator seleciona o job
            ↓
Os steps são executados
            ↓
As saídas voltam ao spool
            ↓
Usuário consulta no SDSF

O JES2 não executa a instrução COBOL:

ADD WS-VALOR TO WS-TOTAL

Ele gerencia o job que contém o step responsável por iniciar o programa.


18. O que é spool?

Spool é uma área em disco utilizada para armazenar entrada e saída dos jobs.

O termo vem historicamente de:

Simultaneous Peripheral Operations On-Line

Na prática, o spool permite desacoplar a produção da saída de seu consumo imediato.

Por exemplo, um programa pode gerar milhares de linhas de relatório.

Essas linhas não precisam ser enviadas instantaneamente a uma impressora física.

Elas podem ser armazenadas no spool.

Depois, poderão ser:

  • consultadas;

  • impressas;

  • transferidas;

  • retidas;

  • apagadas;

  • analisadas.


19. Saídas comuns no spool

Ao consultar um job no SDSF, podemos encontrar:

JESMSGLG
JESJCL
JESYSMSG
SYSPRINT
SYSOUT
SYSUDUMP
CEEDUMP

JESMSGLG

Contém mensagens relacionadas ao job e ao JES.

JESJCL

Mostra o JCL processado.

Pode incluir expansão de procedures e parâmetros.

JESYSMSG

Contém mensagens do sistema para os steps.

SYSPRINT

Normalmente recebe listagens, relatórios ou mensagens de utilitários.

SYSOUT

Pode conter saída produzida pelo programa.

SYSUDUMP

Pode receber dumps em caso de falha.

CEEDUMP

Pode conter informações produzidas pelo Language Environment.

Essas saídas são fundamentais para diagnóstico.


20. SDSF: a janela para o processamento

SDSF significa System Display and Search Facility.

Por meio dele, o profissional pode:

  • visualizar jobs;

  • acompanhar execução;

  • analisar return codes;

  • consultar spool;

  • verificar classes;

  • observar held output;

  • cancelar jobs;

  • liberar saída;

  • investigar abends;

  • acompanhar started tasks.

O Padawan submete o job e olha apenas a última linha.

O especialista abre cada saída relevante.

Ele procura:

  • qual step falhou;

  • qual RC foi retornado;

  • qual biblioteca foi usada;

  • qual dataset não abriu;

  • qual mensagem apareceu antes do abend;

  • qual componente emitiu o diagnóstico.


21. O que é um initiator?

Um initiator é um componente que seleciona jobs elegíveis para execução e inicia seus steps.

Ele trabalha com elementos como:

  • classe do job;

  • disponibilidade;

  • configuração;

  • capacidade;

  • regras operacionais;

  • prioridade;

  • recursos.

Considere:

//EXECUTA JOB ...,CLASS=A

O job pertence à classe A.

Para que ele seja processado, deve existir um ambiente preparado para executar jobs dessa classe.

O initiator seleciona o job e inicia o processamento.


22. O que acontece quando o step começa?

Para:

//STEP01 EXEC PGM=PGMCLI01

o sistema precisa realizar diversas ações.

  1. Interpretar o step.

  2. Processar parâmetros.

  3. Alocar DD statements.

  4. Verificar datasets.

  5. Localizar o módulo executável.

  6. Preparar o ambiente de execução.

  7. Carregar o programa.

  8. Inicializar o runtime.

  9. Entregar o controle ao programa.

  10. Acompanhar seu término.

  11. Registrar o return code.

  12. Liberar recursos.

  13. Decidir se o próximo step será executado.

Quando o programador vê apenas:

STEP01 RC=0000

toda essa infraestrutura já trabalhou nos bastidores.


23. Alocação de datasets

Antes da execução, o sistema precisa alocar os recursos descritos no JCL.

Exemplo:

//ENTRADA DD DISP=SHR,
//          DSN=EMPRESA.ARQ.ENTRADA

O z/OS verifica elementos como:

  • existência;

  • disponibilidade;

  • catálogo;

  • volume;

  • disposição;

  • compartilhamento;

  • segurança;

  • atributos;

  • conflitos.

Se outro job mantiver um dataset com uso exclusivo, o job atual poderá aguardar.

Por isso, um job pode ficar em estados de espera mesmo antes de iniciar o programa COBOL.


24. O significado de DISP

O parâmetro DISP ajuda a indicar como um dataset será tratado.

Exemplo:

DISP=SHR

Indica compartilhamento.

Outro exemplo:

DISP=OLD

Pode indicar uso exclusivo.

Também é comum:

DISP=(NEW,CATLG,DELETE)

Isso pode significar:

  • criar o dataset;

  • catalogar em término normal;

  • apagar em término anormal.

O JCL participa diretamente da governança dos dados utilizados pelo programa.


25. O loader

Depois que o módulo foi localizado, entra em cena o mecanismo de carga.

O loader coloca o programa no ambiente de memória apropriado.

Ele precisa:

  • localizar o módulo;

  • interpretar sua estrutura;

  • disponibilizar suas seções;

  • resolver elementos necessários em runtime;

  • preparar o ponto de entrada;

  • transferir o controle.

O módulo estava armazenado em disco.

Agora precisa ficar acessível para execução.

Essa passagem é:

Load library
      ↓
Loader
      ↓
Memória
      ↓
Execução

26. O que significa carregar em memória?

Quando dizemos que o programa foi carregado, não significa necessariamente que todo o universo da aplicação foi copiado como um único bloco simples.

O ambiente pode envolver:

  • código executável;

  • áreas de trabalho;

  • runtime COBOL;

  • módulos compartilhados;

  • bibliotecas;

  • buffers;

  • parâmetros;

  • áreas do Language Environment;

  • storage obtido dinamicamente.

O z/OS gerencia memória virtual.

O programa trabalha com endereços virtuais dentro de seu address space.

O sistema operacional administra a relação entre memória virtual, real storage e armazenamento auxiliar.


27. O address space

Um address space é um ambiente de endereçamento no qual programas e tarefas executam.

Um job batch normalmente recebe um address space para sua execução.

Started tasks, regiões CICS, regiões IMS, Db2 e outros subsistemas também possuem seus próprios ambientes.

O address space ajuda a fornecer isolamento.

Um programa em um job não deveria acessar livremente a memória de outro job.

Isso é fundamental para:

  • segurança;

  • estabilidade;

  • confiabilidade;

  • proteção;

  • recuperação.


28. O Language Environment entra em cena

Programas COBOL modernos normalmente utilizam o Language Environment.

Ele fornece serviços comuns para várias linguagens.

Entre suas funções estão:

  • inicialização;

  • passagem de parâmetros;

  • gerenciamento de storage;

  • tratamento de condições;

  • mensagens;

  • dumps;

  • datas;

  • conversões;

  • finalização;

  • interoperabilidade.

Antes de o primeiro parágrafo COBOL realmente executar, o runtime pode precisar preparar o ambiente.

No final, o Language Environment também participa da finalização.

Por isso, muitas falhas aparecem acompanhadas de mensagens iniciadas por:

CEE

29. O programa recebe o controle

Depois da preparação, o controle é transferido para o ponto de entrada do módulo.

Em um programa COBOL, o processamento começa conforme a estrutura gerada pelo compilador.

A lógica da PROCEDURE DIVISION passa a executar.

Exemplo:

       PROCEDURE DIVISION.

           PERFORM INICIALIZAR
           PERFORM PROCESSAR
           PERFORM FINALIZAR

           GOBACK.

Nesse momento, as instruções COBOL já foram transformadas.

A CPU não enxerga:

PERFORM PROCESSAR

Ela enxerga instruções de máquina.


30. A CPU não entende COBOL

A CPU do IBM Z executa instruções da arquitetura.

Ela não interpreta diretamente:

MOVE
READ
COMPUTE
EVALUATE
PERFORM

Esses comandos existiam apenas no fonte.

O compilador transformou a lógica em instruções de máquina.

Portanto:

COBOL → linguagem humana estruturada
Objeto → representação intermediária
Load → módulo executável
CPU → instruções de máquina

Essa abstração permite que o programador pense em regras de negócio, e não em registradores e opcodes durante todo o tempo.


31. A CPU não fica dedicada ao programa

Em um sistema multiprogramado, diversos trabalhos competem por recursos.

O programa não recebe necessariamente uma CPU exclusiva até terminar.

O sistema operacional pode alternar entre unidades de trabalho.

Enquanto um programa está pronto para executar, ele pode receber tempo de processador.

Quando aguarda um recurso, outra tarefa pode utilizar a CPU.

Esse mecanismo permite que milhares de trabalhos coexistam.


32. O dispatcher

O dispatcher é responsável por entregar capacidade de processador a unidades de trabalho elegíveis.

Ele considera prioridades e estados.

Uma tarefa pode estar:

  • executando;

  • pronta;

  • aguardando;

  • bloqueada;

  • suspensa;

  • terminada.

Quando a tarefa está aguardando uma leitura, uma resposta Db2 ou outro recurso, ela não precisa ocupar a CPU.

Outra tarefa pode executar.


33. O papel do WLM

WLM significa Workload Manager.

Ele ajuda o z/OS a gerenciar cargas de trabalho com base em objetivos de serviço.

O WLM trabalha com conceitos como:

  • service classes;

  • goals;

  • importance;

  • performance periods;

  • workload classification;

  • response time;

  • velocity.

Em vez de administrar apenas prioridades fixas, o sistema pode considerar objetivos de negócio.

Por exemplo:

  • uma transação bancária online pode ter meta de resposta rápida;

  • um relatório batch noturno pode possuir janela de horas;

  • um processamento crítico de fechamento pode receber maior importância;

  • uma tarefa de baixa prioridade pode aguardar mais tempo.

O WLM ajuda o sistema a decidir onde a capacidade será mais importante.


34. JES2 não escolhe diretamente a instrução que vai para a CPU

É importante separar responsabilidades.

JES2

Administra jobs, filas, spool e fluxo batch.

Initiator

Seleciona e inicia jobs elegíveis.

z/OS

Gerencia execução, memória, tarefas e recursos.

WLM

Ajuda a orientar objetivos e importância.

Dispatcher

Entrega capacidade de processador às unidades de trabalho.

CPU

Executa instruções de máquina.

Portanto, não é correto dizer simplesmente:

O JES2 executa o COBOL na CPU.

Uma descrição melhor seria:

O JES2 administra o job, o initiator inicia o step, o z/OS prepara o ambiente e o dispatcher permite que a CPU execute as instruções do programa.


35. O programa faz uma leitura

Considere:

           READ ARQ-CLIENTES

Para o programador, é uma única instrução.

Por trás dela, podem participar:

  • runtime COBOL;

  • QSAM ou VSAM;

  • buffers;

  • sistema de arquivos;

  • canais;

  • controladores;

  • armazenamento;

  • cache;

  • memória;

  • interrupções;

  • scheduler;

  • dispositivos.

A aplicação solicita a leitura.

O sistema inicia o acesso.

Enquanto os dados não estão disponíveis, a tarefa pode entrar em espera.

A CPU fica livre para outro trabalho.

Quando a operação termina, a tarefa volta a ficar elegível.


36. Tempo de CPU não é tempo decorrido

Imagine um job que inicia às 01:00 e termina às 01:10.

Tempo decorrido:

10 minutos

Porém, o job pode ter utilizado apenas:

30 segundos de CPU

O restante pode ter sido espera por:

  • leitura de arquivos;

  • escrita;

  • Db2;

  • IMS;

  • Adabas;

  • locks;

  • filas;

  • rede;

  • ENQs;

  • recursos compartilhados;

  • armazenamento.

Por isso:

Elapsed time ≠ CPU time

Essa diferença é essencial em análise de performance.


37. Um programa lento pode não estar consumindo CPU

Quando um job demora, o iniciante pode pensar:

A CPU está lenta.

Mas o problema pode estar em:

  • excesso de I/O;

  • leitura desnecessária;

  • espera por dataset;

  • SQL sem índice;

  • lock Db2;

  • buffer insuficiente;

  • fila MQ;

  • contenção VSAM;

  • acesso IMS;

  • espera por serviço externo;

  • classe inadequada;

  • baixa prioridade.

O diagnóstico exige observar onde o tempo está sendo gasto.


38. Execução de um programa Db2

Um programa Db2 possui pelo menos dois componentes essenciais:

Load module
Package Db2

Durante a execução:

  1. O load é localizado.

  2. O programa inicia.

  3. A interface Db2 é acionada.

  4. A conexão com o subsistema é utilizada.

  5. O package correspondente é localizado.

  6. O SQL é executado.

  7. O Db2 acessa tabelas e índices.

  8. Os dados retornam às host variables.

  9. A SQLCA recebe o resultado.

  10. O programa continua.

Se o load existir, mas o package estiver ausente ou inválido, a execução pode falhar.

O executável COBOL e o artefato Db2 precisam estar alinhados.


39. O Db2 pode fazer o programa esperar

Imagine:

           EXEC SQL
                UPDATE CONTAS
                   SET SALDO = SALDO - :WS-VALOR
                 WHERE CONTA = :WS-CONTA
           END-EXEC.

Se outro processo mantém um lock incompatível, o programa pode esperar.

Durante essa espera, ele não está necessariamente consumindo CPU.

O tempo decorrido aumenta.

O consumo de CPU pode permanecer baixo.

Essa situação reforça a diferença entre processamento e espera.


40. Execução de um programa CICS

Um programa CICS normalmente não é iniciado por um novo job para cada transação.

A região CICS já está ativa como um ambiente de longa duração.

Quando uma transação é solicitada:

  1. O CICS identifica a transação.

  2. Verifica segurança.

  3. Localiza a definição.

  4. Identifica o programa inicial.

  5. Cria uma task.

  6. Carrega o módulo, se necessário.

  7. Entrega o controle.

  8. Processa comandos EXEC CICS.

  9. Gerencia recursos.

  10. Finaliza ou suspende a task.

O JES2 pode ter participado da inicialização da região CICS.

Porém, cada transação não é um job batch independente.


41. A biblioteca DFHRPL

Programas CICS precisam estar disponíveis em bibliotecas acessíveis à região.

Tradicionalmente, a concatenação DFHRPL participa desse processo.

Se o módulo novo foi gravado em uma biblioteca que não está acessível ao CICS, a região pode continuar usando outro load ou não localizar o programa.

Mesmo quando a biblioteca está correta, o CICS pode manter uma versão já carregada.

Pode ser necessário realizar ações como:

  • new copy;

  • phase-in;

  • refresh;

  • atualização do recurso;

  • implantação controlada.

Isso explica por que recompilar um programa CICS não garante que a nova versão já esteja em uso.


42. Reentrância e concorrência no CICS

Múltiplas tasks podem utilizar o mesmo programa.

Por isso, o módulo precisa ser adequado ao ambiente transacional.

Programas reentrantes podem compartilhar código de forma segura, desde que suas áreas mutáveis sejam tratadas corretamente.

Se um programa armazenar estado compartilhado de maneira inadequada, duas transações podem interferir entre si.

O resultado pode ser:

  • dados trocados;

  • corrupção;

  • informações de um cliente em outra transação;

  • falhas imprevisíveis.

O CICS não é apenas uma forma de executar COBOL mais rapidamente.

Ele é um ambiente de alta concorrência e controle transacional.


43. Execução de um programa IMS

Programas IMS podem executar em regiões específicas, como:

  • MPP;

  • BMP;

  • batch DL/I.

O módulo COBOL precisa ser chamado com o ambiente correto.

Também dependem de artefatos como:

  • PSB;

  • PCB;

  • DBD;

  • definições IMS;

  • bibliotecas;

  • parâmetros.

Durante a execução, o programa faz chamadas DL/I.

O IMS navega pelos bancos hierárquicos ou filas de mensagens.

A PCB informa o resultado.

O COBOL continua executando a regra de negócio.


44. Execução de um programa Adabas

Um programa COBOL Adabas utiliza interfaces de comunicação para enviar comandos ao Nucleus.

Durante a execução:

  1. O módulo COBOL é carregado.

  2. A interface Adabas é acionada.

  3. Control block e buffers são fornecidos.

  4. A solicitação chega ao Nucleus.

  5. O Adabas acessa o arquivo.

  6. Os dados retornam ao programa.

  7. O response code é analisado.

Assim como no Db2 e IMS, o programa pode aguardar a resposta do subsistema.

O tempo de CPU não representa sozinho todo o tempo da operação.


45. Chamadas dinâmicas durante a execução

Na terceira parte, vimos chamadas dinâmicas.

Exemplo:

       01  WS-PROGRAMA          PIC X(08).

           MOVE 'PGMVALID'
             TO WS-PROGRAMA

           CALL WS-PROGRAMA
                USING AREA-DADOS.

Nesse caso, PGMVALID será procurado durante a execução.

O sistema precisa localizar o módulo nas bibliotecas disponíveis.

Se não encontrar, poderá ocorrer falha.

Isso significa que um programa pode iniciar corretamente e falhar somente quando chega a determinada chamada.


46. Carregamento de subprogramas

Quando o programa principal chama um módulo dinâmico, podem participar:

  • Language Environment;

  • loader;

  • bibliotecas de carga;

  • cache de módulos;

  • mecanismos do subsistema;

  • regras de compartilhamento.

O subprograma pode ser carregado e mantido disponível conforme o ambiente.

Em CICS, o gerenciamento pertence à região.

Em batch, o runtime e o z/OS participam da carga.


47. CANCEL em COBOL

Em determinados cenários, o COBOL possui a instrução:

           CANCEL 'PGMVALID'

Ela pode influenciar o estado de um programa chamado dinamicamente.

O uso precisa ser compreendido com cuidado.

Nem sempre é necessário ou desejável cancelar módulos após cada chamada.

Isso pode afetar:

  • desempenho;

  • reinicialização;

  • estado;

  • reutilização;

  • comportamento de subprogramas.

O Padawan não deve utilizar CANCEL apenas por costume.

Precisa entender o ciclo de vida do módulo.


48. O programa termina

Um programa pode finalizar com:

STOP RUN

ou:

GOBACK

O comportamento depende do contexto.

Em um programa principal batch, STOP RUN encerra a execução do run unit.

Em subprogramas, GOBACK é frequentemente mais apropriado, pois devolve o controle ao chamador.

No final, o runtime e o z/OS precisam:

  • encerrar o programa;

  • fechar recursos;

  • registrar condições;

  • liberar storage;

  • devolver return code;

  • finalizar o step.


49. RETURN-CODE

COBOL permite definir o código de retorno do programa.

Exemplo:

           MOVE 8 TO RETURN-CODE
           GOBACK.

O JCL e o sistema podem utilizar esse valor para controlar steps posteriores.

Exemplo:

//STEP02 EXEC PGM=PGMREL01,
//        COND=(4,LT)

A lógica de condições JCL precisa ser estudada com cuidado, pois sua leitura pode parecer invertida para iniciantes.

O importante aqui é entender:

O programa pode comunicar ao job se terminou com sucesso, advertência ou falha.


50. Return code não é abend

Um return code é uma finalização controlada.

Exemplo:

RC=0000
RC=0004
RC=0008
RC=0012

Um abend indica término anormal.

Exemplos:

S0C7
S0C4
S806
S013
Uxxxx

Diferença conceitual:

Return code → o programa terminou e devolveu um resultado
Abend       → a execução foi interrompida de forma anormal

Um programa pode escolher retornar RC=8 após detectar uma condição de negócio.

Isso não é o mesmo que sofrer um abend.


51. Exemplos de abends

S0C7

Frequentemente associado a operação numérica com dados inválidos.

S0C4

Pode estar relacionado a acesso inválido à memória ou endereço incorreto.

S806

Módulo executável não encontrado.

S013

Pode estar relacionado a problemas com dataset, DCB ou abertura.

User Abend

Pode ser produzido pelo próprio programa ou por componentes da aplicação.

O diagnóstico precisa combinar:

  • mensagem;

  • dump;

  • step;

  • módulo;

  • offset;

  • dados;

  • contexto.


52. O dump

Quando um programa termina anormalmente, pode ser produzido um dump.

Ele ajuda a investigar:

  • módulo;

  • instrução;

  • registradores;

  • áreas de memória;

  • call stack;

  • condição;

  • offset;

  • campos;

  • runtime.

O dump não deve ser encarado como um amontoado de caracteres incompreensíveis.

Ele é uma fotografia técnica do momento da falha.

Com listagem de compilação, map e ferramentas adequadas, o profissional pode relacionar o offset à instrução COBOL correspondente.


53. O job pode ter vários steps

Exemplo:

//STEP01 EXEC PGM=PGMEXTR
//STEP02 EXEC PGM=PGMVALD
//STEP03 EXEC PGM=PGMREL

Um job pode representar uma cadeia.

STEP01 → extrai dados
STEP02 → valida
STEP03 → gera relatório

Cada step possui:

  • programa;

  • DD statements;

  • return code;

  • recursos;

  • condições.

Se um step falhar, os próximos podem ou não executar conforme as regras do JCL.


54. Datasets temporários entre steps

Um step pode produzir um dataset temporário:

//ARQTEMP DD DSN=&&TEMP,
//           DISP=(NEW,PASS),
//           UNIT=SYSDA,
//           SPACE=(CYL,(5,5))

Outro step pode recebê-lo:

//ENTRADA DD DSN=&&TEMP,
//           DISP=(OLD,DELETE)

Esse mecanismo permite conectar etapas.

Programa A
   ↓
Dataset temporário
   ↓
Programa B

O dataset existe durante o job e pode ser apagado ao final.


55. O job termina

Depois que todos os steps elegíveis terminam:

  • os recursos são liberados;

  • os datasets recebem disposição final;

  • as saídas permanecem no spool;

  • o JES2 registra o término;

  • o usuário pode consultar resultados.

O job pode aparecer como:

CC 0000
CC 0004
CC 0008
ABEND S0C7
JCL ERROR

Cada resultado aponta para uma fase diferente.


56. JCL ERROR

Um job pode falhar antes de executar qualquer programa.

Exemplos:

  • sintaxe JCL incorreta;

  • parâmetro inválido;

  • procedure não encontrada;

  • dataset mal definido;

  • DD duplicado;

  • erro de referência;

  • nome inválido.

Nesse caso, não adianta revisar o COBOL.

O programa nem chegou a começar.

Novamente, diagnóstico significa identificar a fase.


57. A cadeia completa de execução

Vamos reunir tudo.

Load module na LOADLIB
          ↓
JCL é submetido
          ↓
JES2 recebe o job
          ↓
Job entra no spool
          ↓
JCL é interpretado
          ↓
Job aguarda na fila
          ↓
Initiator seleciona o job
          ↓
DD statements são alocados
          ↓
Módulo é localizado
          ↓
Loader carrega o programa
          ↓
Language Environment inicia o runtime
          ↓
Controle chega à PROCEDURE DIVISION
          ↓
Dispatcher entrega CPU
          ↓
Programa acessa QSAM, VSAM ou subsistemas
          ↓
Pode alternar entre execução e espera
          ↓
Programa termina
          ↓
Return code é registrado
          ↓
Saída volta ao spool
          ↓
Usuário consulta no SDSF

Essa é a verdadeira jornada do executável.


58. Da primeira linha ao último ciclo de CPU

Agora podemos visualizar a série completa.

Regra de negócio
       ↓
Fonte COBOL
       ↓
Copybooks
       ↓
Tradução CICS
       ↓
Processamento Db2
       ↓
Interfaces IMS ou Adabas
       ↓
Compilação
       ↓
Código objeto
       ↓
Binder
       ↓
Load module
       ↓
Load library
       ↓
JCL ou transação
       ↓
JES2 ou subsistema online
       ↓
Loader
       ↓
Memória
       ↓
Dispatcher
       ↓
CPU
       ↓
Dados e resultados

O programa não nasce quando é executado.

Sua história começou muito antes.


59. Uma analogia com um aeroporto

Imagine um aeroporto internacional.

O load module é o avião pronto no hangar.

O JCL é o plano de voo.

A load library é o hangar onde a aeronave está estacionada.

O JES2 é o centro que recebe planos de voo e organiza partidas.

O spool é o sistema onde ficam armazenados documentos, ordens e registros.

O initiator é a equipe que autoriza e prepara o voo.

Os DD statements representam combustível, bagagem, tripulação e rotas.

O loader retira o avião do hangar e o prepara para operar.

O z/OS é toda a administração do aeroporto.

O WLM ajuda a decidir quais voos são mais prioritários.

O dispatcher controla o uso das pistas.

A CPU é o motor que produz o movimento.

QSAM é como uma fila de cargas processadas em sequência.

VSAM é um depósito no qual uma caixa pode ser localizada por código.

Db2, IMS e Adabas são grandes centros especializados de dados.

O programa COBOL é o plano operacional que define o que deve acontecer durante a viagem.

Se uma única parte falhar, o voo pode atrasar, aguardar ou ser cancelado.


60. Diagnóstico por fase

Quando surgir um problema, pergunte em qual fase ele ocorreu.

O JCL foi aceito?

Se não, pode ser JCL ERROR.

O job iniciou?

Se não, pode estar aguardando classe, initiator ou recurso.

Os datasets foram alocados?

Se não, pode haver conflito, catálogo ou segurança.

O programa foi localizado?

Se não, pode ocorrer S806.

O programa iniciou?

Se sim, analise mensagens e runtime.

O arquivo abriu?

Verifique FILE STATUS.

O SQL executou?

Verifique SQLCODE e SQLSTATE.

O CICS respondeu?

Verifique RESP e RESP2.

O IMS retornou?

Verifique o status da PCB.

O Adabas respondeu?

Verifique o response code.

O programa terminou normalmente?

Verifique return code ou abend.

Essa sequência reduz a investigação aleatória.


61. Checklist de execução batch

Antes de executar, verifique:

  • O programa está na load library correta?

  • A STEPLIB aponta para essa biblioteca?

  • A ordem das bibliotecas está correta?

  • O membro possui o nome usado em PGM=?

  • Todos os DDNAMEs esperados estão presentes?

  • Os datasets existem?

  • O DISP é adequado?

  • Os atributos dos arquivos correspondem ao programa?

  • O usuário possui autorização?

  • O package Db2 está disponível?

  • O PSB IMS é o correto?

  • As interfaces Adabas estão acessíveis?

  • Os arquivos VSAM estão disponíveis?

  • Existe espaço para datasets de saída?

  • As condições entre steps estão corretas?

  • O job está na classe adequada?


62. Checklist depois da execução

Depois do job:

  • Qual foi o resultado geral?

  • Qual step falhou?

  • Houve return code ou abend?

  • O programa correto foi carregado?

  • Qual versão do load foi utilizada?

  • O arquivo foi realmente processado?

  • Quantos registros foram lidos?

  • Quantos foram gravados?

  • Houve rejeições?

  • O SQL retornou erros?

  • O relatório foi produzido?

  • O dataset de saída foi catalogado?

  • Existem mensagens no JESYSMSG?

  • Foi gerado dump?

  • O tempo foi de CPU ou espera?

  • A execução pode ser repetida com segurança?


63. Reprocessamento

Em ambiente corporativo, uma pergunta essencial é:

O job pode ser executado novamente?

Imagine que o programa debitou cem contas e sofreu abend na conta cento e um.

Se for reiniciado desde o começo, poderá debitar novamente as primeiras cem.

Por isso, aplicações batch precisam considerar:

  • checkpoints;

  • commits;

  • arquivos de controle;

  • chaves de reinício;

  • idempotência;

  • rollback;

  • recuperação;

  • reconciliação.

Compilar e executar é apenas parte da engenharia.

Executar com segurança é o verdadeiro desafio.


64. Commit e unidade de trabalho

Em programas Db2, o COMMIT confirma alterações.

Exemplo:

           EXEC SQL
                COMMIT
           END-EXEC.

Se o programa atualiza milhões de linhas e faz commit somente no final, pode provocar:

  • locks prolongados;

  • consumo de log;

  • dificuldade de recuperação;

  • impacto em concorrência;

  • rollback gigantesco.

Se fizer commit a cada registro, pode gerar:

  • excesso de overhead;

  • unidades muito pequenas;

  • dificuldade de garantir consistência lógica.

O tamanho da unidade de trabalho precisa equilibrar:

  • integridade;

  • desempenho;

  • recuperação;

  • concorrência.


65. O JES2 não é apenas um entregador de jobs

Embora sua função seja diferente da CPU, o JES2 é essencial para a operação.

Ele fornece uma infraestrutura confiável para:

  • receber trabalhos;

  • manter filas;

  • separar classes;

  • priorizar;

  • reter saída;

  • reexecutar;

  • integrar impressão;

  • fornecer rastreabilidade;

  • apoiar operação.

Sem esse gerenciamento, milhares de jobs batch disputariam recursos sem coordenação.

O JES2 transforma a execução batch em um processo industrial.


66. O mainframe não executa um programa isolado

Quando PGMCLI01 roda, ele depende de um ecossistema.

JCL
JES2
Spool
Initiator
z/OS
Loader
Language Environment
WLM
Dispatcher
CPU
Storage
QSAM
VSAM
Db2
CICS
IMS
Adabas
Segurança
Catálogo
Operação

O iniciante olha o código.

O especialista enxerga todos os contratos ao redor.


67. O papel da segurança

Antes de abrir um dataset ou acessar uma biblioteca, o sistema pode verificar autorização.

Podem estar envolvidos:

  • RACF;

  • SAF;

  • perfis;

  • grupos;

  • permissões;

  • acessos de leitura;

  • atualização;

  • execução;

  • controle de subsistemas.

Um programa pode existir e estar corretamente configurado, mas falhar porque o usuário ou started task não possui autorização.

Segurança não é uma camada colocada depois.

Ela participa da execução.


68. O catálogo

Datasets catalogados podem ser localizados por nome.

Quando o JCL informa:

DSN=EMPRESA.DADOS.CLIENTES

o sistema pode consultar o catálogo para descobrir onde o dataset está armazenado.

Sem catálogo ou volume informado, a localização pode falhar.

O catálogo funciona como um diretório de datasets.

Ele não contém necessariamente os dados do arquivo.

Contém informações para localizá-lo.


69. A diferença entre dataset e arquivo lógico

No COBOL:

SELECT ARQ-CLIENTES

Esse é o nome de arquivo dentro do programa.

No JCL:

//CLIENTES DD ...

Esse é o DDNAME.

No sistema:

EMPRESA.DADOS.CLIENTES

Esse é o nome do dataset.

Portanto:

ARQ-CLIENTES → nome COBOL
CLIENTES     → DDNAME
EMPRESA.DADOS.CLIENTES → dataset

Esses três nomes podem ser diferentes.

Compreender essa cadeia evita muitos erros.


70. O programa executa em uma LPAR

Ambientes IBM Z podem ser divididos em LPARs.

LPAR significa Logical Partition.

Cada LPAR funciona como um sistema lógico separado, com seus próprios:

  • z/OS;

  • recursos;

  • configurações;

  • subsistemas;

  • workloads;

  • bibliotecas;

  • segurança.

O mesmo mainframe físico pode hospedar várias LPARs.

Por isso, um load presente em uma LPAR de teste não está automaticamente disponível em produção.


71. PR/SM e processadores lógicos

A virtualização do IBM Z permite que recursos físicos sejam compartilhados entre partições.

O PR/SM gerencia essa divisão.

O z/OS enxerga processadores lógicos disponíveis para sua LPAR.

O dispatcher entrega trabalho a esses processadores conforme a capacidade e as regras.

O programa COBOL não precisa conhecer esses detalhes para executar.

Mas o especialista em performance precisa compreender que existe uma cadeia entre:

Programa
z/OS
Processador lógico
LPAR
PR/SM
Processador físico

72. Tipos de processadores

No ecossistema IBM Z, diferentes categorias de processadores podem ser utilizadas conforme a carga.

Entre elas, podem aparecer conceitos como:

  • CP;

  • zIIP;

  • IFL;

  • ICF;

  • SAP.

Um programa COBOL tradicional executa principalmente em processadores gerais, mas determinados componentes ou workloads podem utilizar processadores especializados.

O Padawan não precisa dominar todos neste primeiro momento.

Mas deve compreender que “a CPU” no mainframe é um universo mais sofisticado do que uma única peça física.


73. O resultado do programa

Depois de processar, o programa pode produzir:

  • dataset;

  • relatório;

  • atualização Db2;

  • registros VSAM;

  • mensagem;

  • saída no spool;

  • retorno a uma transação;

  • atualização IMS;

  • operação Adabas;

  • código de retorno.

O resultado precisa ser validado.

Um RC=0 não garante que o conteúdo do relatório esteja correto.

Assim como uma compilação bem-sucedida não garante lógica correta, uma execução normal não garante resultado de negócio correto.


74. Auditoria e rastreabilidade

Sistemas críticos precisam registrar:

  • quem executou;

  • quando;

  • qual versão;

  • quais arquivos;

  • quais parâmetros;

  • quantos registros;

  • quais erros;

  • quais retornos;

  • quais atualizações;

  • qual tempo;

  • qual consumo.

Isso permite:

  • investigação;

  • conformidade;

  • reconciliação;

  • recuperação;

  • análise de capacidade;

  • melhoria contínua.

O mainframe não é apenas uma máquina rápida.

É uma plataforma de controle.


75. O mapa completo das quatro partes

Parte I — Fonte e copybooks

Regra de negócio
      ↓
Fonte COBOL
      ↓
Copybooks

Parte II — Preparação dos subsistemas

EXEC CICS
EXEC SQL
IMS
Adabas

Parte III — Construção do executável

Compilação
      ↓
Código objeto
      ↓
Binder
      ↓
Load module

Parte IV — Execução

JCL
      ↓
JES2
      ↓
Initiator
      ↓
Loader
      ↓
Memória
      ↓
CPU
      ↓
Dados e resultados

Agora a jornada está completa.


76. Conselhos finais ao Programador COBOL Padawan

Nunca pense no programa apenas como um fonte.

Pergunte sempre:

  • Onde está o load?

  • Quem o gerou?

  • Quais copybooks foram utilizados?

  • Qual procedure foi executada?

  • Qual load library está sendo pesquisada?

  • Quais DDNAMEs o programa espera?

  • Quais datasets foram alocados?

  • O programa está esperando CPU ou I/O?

  • Qual subsistema está envolvido?

  • Qual código de retorno precisa ser analisado?

  • A execução é reiniciável?

  • O resultado é reconciliável?

  • A versão é rastreável?

  • O processo é seguro?

Essas perguntas são mais importantes do que decorar comandos isolados.


Conclusão

Nesta quarta parte, acompanhamos o programa COBOL desde a load library até a execução real.

Vimos que o JCL solicita ao sistema a execução do módulo.

A STEPLIB e outras bibliotecas ajudam o z/OS a localizar o executável.

Os DD statements conectam os nomes lógicos do programa aos datasets físicos.

QSAM permite o processamento sequencial.

VSAM oferece organizações e acessos mais estruturados, incluindo acesso por chave.

O JES2 recebe o job, administra filas e mantém entradas e saídas no spool.

O initiator seleciona o trabalho e inicia seus steps.

O loader coloca o módulo no ambiente de memória.

O Language Environment prepara o runtime.

O WLM ajuda a orientar objetivos de serviço.

O dispatcher entrega capacidade de processador.

A CPU executa as instruções de máquina produzidas pelo compilador.

Durante esse processo, o programa alterna entre uso de CPU e espera por arquivos, bancos, locks, mensagens e outros recursos.

Por isso, tempo de CPU e tempo total decorrido são conceitos diferentes.

Também aprendemos que CICS, Db2, IMS e Adabas possuem seus próprios ambientes de execução, mas todos dependem do mesmo princípio:

O COBOL executa a regra de negócio, enquanto o z/OS e seus subsistemas administram os recursos necessários.

Ao final dessa série, o Programador COBOL Padawan deixa de enxergar apenas:

       STOP RUN.

e passa a enxergar toda a arquitetura ao redor:

Fonte
Copybook
Tradutor
Pré-compilador
Compilador
Objeto
Binder
Load
JCL
JES2
Spool
Loader
Memória
CPU
Dados
Resultado

É essa visão que separa quem apenas altera linhas de código de quem realmente compreende o funcionamento de uma aplicação corporativa no IBM Z.


Palavra final do Mestre Bellacosa

Quando alguém disser:

“Esse programa só lê um arquivo e grava outro”,

lembre-se de que por trás dessa frase existem bibliotecas, contratos, compiladores, módulos, filas, processadores, subsistemas, segurança, memória, canais de I/O e décadas de engenharia.

No mainframe, nada simplesmente acontece.

Cada execução é preparada, controlada, registrada e monitorada.

O Padawan vê uma linha de JCL.

O especialista vê uma cadeia completa de responsabilidades.

O Padawan vê um READ.

O especialista vê acesso lógico, buffer, I/O, espera e retorno.

O Padawan vê um RC=0.

O especialista pergunta se o resultado está correto, íntegro, rastreável e recuperável.

Essa é a verdadeira evolução no mundo COBOL.

Não basta saber escrever programas.

É preciso entender como eles nascem, como são transformados, como são carregados e como convivem com toda a arquitetura do IBM Z.

“O código-fonte expressa a intenção. A compilação constrói a forma. A linkedição reúne as partes. O JES2 organiza a jornada. O z/OS governa os recursos. E a CPU transforma regras de negócio em realidade.”

Laboratório Forense Bellacosa Mainframe

CSI z/OS: Da Compilação à Execução de um Programa COBOL

Cinco arquivos de evidências revelam como o código-fonte COBOL atravessa copybooks, CICS, Db2, IMS, compilação, Binder, load library, JCL, JES2, memória e CPU até produzir um resultado no IBM Z.

CASO: COBOL-2022-EXEC EVIDÊNCIAS: 05 ARTIGOS AMBIENTE: IBM Z / z/OS STATUS: ARQUIVO ABERTO

Esta investigação técnica apresenta o ciclo completo de um programa COBOL no mainframe IBM Z. A série explica o nascimento do código-fonte, o uso de copybooks, a preparação de comandos CICS e SQL, a geração de código objeto, a atuação do Binder, o armazenamento em load libraries e a execução por JCL, JES2, loader, Language Environment, dispatcher e CPU. Selecione uma evidência abaixo para ler o artigo correspondente dentro do visualizador.

Evidência selecionada Parte I — Código-fonte, bibliotecas e copybooks
Processando evidência digital...

Laudo preliminar: o nascimento do programa

A primeira parte acompanha a transformação da regra de negócio em código-fonte COBOL, explica o papel das bibliotecas e mostra por que copybooks funcionam como contratos de dados compartilhados entre programas.

COBOL código-fonte copybook SYSLIB IBM Z
Bellacosa Mainframe Forensic Lab · Nenhum byte é inocente até que os logs provem o contrário.
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...