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:
| Componente | Função |
|---|---|
| JES2 | Versão mais comum — processa cada step de forma independente |
| JES3 | Versão avançada — controla scheduling global de múltiplos sistemas |
O fluxo de execução é:
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 demanda | Em tempo real, quando o usuário aciona |
| Interação? | Nenhuma — roda sem ninguém olhando | Diálogo com terminal ou API |
| Volume? | Milhões de registros | Poucos registros por transação |
| Exemplo | Fechamento mensal de contas | Consulta 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:
//------------------------------------------------------------ // 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:
| Colunas | Conteúdo | Obrigatório? |
|---|---|---|
| 1–2 | // — delimitador de statement JCL | Sim |
| 3–10 | Nome do statement (job, step ou DDname) | Depende |
| 11 | Espaço obrigatório (separador) | Sim |
| 12–15 | Tipo: JOB, EXEC ou DD | Sim |
| 16+ | Parâmetros do statement | Varia |
| 72–80 | Nú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
| Statement | Sintaxe | Para que serve |
|---|---|---|
| JOB | //nome JOB params | Inicia o job, define configurações globais |
| EXEC | //nome EXEC PGM=xxx | Executa um programa ou procedure |
| DD | //nome DD params | Define datasets de entrada/saída |
| Comentário | //* texto | Documentaçã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:
//*============================================================* //* 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.