1. Estrutura do JCL — SYSPRINT, SYSIN e IDCAMS

O IDCAMS usa um JCL simples com dois DDs fixos e DDs adicionais para os datasets que vai processar:

//* Estrutura básica do IDCAMS //IDCSTEP EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* /* mensagens e relatório */ //SYSIN DD * /* comandos IDCAMS */ LISTCAT ENTRIES('USUARIO.MEUS.DADOS') ALL /*

As instruções IDCAMS no SYSIN são case-insensitive, podem ser continuadas na próxima linha com um traço (-) no final, e múltiplos comandos podem ser encadeados num mesmo step.

💡 Múltiplos comandos num step

O IDCAMS processa todos os comandos do SYSIN sequencialmente. Você pode ter DEFINE, REPRO e LISTCAT no mesmo step — o que economiza steps de JCL. Cada comando pode ter return code independente, controlado com SET MAXCC.

2. DEFINE CLUSTER — criando datasets VSAM

O DEFINE CLUSTER cria um dataset VSAM novo. Os parâmetros variam conforme o tipo (KSDS, ESDS, RRDS). O exemplo mais comum é o KSDS:

//* Criar um KSDS (Key-Sequenced Dataset) //SYSIN DD * DEFINE CLUSTER - (NAME('USUARIO.CLIENTES.KSDS') - /* nome do cluster */ INDEXED - /* tipo: KSDS */ KEYS(8 0) - /* chave: 8 bytes, pos 0 */ RECORDSIZE(200 200) - /* tam médio e máximo */ TRACKS(10 5) - /* espaço primário+ext */ VOLUMES(USR001) - /* volume de disco */ FREESPACE(20 10) - /* 20% CI, 10% CA free */ REUSE) - /* permite REUSE */ DATA - (NAME('USUARIO.CLIENTES.KSDS.DATA'))- INDEX - (NAME('USUARIO.CLIENTES.KSDS.INDEX')) /*
ParâmetroTipo VSAMDescrição
INDEXEDKSDSAcesso por chave — o mais comum
NONINDEXEDESDSAcesso sequencial — entry-sequenced
NUMBEREDRRDSAcesso por número relativo de registro
LINEARLDSUsado para Data Spaces e buffers de alta performance

🦕 Analogia — DEFINE CLUSTER como CREATE TABLE

O DEFINE CLUSTER faz o papel de um CREATE TABLE no SQL — ele define a estrutura do "container" onde os dados vão viver: o tipo, a chave, o tamanho dos registros e o espaço alocado. Os dados entram depois via REPRO (como um INSERT em massa) ou pelo próprio programa COBOL.

3. DELETE — apagando datasets e aliases

O DELETE remove um dataset do catálogo e (opcionalmente) do disco:

/* Deletar um VSAM cluster */ DELETE 'USUARIO.CLIENTES.KSDS' CLUSTER /* Deletar dataset sequencial */ DELETE 'USUARIO.ARQUIVO.SEQ' /* Deletar sem erro se não existir */ DELETE 'USUARIO.TALVEZ.EXISTA' CLUSTER PURGE SET MAXCC=0 /* zerar RC mesmo se não existia */

⚠️ DELETE em VSAM apaga DATA e INDEX juntos

Ao deletar um cluster VSAM com DELETE ... CLUSTER, o IDCAMS remove automaticamente os componentes DATA e INDEX. Não tente deletar apenas o DATA ou apenas o INDEX — isso pode deixar o catálogo inconsistente. Sempre delete o CLUSTER inteiro.

4. LISTCAT — consultando o catálogo

O LISTCAT lista informações sobre datasets registrados no catálogo — atributos físicos, estatísticas de uso, datas e componentes VSAM:

/* Listar um dataset específico */ LISTCAT ENTRIES('USUARIO.CLIENTES.KSDS') ALL /* Listar todos os datasets com um prefixo */ LISTCAT LEVEL('USUARIO') ALL /* Listar apenas nomes (mais rápido) */ LISTCAT LEVEL('USUARIO') NAME

O parâmetro ALL exibe todas as informações disponíveis — incluindo CISIZE, FREESPACE, número de registros, extensões, e timestamps de criação e último acesso. Essas informações são valiosas para diagnóstico e capacity planning.

💡 LISTCAT no TSO

O comando LISTCAT também funciona diretamente na linha de comando TSO (opção 6 do ISPF) sem precisar de JCL: LISTCAT ENTRIES('USUARIO.DS') ALL. É mais rápido para consultas ad-hoc durante o desenvolvimento.

5. REPRO — copiando dados

O REPRO copia registros de um dataset para outro — funciona com VSAM, sequencial e GDGs, em qualquer combinação:

/* Copiar sequencial para KSDS (carga inicial) */ REPRO INFILE(ENTRADA) OUTFILE(SAIDA) /* Copiar KSDS para sequencial (extração) */ REPRO INFILE(VSAMENT) OUTFILE(SEQSAI) /* Copiar com filtro de chave (KSDS) */ REPRO INFILE(VSAMENT) - OUTFILE(VSAMSAI) - FROMKEY('00001') - /* chave inicial */ TOKEY('09999') /* chave final */

No JCL, os datasets precisam de DDs correspondentes:

//IDCSTEP EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //ENTRADA DD DSN=USUARIO.ENTRADA.SEQ,DISP=SHR //SAIDA DD DSN=USUARIO.CLIENTES.KSDS,DISP=SHR //SYSIN DD * REPRO INFILE(ENTRADA) OUTFILE(SAIDA) /*

💡 REPRO com REPLACE

Por padrão, se um registro com a mesma chave já existe no KSDS de destino, o REPRO rejeita o registro e incrementa o return code. Use REPRO INFILE(...) OUTFILE(...) REPLACE para sobrescrever registros existentes em vez de rejeitá-los.

6. PRINT — inspecionando conteúdo

O PRINT exibe o conteúdo de um dataset no SYSPRINT — útil para verificar o conteúdo sem precisar de um programa COBOL:

/* Imprimir conteúdo em caracteres */ PRINT INFILE(MEUVSAM) CHARACTER /* Imprimir em hexadecimal */ PRINT INFILE(MEUVSAM) HEX /* Imprimir dump (char + hex lado a lado) */ PRINT INFILE(MEUVSAM) DUMP /* Limitar o número de registros impressos */ PRINT INFILE(MEUVSAM) CHARACTER COUNT(100)

7. SET MAXCC — controlando o return code

Quando o IDCAMS executa múltiplos comandos, o return code final do step é o mais alto de todos. O SET MAXCC permite zerar ou limitar esse valor para que steps condicionais seguintes não sejam afetados por erros esperados (como um DELETE que pode falhar se o dataset não existir):

//SYSIN DD * /* Tentar deletar — não falhar se não existir */ DELETE 'USUARIO.TEMP.DADOS' SET MAXCC=0 /* zerar RC — o delete pode ter dado RC=8 */ /* Agora criar limpo */ DEFINE CLUSTER - (NAME('USUARIO.TEMP.DADOS') - NONINDEXED - TRACKS(5 2) - RECORDSIZE(100 100) - VOLUMES(USR001)) /*

Este padrão — DELETE + SET MAXCC=0 + DEFINE — é o "delete-e-recria" clássico do mainframe: garante que você começa com um dataset limpo sem abender se ele já existia ou não.