1. Estrutura do JCL para IDCAMS

O IDCAMS é invocado como um programa batch comum. Seus comandos vêm no DD SYSIN e os resultados saem em SYSPRINT.

JCL
//MYJOB    JOB (ACCT),'IDCAMS',CLASS=A,MSGCLASS=X
//STEP1    EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
  DEFINE CLUSTER                             -
         (NAME(PROD.CLIENTES.KSDS)           -
          CYLINDERS(10 2)                    -
          RECORDSIZE(200 200)                -
          INDEXED                            -
          KEYS(8 0)                          -
          FREESPACE(20 10)                   -
          SHAREOPTIONS(2 3))                 -
         DATA                               -
         (NAME(PROD.CLIENTES.KSDS.DATA)     -
          CISZ(4096))                        -
         INDEX                              -
         (NAME(PROD.CLIENTES.KSDS.INDEX)    -
          CISZ(512))
  IF LASTCC = 0 THEN                         -
     SET MAXCC = 0
/*
✅ Continuação de linha
O hífen no final da linha é obrigatório para continuar um comando IDCAMS. Sem ele, o IDCAMS interpreta a próxima linha como um novo comando. O ponto final encerra o comando implicitamente quando não há hífen.

Vários comandos podem aparecer no mesmo SYSIN, executados em sequência:

SYSIN — múltiplos comandos
  DELETE PROD.CLIENTES.KSDS CLUSTER
  IF LASTCC LE 8 THEN DO
    DEFINE CLUSTER ...
    REPRO ...
  END
🦕 Analogia
Pense no SYSIN do IDCAMS como um script SQL: você lista vários comandos em sequência, o utilitário executa um por um, e pode condicionar a execução com IF/THEN/ELSE baseado no código de retorno do comando anterior.

2. DEFINE CLUSTER em detalhe

O DEFINE CLUSTER cria o dataset VSAM no catálogo e aloca espaço. Para um KSDS, você define três componentes: o cluster (envelope lógico), o DATA (registros) e o INDEX (árvore B+ de chaves).

DEFINE CLUSTER — KSDS completo
  DEFINE CLUSTER                              -
         (NAME(PROD.CONTAS.KSDS)             -
          CYLINDERS(20 5)                    -
          RECORDSIZE(300 300)                -
          INDEXED                            -
          KEYS(10 0)                         -
          FREESPACE(25 10)                   -
          SHAREOPTIONS(2 3)                  -
          VOLUMES(VOL001)                    -
          CATALOG(UCAT.PROD))               -
         DATA                               -
         (NAME(PROD.CONTAS.KSDS.DATA)       -
          CISZ(4096))                        -
         INDEX                              -
         (NAME(PROD.CONTAS.KSDS.INDEX)      -
          CISZ(512))

Parâmetros do cluster

ParâmetroValor exemploSignificado
NAME PROD.CONTAS.KSDS Nome do dataset no catálogo (até 44 chars)
CYLINDERS (20 5) Alocação primária (20 cil.) e secundária (5 cil.)
TRACKS (500 100) Alternativa a CYLINDERS; menor granularidade
KILOBYTES (10240 2048) Alocação em KB; útil para datasets pequenos
RECORDSIZE (300 300) Tamanho médio e máximo do registro em bytes
INDEXED Define como KSDS (padrão quando KEYS é especificado)
KEYS (10 0) Comprimento da chave (10) e offset dentro do registro (0)
FREESPACE (25 10) 25% livre em cada CI novo, 10% dos CIs de cada CA ficam vazios
SHAREOPTIONS (2 3) Cross-region (2) e cross-system (3) sharing
VOLUMES VOL001 Volume DASD específico (opcional)
CATALOG UCAT.PROD User catalog de destino (omitir = catálogo padrão)

SHAREOPTIONS explicado

SHAREOPTIONS(cross-region cross-system) controla quantos jobs/sistemas podem abrir o dataset simultaneamente:

ValorCross-regionCross-system (sysplex)
11 escritor OU N leitores
2N leitores OU 1 escritor + N leitores
3N escritores (sem controle)Sem serialização entre sistemas
4N escritores (sem controle)Sem serialização entre sistemas
⚠️ Cuidado com SHAREOPTIONS(3 3)
Muito comum em produção para permitir acesso concorrente CICS + batch, mas não há serialização de registro — é responsabilidade da aplicação garantir integridade. SHAREOPTIONS(2 3) é mais seguro: permite leituras simultâneas mas serializa escritas dentro do mesmo sistema.

Parâmetros do componente DATA

DATA — parâmetros opcionais
         DATA                               -
         (NAME(PROD.CONTAS.KSDS.DATA)       -
          CISZ(4096)                         -
          BUFFERSPACE(32768)                 -
          CONTROLINTERVALSIZE(4096))

CISZ (Control Interval Size) determina o tamanho de cada CI no componente DATA. Valores válidos: 512, 1024, 2048, 4096, 8192, 16384, 32768. Para registros de produção, 4096 é o ponto de partida mais comum.

🟣 BUFFERSPACE
Define quantos bytes de buffer o VSAM aloca em memória para ler CIs antecipadamente (lookahead). Um valor maior reduz I/Os em acesso sequencial mas consome memória do address space. Omitir deixa o VSAM calcular automaticamente (padrão recomendado para COBOL).

3. DEFINE para ESDS e RRDS

ESDS — Entry-Sequenced Dataset

DEFINE CLUSTER — ESDS
  DEFINE CLUSTER                              -
         (NAME(PROD.AUDITORIA.ESDS)          -
          CYLINDERS(5 2)                     -
          RECORDSIZE(200 500)                -
          NONINDEXED                         -
          SHAREOPTIONS(2 3))                 -
         DATA                               -
         (NAME(PROD.AUDITORIA.ESDS.DATA)    -
          CISZ(4096))

Pontos-chave do ESDS:

  • NONINDEXED — declara ESDS (sem componente INDEX)
  • Sem parâmetro KEYS — registros são identificados por RBA (Relative Byte Address)
  • RECORDSIZE pode ter médio ≠ máximo — ESDS suporta registros de comprimento variável
  • Sem freespace — registros só são adicionados no final; nunca inseridos no meio
  • Não existe DELETE de registro individual — o registro fica lá para sempre

RRDS — Relative Record Dataset

DEFINE CLUSTER — RRDS
  DEFINE CLUSTER                              -
         (NAME(PROD.TABELA.RRDS)             -
          CYLINDERS(2 1)                     -
          RECORDSIZE(100 100)                -
          NUMBERED                           -
          REUSE                              -
          SHAREOPTIONS(2 3))                 -
         DATA                               -
         (NAME(PROD.TABELA.RRDS.DATA)       -
          CISZ(4096))

Pontos-chave do RRDS:

  • NUMBERED — declara RRDS (slots numerados de 1 a N)
  • RECORDSIZE médio = máximo — registros RRDS são sempre de tamanho fixo
  • REUSE — permite que o dataset seja aberto com REUSE no COBOL, começando do slot 1 (útil para datasets temporários)
  • Sem componente INDEX

4. REPRO — copiar, carregar e fazer backup

REPRO é o comando mais versátil do IDCAMS. Serve para copiar entre datasets, carregar dados iniciais, criar backups e restaurar.

Carga inicial — sequencial → VSAM

O caso mais comum: você tem um arquivo sequencial (extraído de outro sistema) e precisa carregá-lo num KSDS recém-criado.

JCL — carga inicial de KSDS
//LOAD     EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SEQIN    DD DSN=PROD.CLIENTES.SEQ,DISP=SHR
//VSAMOUT  DD DSN=PROD.CLIENTES.KSDS,DISP=SHR
//SYSIN    DD *
  REPRO INFILE(SEQIN)                        -
        OUTFILE(VSAMOUT)
/*
⚠️ Pré-requisito para carga em KSDS
O arquivo sequencial de entrada deve estar em ordem crescente de chave antes do REPRO. Se os registros chegarem fora de ordem, o REPRO abortará com VSAM return code 8. Use um SORT anterior ao REPRO quando necessário.

REPRO VSAM → VSAM (backup)

JCL — backup VSAM → VSAM
//BACKUP   EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//VSAMIN   DD DSN=PROD.CLIENTES.KSDS,DISP=SHR
//BKPOUT   DD DSN=BACKUP.CLIENTES.KSDS,DISP=SHR
//SYSIN    DD *
  REPRO INFILE(VSAMIN)                       -
        OUTFILE(BKPOUT)
/*

REPRO VSAM → sequencial (unload)

Fundamental para reorganização: você descarrega o VSAM para um arquivo sequencial, depois recarrega no dataset vazio.

JCL — unload VSAM para sequencial
//UNLOAD   EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//VSAMIN   DD DSN=PROD.CLIENTES.KSDS,DISP=SHR
//SEQOUT   DD DSN=PROD.CLIENTES.UNLOAD,
//            DISP=(NEW,CATLG,DELETE),
//            SPACE=(CYL,(20,5)),
//            DCB=(RECFM=VB,LRECL=32756,BLKSIZE=32760)
//SYSIN    DD *
  REPRO INFILE(VSAMIN)                       -
        OUTFILE(SEQOUT)
/*

Parâmetros opcionais do REPRO

REPRO — parâmetros de seleção
  REPRO INFILE(VSAMIN)                       -
        OUTFILE(SEQOUT)                      -
        SKIPREC(1000)                        -
        COUNT(5000)                          -
        FROMKEY(1000000000)                  -
        TOKEY(1999999999)
ParâmetroDescrição
SKIPREC(n)Pula os primeiros n registros da entrada
COUNT(n)Copia exatamente n registros (depois de SKIPREC)
FROMKEY(x)Começa a copiar a partir da chave x (KSDS)
TOKEY(x)Para de copiar na chave x inclusive (KSDS)
FROMADDRESS(rba)Começa no RBA especificado (ESDS)
TOADDRESS(rba)Para no RBA especificado (ESDS)
FROMNUMBER(n)Começa no slot n (RRDS)
TONUMBER(n)Para no slot n (RRDS)
REPLACESubstitui registros com chave duplicada no destino
NOREPLACERejeita registros com chave duplicada (padrão)
REUSEReinicia o dataset de saída do começo antes de copiar
✅ REPRO com REPLACE para merge
Para aplicar um arquivo de atualizações delta sobre um KSDS existente, use REPRO INFILE(DELTA) OUTFILE(MASTER) REPLACE. Os registros com chave já existente são substituídos, e os novos são inseridos. É o equivalente ao MERGE de arquivos sequenciais, mas para VSAM.

5. LISTCAT — lendo a saída completa

LISTCAT mostra o que o catálogo sabe sobre um dataset: atributos definidos, espaço alocado/usado, estatísticas de operação e data de criação/último uso.

JCL — LISTCAT com ALL
//LISTCAT  EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
  LISTCAT ENTRY(PROD.CLIENTES.KSDS) ALL
/*

A saída ALL inclui todas as seções. Principais blocos:

Saída LISTCAT — trecho CLUSTER
LISTING OF CLUSTER ------- PROD.CLIENTES.KSDS
     IN-CAT --- UCAT.PROD
     HISTORY
       DATASET-OWNER--------(NULL)        CREATION--------2026.120
       RELEASE-----------------2          EXPIRATION------0000.000
     ATTRIBUTES
       INDEXED              READPW-----------(NULL)    WRITEPW-----(NULL)
       UPDATEPW-------------(NULL)           CONTROLPW---(NULL)
       NULLS               ERASE
       SHAREOPTIONS(2 3)
     STATISTICS
       REC-TOTAL-----------1254308          REC-DELETED---------4721
       REC-INSERTED-----------8832          REC-UPDATED---------3104
       REC-RETRIEVED-------985002
     ALLOCATION
       SPACE-TYPE----------CYLINDER        SPACE-PRI-----------   20
       SPACE-SEC-----------     5
Saída LISTCAT — trecho DATA
LISTING OF DATA ----------- PROD.CLIENTES.KSDS.DATA
     STATISTICS
       REC-TOTAL-----------1254308          REC-DELETED---------4721
       SPLITS-CI-----------------3          SPLITS-CA--------------0
       EXTENTS-------------------1          SYSTEM-TIMESTAMP...
     ALLOCATION
       SPACE-TYPE----------CYLINDER        SPACE-PRI-----------   20
       SPACE-SEC-----------     5          HI-ALLOC-RBA----83886080
       HI-USED-RBA-----76546048
     VOLUME
       VOLSER------------VOL001            DEVTYPE---------3390
       HI-ALLOC-RBA----83886080            HI-USED-RBA-----76546048

Campos mais importantes do LISTCAT

CampoO que significaAção se alto
SPLITS-CI Número de CI Splits desde a última reorganização Verificar freespace CI%; reorganizar se muitos
SPLITS-CA Número de CA Splits — mais grave que CI Split Reorganizar imediatamente; pode fragmentar disco
EXTENTS Número de extensões (alocações secundárias usadas) Se > 1–2, rever alocação primária; > 10 é crítico
REC-DELETED Registros deletados (espaço não reutilizado por seq.) Se alto (% do REC-TOTAL), reorganizar para recuperar espaço
HI-USED-RBA Byte mais alto efetivamente usado no dataset Comparar com HI-ALLOC-RBA para ver % de uso
HI-ALLOC-RBA Total de bytes alocados (primário + secundário) Se igual a HI-USED-RBA, dataset está cheio

Variações do LISTCAT

LISTCAT — variações úteis
  /* Resumo sem estatísticas detalhadas */
  LISTCAT ENTRY(PROD.CLIENTES.KSDS) NAME

  /* Tudo no catálogo que começa com PROD */
  LISTCAT LEVEL(PROD) ALL

  /* Apenas o componente DATA */
  LISTCAT ENTRY(PROD.CLIENTES.KSDS.DATA) ALL

  /* Listar todos os clusters de um catálogo */
  LISTCAT CATALOG(UCAT.PROD) CLUSTER

