1. O que é JCL?

JCL significa Job Control Language — Linguagem de Controle de Jobs. É uma linguagem de script própria do mainframe IBM (z/OS) usada para submeter e controlar a execução de programas em modo batch (em lote).

Com JCL você instrui o sistema operacional sobre:

  • Qual programa ou utilitário executar
  • Quais arquivos (datasets) de entrada e saída usar
  • Quanta memória e tempo de CPU reservar
  • O que fazer se um passo falhar
  • Quem é o responsável pelo job e qual a sua prioridade

🦕 Analogia — JCL é como uma ordem de serviço

Imagine que você é gerente e precisa mandar um funcionário (o programa COBOL) executar uma tarefa. Você não chega do nada e grita "vai lá fazer isso". Você preenche uma ordem de serviço: "Fulano, processe o arquivo X, gere o relatório Y, use no máximo 2 horas, e se der errado me avise." O JCL é essa ordem de serviço — formal, estruturada, e o mainframe não executa nada sem ela.

2. O papel do JES

Quando você submete um JCL, quem o recebe não é o programa diretamente — é o JES (Job Entry Subsystem), um componente do z/OS que gerencia a fila de jobs:

ComponenteFunção
JES2Versão mais comum — processa cada step de forma independente
JES3Versão avançada — controla scheduling global de múltiplos sistemas

O fluxo de execução é:

FluxoCiclo de vida de um job
  Você escreve o JCL  Submete via SUBMIT (ISPF) ou FTP  JES2/JES3 recebe, valida e coloca na fila de INPUT  Job é selecionado para execução (baseado em CLASS e PRIORITY)  z/OS executa cada STEP sequencialmente  Output vai para spool (SYSOUT)  Você visualiza resultado no SDSF/IOF

3. Batch vs. Online

JCL é exclusivo do mundo batch. É importante entender a diferença:

Batch (JCL)Online (CICS)
Quando roda?Agendado ou sob demandaEm tempo real, quando o usuário aciona
Interação?Nenhuma — roda sem ninguém olhandoDiálogo com terminal ou API
Volume?Milhões de registrosPoucos registros por transação
ExemploFechamento mensal de contasConsulta de saldo no caixa eletrônico

✅ Quando os bancos rodam batch?

A maioria dos grandes processamentos batch bancários roda à noite — fechamento de dia, compensação de cheques, cálculo de juros, extrato mensal. Você já percebeu que alguns serviços bancários ficam indisponíveis de madrugada? É o mainframe processando o batch do dia.

4. Estrutura de um Job

Todo JCL tem a mesma estrutura básica:

JCLEstrutura geral de um job
//------------------------------------------------------------
// JOB CARD — obrigatório, aparece uma única vez
//------------------------------------------------------------
//MEUJOB   JOB  (ACCT001),'LADY COBOL',
//             CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID

//------------------------------------------------------------
// STEP 1 — EXEC define o programa a executar
//------------------------------------------------------------
//STEP01   EXEC  PGM=CALC-SAL

// DDs do Step 1 — datasets de entrada e saída
//STEPLIB  DD   DSN=PROD.LOAD.LIBRARY,DISP=SHR
//ENTRADA  DD   DSN=PROD.FUNC.DATA,DISP=SHR
//RELAT    DD   SYSOUT=*
//SYSOUT   DD   SYSOUT=*

//------------------------------------------------------------
// STEP 2 — segundo passo do mesmo job
//------------------------------------------------------------
//STEP02   EXEC  PGM=IEBGENER
//SYSUT1   DD   DSN=PROD.RELAT.SAIDA,DISP=SHR
//SYSUT2   DD   SYSOUT=*
//SYSIN    DD   DUMMY
//SYSPRINT DD   SYSOUT=*

💗 Resumo visual da estrutura

1 JOB → identificação global do trabalho
1 a 255 STEPs → cada EXEC é um passo
1 a 3273 DDs por STEP → cada DD é um arquivo/recurso

Um job é como uma lista de tarefas: o JOB é o título da lista, cada EXEC é uma tarefa, e cada DD é um "material necessário" para aquela tarefa.

5. Formato de colunas

Assim como o COBOL, o JCL tem um formato de colunas herdado dos cartões perfurados:

ColunasConteúdoObrigatório?
1–2// — delimitador de statement JCLSim
3–10Nome do statement (job, step ou DDname)Depende
11Espaço obrigatório (separador)Sim
12–15Tipo: JOB, EXEC ou DDSim
16+Parâmetros do statementVaria
72–80Número de sequência (ignorado pelo sistema)Não

⚠️ Comentários em JCL

Uma linha começando com //* é um comentário e é ignorada pelo JES. Use para documentar o job:
//* ESTE JOB PROCESSA A FOLHA DE PAGAMENTO MENSAL

Não confunda com /* (sem o segundo /), que é o delimitador de fim de dados inline (SYSIN).

6. Tipos de statements

StatementSintaxePara que serve
JOB//nome JOB paramsInicia o job, define configurações globais
EXEC//nome EXEC PGM=xxxExecuta um programa ou procedure
DD//nome DD paramsDefine datasets de entrada/saída
Comentário//* textoDocumentação, ignorado pelo sistema
Nulo//Delimita fim do job ou de dados SYSIN
Delimitador/*Fim de dados inline (in-stream data)

7. Seu primeiro JOB

Veja um JCL completo e funcional para executar um programa COBOL simples, com comentários explicando cada linha:

JCLPRIMJOB — job completo comentado
//*============================================================*
//* JOB   : PRIMJOB                                            *
//* FUNCAO: Executa programa CALC-SAL e exibe relatorio        *
//*============================================================*

//* ---- JOB CARD ---- *
//PRIMJOB  JOB  (CONTA01,DEPTO),     * conta e departamento
//             'LADY COBOL',         * nome do programador
//             CLASS=A,             * classe de execução
//             MSGCLASS=X,          * classe do output de log
//             MSGLEVEL=(1,1),       * mostra todos os logs
//             NOTIFY=&SYSUID        * avisa quando terminar

//* ---- STEP 1: executa o programa COBOL ---- *
//STEP01   EXEC  PGM=CALC-SAL

//* Load library onde está o programa compilado
//STEPLIB  DD   DSN=PROD.LOAD.LIB,DISP=SHR

//* Arquivo de entrada (funcionarios)
//ENTRADA  DD   DSN=PROD.FUNC.DADOS,DISP=SHR

//* Saída do relatório para impressora (spool)
//RELAT    DD   SYSOUT=*

//* Mensagens do sistema
//SYSOUT   DD   SYSOUT=*

//* ---- Fim do job ---- *
//

🟣 &SYSUID — variável de sistema

&SYSUID é uma variável automática do JCL que contém o ID do usuário que submeteu o job. NOTIFY=&SYSUID manda uma mensagem para o terminal do usuário quando o job termina — essencial em ambientes de desenvolvimento para não ficar consultando manualmente o SDSF. Em produção, o NOTIFY normalmente aponta para um ID de operação ou é omitido.