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.
//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
/*
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:
DELETE PROD.CLIENTES.KSDS CLUSTER
IF LASTCC LE 8 THEN DO
DEFINE CLUSTER ...
REPRO ...
END
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 -
(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âmetro | Valor exemplo | Significado |
|---|---|---|
| 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:
| Valor | Cross-region | Cross-system (sysplex) |
|---|---|---|
| 1 | 1 escritor OU N leitores | — |
| 2 | N leitores OU 1 escritor + N leitores | — |
| 3 | N escritores (sem controle) | Sem serialização entre sistemas |
| 4 | N escritores (sem controle) | Sem serialização entre sistemas |
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 -
(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.
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 -
(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 -
(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.
//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)
/*
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)
//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.
//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 INFILE(VSAMIN) -
OUTFILE(SEQOUT) -
SKIPREC(1000) -
COUNT(5000) -
FROMKEY(1000000000) -
TOKEY(1999999999)
| Parâmetro | Descriçã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) |
| REPLACE | Substitui registros com chave duplicada no destino |
| NOREPLACE | Rejeita registros com chave duplicada (padrão) |
| REUSE | Reinicia o dataset de saída do começo antes de copiar |
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.
//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:
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
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
| Campo | O que significa | Açã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
/* 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.
/* 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âmetro | Efeito |
|---|---|
| CLUSTER | Remove cluster + DATA + INDEX de uma vez |
| NONVSAM | Remove um dataset sequencial ou PDS do catálogo |
| PURGE | Ignora data de expiração (EXPDT/RETPD) |
| ERASE | Sobrescreve os dados com zeros antes de deletar (segurança) |
| FORCE | Remove mesmo que existam objetos dependentes (AIX, paths) |
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.
/* 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)
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.
//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).
//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)
/*
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
| Aspecto | REPRO | EXPORT/IMPORT |
|---|---|---|
| Copia metadados | Não | Sim (RECORDSIZE, KEYS, etc.) |
| Destino precisa existir | Sim | Não (IMPORT cria o cluster) |
| Transferência entre sistemas | Compatível | Ideal — arquivo portátil |
| Seleção de registros | Sim (FROMKEY, COUNT, etc.) | Não — sempre o cluster inteiro |
| Pode gravar em fita | Sim | Sim |
| Velocidade | Similar | Similar |
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.
/* 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:
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
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 EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * VERIFY DATASET(PROD.CLIENTES.KSDS) /*
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:
//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.
//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)
/*
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:
| Indicador | Threshold de alerta | Threshold 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ódigo | Significado | Açã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:
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
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.