6. DELETE — removendo datasets

DELETE remove o dataset do catálogo e libera o espaço DASD. Para um KSDS, o DELETE do cluster automaticamente remove DATA e INDEX.

DELETE — formas mais comuns
  /* Deleta cluster (inclui DATA e INDEX) */
  DELETE PROD.CLIENTES.KSDS CLUSTER

  /* Deleta dataset não-VSAM */
  DELETE PROD.RELATORIO.SAI NONVSAM

  /* Deleta sem erro se não existir */
  DELETE PROD.CLIENTES.KSDS CLUSTER        -
         PURGE

  /* Deleta e ignora datas de expiração */
  DELETE PROD.CLIENTES.KSDS CLUSTER        -
         PURGE ERASE

  /* Deleta tudo que começa com PROD.TEMP */
  DELETE PROD.TEMP.** CLUSTER PURGE
ParâmetroEfeito
CLUSTERRemove cluster + DATA + INDEX de uma vez
NONVSAMRemove um dataset sequencial ou PDS do catálogo
PURGEIgnora data de expiração (EXPDT/RETPD)
ERASESobrescreve os dados com zeros antes de deletar (segurança)
FORCERemove mesmo que existam objetos dependentes (AIX, paths)
⚠️ DELETE com wildcard
DELETE PROD.TEMP.** CLUSTER PURGE é poderoso e perigoso. Um erro de digitação pode deletar datasets de produção. Use sempre com LISTCAT antes para confirmar o que será deletado, e só execute em ambientes não-produtivos sem dupla aprovação.

7. ALTER — modificando atributos

ALTER muda atributos de um dataset VSAM existente sem precisar recriá-lo. Não é possível alterar RECORDSIZE, KEYS ou CISZ — esses são fixos na criação.

ALTER — exemplos práticos
  /* Aumentar freespace (vale para novos registros inseridos) */
  ALTER PROD.CLIENTES.KSDS.DATA            -
        FREESPACE(30 15)

  /* Mudar SHAREOPTIONS */
  ALTER PROD.CLIENTES.KSDS                 -
        SHAREOPTIONS(3 3)

  /* Adicionar senha de leitura */
  ALTER PROD.CLIENTES.KSDS                 -
        READPW(SENHAR01)

  /* Renomear dataset */
  ALTER PROD.CLIENTES.KSDS                 -
        NEWNAME(PROD.CLIENTES.KSDS.V2)

  /* Mudar alocação secundária */
  ALTER PROD.CLIENTES.KSDS.DATA            -
        CYLINDERS(5)

  /* Definir data de expiração */
  ALTER PROD.CLIENTES.KSDS                 -
        TO(2026/12/31)
✅ ALTER FREESPACE não reorganiza
Quando você faz ALTER FREESPACE, o novo valor só afeta CIs criados após o ALTER (novos CI Splits ou novas CA Splits). Os CIs já existentes continuam com o freespace original. Para que o novo freespace seja aplicado a todo o dataset, é necessário reorganizar (REPRO unload + DELETE + DEFINE + REPRO reload).

8. EXPORT e IMPORT — backup portátil

EXPORT cria um arquivo sequencial portátil que contém tanto os dados quanto os metadados do cluster (atributos, SHAREOPTIONS, chaves). IMPORT recria o cluster completo a partir desse arquivo, inclusive o DEFINE CLUSTER implícito.

JCL — EXPORT de cluster
//EXPORT   EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//EXPFILE  DD DSN=TAPE.BACKUP.CLIENTES,
//            DISP=(NEW,CATLG,DELETE),
//            UNIT=CART,
//            LABEL=(1,SL)
//SYSIN    DD *
  EXPORT PROD.CLIENTES.KSDS                -
         OUTFILE(EXPFILE)                  -
         TEMPORARY
/*

TEMPORARY — mantém o dataset original ativo. Use PERMANENT para deletar o original após o export (pouco comum).

JCL — IMPORT de cluster
//IMPORT   EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//IMPFILE  DD DSN=TAPE.BACKUP.CLIENTES,
//            DISP=OLD,
//            UNIT=CART,
//            LABEL=(1,SL)
//SYSIN    DD *
  IMPORT INFILE(IMPFILE)                   -
         OUTDATASET(PROD.CLIENTES.KSDS)    -
         CATALOG(UCAT.PROD)
/*
🦕 EXPORT vs REPRO
REPRO copia apenas os registros (dados brutos). EXPORT copia dados + definição — é como um dump completo do cluster. Para migrar um KSDS para outro sistema ou restaurar em ambiente diferente, EXPORT/IMPORT é superior ao REPRO porque não exige recriar o DEFINE CLUSTER manualmente.

Diferenças EXPORT/IMPORT vs REPRO

AspectoREPROEXPORT/IMPORT
Copia metadadosNãoSim (RECORDSIZE, KEYS, etc.)
Destino precisa existirSimNão (IMPORT cria o cluster)
Transferência entre sistemasCompatívelIdeal — arquivo portátil
Seleção de registrosSim (FROMKEY, COUNT, etc.)Não — sempre o cluster inteiro
Pode gravar em fitaSimSim
VelocidadeSimilarSimilar

9. PRINT — inspecionando conteúdo

PRINT lê registros de um dataset e os exibe no SYSPRINT em formato hexadecimal, de caráter ou DUMP. Indispensável para diagnóstico: verificar se o dataset foi carregado corretamente ou inspecionar um registro corrompido.

PRINT — formatos de saída
  /* Formato CHARACTER — leitura humana */
  PRINT INDATASET(PROD.CLIENTES.KSDS)      -
        CHARACTER                          -
        COUNT(10)

  /* Formato HEX — ver bytes exatos */
  PRINT INDATASET(PROD.CLIENTES.KSDS)      -
        HEX                               -
        FROMKEY(1000000001)                -
        TOKEY(1000000005)

  /* Formato DUMP — hexa + char lado a lado */
  PRINT INDATASET(PROD.CLIENTES.KSDS)      -
        DUMP                              -
        SKIPREC(100) COUNT(5)

Exemplo de saída DUMP:

Saída PRINT DUMP
RECORD SEQUENCE NUMBER- 101
000000  C3 4C 9F 5B 5B 5B 5B 5B  5B 5B 5B 5B 5B 5B 5B 5B  C<.[$$$$$$$$$$$$$
000010  5B 5B 5B 5B 5B 5B 5B 5B  5B 5B 5B 5B 5B 5B 5B 5B  $$$$$$$$$$$$$$$$
000020  F0 F1 F2 F3 F4 F5 F6 F7  F8 F9 F0 F1 F2 F3 F4 F5  0123456789012345
✅ PRINT para verificar carga
Após um REPRO de carga inicial, use PRINT INDATASET(...) CHARACTER COUNT(3) para confirmar que os primeiros registros têm o layout esperado. É muito mais rápido do que escrever um programa de leitura para esse diagnóstico.

10. VERIFY — recuperando após falha

Quando um job que escrevia num VSAM abortou sem fechar o dataset, o catálogo pode ficar com estatísticas inconsistentes — o VSAM acredita que o arquivo ainda está aberto e recusa novos acessos. VERIFY sincroniza o catálogo com o estado real do dataset no disco.

VERIFY — uso padrão
//VERIFY   EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
  VERIFY DATASET(PROD.CLIENTES.KSDS)
/*
⚠️ Quando executar VERIFY
Execute VERIFY quando um job abortar enquanto escrevia em um VSAM, quando você receber VSAM OPEN return code 168 (dataset aberto por outro sistema), ou quando o CICS reportar que não consegue abrir um arquivo após uma queda. Nunca execute VERIFY enquanto o dataset está genuinamente aberto — isso corrompe os dados.

VERIFY pode ser colocado como pré-step de jobs que abrem VSAM para escrita:

JCL — VERIFY como pré-step de segurança
//PRESTEP  EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
  VERIFY DATASET(PROD.CLIENTES.KSDS)
  IF LASTCC LE 4 THEN                        -
     SET MAXCC = 0
/*
//MAINPGM  EXEC PGM=MEUPROG,COND=(8,LT,PRESTEP)
//ARQUIVO  DD DSN=PROD.CLIENTES.KSDS,DISP=SHR

11. Reorganização com REPRO

VSAM não compacta automaticamente os espaços deixados por registros deletados, e CI/CA Splits criam fragmentação interna. A reorganização consiste em três passos: unload → delete+define → reload.

JCL completo — reorganização KSDS
//REORG    JOB (ACCT),'REORG KSDS',CLASS=A,MSGCLASS=X
//*
//* PASSO 1 — UNLOAD: descarrega VSAM para sequencial
//*
//STEP1    EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//VSAMDS   DD DSN=PROD.CLIENTES.KSDS,DISP=SHR
//SEQDS    DD DSN=&&REORGSEQ,
//            DISP=(NEW,PASS,DELETE),
//            SPACE=(CYL,(30,10)),
//            DCB=(RECFM=VB,LRECL=32756,BLKSIZE=32760)
//SYSIN    DD *
  REPRO INFILE(VSAMDS)                       -
        OUTFILE(SEQDS)
/*
//*
//* PASSO 2 — DELETE + DEFINE: recria o cluster vazio
//*
//STEP2    EXEC PGM=IDCAMS,COND=(8,LT,STEP1)
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
  DELETE PROD.CLIENTES.KSDS CLUSTER PURGE
  IF LASTCC LE 8 THEN DO
    DEFINE CLUSTER                           -
           (NAME(PROD.CLIENTES.KSDS)         -
            CYLINDERS(20 5)                  -
            RECORDSIZE(300 300)              -
            INDEXED                          -
            KEYS(10 0)                       -
            FREESPACE(25 10)                 -
            SHAREOPTIONS(2 3))              -
           DATA                             -
           (NAME(PROD.CLIENTES.KSDS.DATA)   -
            CISZ(4096))                      -
           INDEX                            -
           (NAME(PROD.CLIENTES.KSDS.INDEX)  -
            CISZ(512))
  END
/*
//*
//* PASSO 3 — RELOAD: recarrega do sequencial para o VSAM novo
//*
//STEP3    EXEC PGM=IDCAMS,COND=(8,LT,STEP2)
//SYSPRINT DD SYSOUT=*
//SEQDS    DD DSN=&&REORGSEQ,DISP=(OLD,DELETE)
//VSAMDS   DD DSN=PROD.CLIENTES.KSDS,DISP=SHR
//SYSIN    DD *
  REPRO INFILE(SEQDS)                        -
        OUTFILE(VSAMDS)
/*
🟣 Dataset temporário (&&REORGSEQ)
O duplo && cria um dataset temporário que existe apenas durante a execução do job e é apagado automaticamente ao final. O DISP=(NEW,PASS,DELETE) no STEP1 e (OLD,DELETE) no STEP3 garantem que o arquivo intermediário seja passado entre steps e deletado após o reload. Isso evita acumular datasets de trabalho em disco.

Quando reorganizar? Use os critérios do LISTCAT:

IndicadorThreshold de alertaThreshold crítico
SPLITS-CI> 5% dos CIs totais> 15%
SPLITS-CA> 0> 3
EXTENTS> 3> 10
REC-DELETED / REC-TOTAL > 10% > 25%

12. Códigos de retorno IDCAMS

Todo comando IDCAMS retorna um código em LASTCC. O MAXCC é o maior LASTCC de todos os comandos do step.

CódigoSignificadoAção
0 Sucesso completo Nenhuma
4 Warning — operação completou com ressalvas Ler mensagens; geralmente aceitável
8 Erro — operação falhou parcialmente Investigar mensagem; não continuar steps dependentes
12 Erro grave — operação não foi executada Corrigir JCL ou definição antes de retentar
16 Erro catastrófico — possível corrupção Notificar sistemas; verificar integridade do catálogo

Padrão seguro de step com verificação de condição:

IF/THEN/ELSE no SYSIN do IDCAMS
  DELETE PROD.CLIENTES.KSDS CLUSTER PURGE
  IF LASTCC LE 8 THEN DO
    SET MAXCC = 0
    DEFINE CLUSTER                           -
           (NAME(PROD.CLIENTES.KSDS) ...)
  END                                        -
  ELSE DO
    SET MAXCC = 12
  END
✅ SET MAXCC = 0 após DELETE
O DELETE retorna código 8 quando o dataset não existe (o que é aceitável em muitos cenários de "delete e recria"). O padrão acima reseta MAXCC para 0 após um DELETE com código ≤ 8, garantindo que o step JCL retorne 0 e não bloqueie steps seguintes desnecessariamente.