JCL

Rules: // in columns 1–2; names start in column 3 (1–8 characters); continuation by ending a line after a comma and continuing in columns 4–16; //* comments; /* ends in-stream data.

35.1 The three core statements

Identifies the job to JES accounting, programmer name, CLASS, MSGCLASS, NOTIFY, TIME, REGION

Runs a program (PGM=) or a procedure (PROC= or just the name) PARM, COND, REGION, TIME

Data definition: connects a DD name (used in ASSIGN TO) to a dataset

DSN, DISP, SPACE, DCB, SYSOUT, UNIT, VOL, DUMMY, * (in-stream)

Rules: // in columns 1–2; names start in column 3 (1–8 characters); continuation by ending a line after a comma and continuing in columns 4–16; //* comments; /* ends in-stream data.

//USER01A  JOB (ACCT123),'CUSTOMER REPORT',CLASS=A,MSGCLASS=X,
//             MSGLEVEL=(1,1),NOTIFY=&SYSUID,TIME=(0,30)
//* STEP010: RUN THE CUSTOMER REPORT PROGRAM
//STEP010  EXEC PGM=CUSTRPT,PARM='2026-03-31'
//STEPLIB  DD DSN=USER01.LOAD,DISP=SHR
//CUSTIN   DD DSN=PROD.CUSTOMER.MASTER,DISP=SHR
//RPTOUT   DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//EXTRACT  DD DSN=USER01.CUSTOMER.EXTRACT,
//            DISP=(NEW,CATLG,DELETE),
//            SPACE=(CYL,(10,5),RLSE),
//            DCB=(RECFM=FB,LRECL=100,BLKSIZE=0)

35.2 DISP

Create the dataset Exists; exclusive use Exists; shared read Append (or create if missing)

End dispositions: KEEP, CATLG, DELETE, PASS (to a later step), UNCATLG. Example: DISP=(NEW,CATLG,DELETE) — create, catalog if the step succeeds, delete if it abends.

35.3 Compile, link, and go

IBM supplies cataloged procedures: IGYWC (compile), IGYWCL (compile + link-edit), IGYWCLG (compile + link + go). Your site may have customized versions.

PARM.COBOL= passes options to the COBOL step of the procedure; ddname overrides use the form stepname.ddname.

//COMPLINK JOB (ACCT),'COMPILE CUSTRPT',CLASS=A,MSGCLASS=X,
//             NOTIFY=&SYSUID
//CL       EXEC IGYWCL,PARM.COBOL='LIST,MAP,XREF,RENT'
//COBOL.SYSIN  DD DSN=USER01.COBOL.SOURCE(CUSTRPT),DISP=SHR
//COBOL.SYSLIB DD DSN=USER01.COBOL.COPYLIB,DISP=SHR
//LKED.SYSLMOD DD DSN=USER01.LOAD(CUSTRPT),DISP=SHR
//*
//RUN      EXEC PGM=CUSTRPT,COND=(4,LT)
//STEPLIB  DD DSN=USER01.LOAD,DISP=SHR
//CUSTIN   DD DSN=USER01.CUSTOMER.DATA,DISP=SHR
//RPTOUT   DD SYSOUT=*
//SYSOUT   DD SYSOUT=*

35.4 Condition codes

Each step ends with a return code (from RETURN-CODE in COBOL). Control subsequent steps with:

The COND parameter's logic is inverted ("bypass if the test is true") — a frequent source of confusion; prefer IF/THEN/ELSE.

//* COND: BYPASS this step IF (4 LT RC of any previous step), i.e. if RC > 4
//STEP020  EXEC PGM=UPDATE,COND=(4,LT)
//*
//* IF/THEN/ELSE/ENDIF (clearer, recommended)
//CHECK    IF (STEP010.RC = 0) THEN
//STEP030  EXEC PGM=REPORT
//         ELSE
//STEP040  EXEC PGM=ALERT
//         ENDIF
//*
//         IF (ABEND OR STEP010.RC > 8) THEN
//CLEANUP  EXEC PGM=IEFBR14
//         ENDIF

35.5 More JCL essentials

Utilities: IEFBR14 (do nothing — used to allocate/delete via DD), IEBGENER (copy), IEBCOPY (copy PDS members), IDCAMS (VSAM and catalog), SORT (DFSORT/Syncsort), IKJEFT01 (TSO in batch — used for Db2 programs).

Procedures (PROC/PEND) and symbolic parameters (&ENV) let one JCL template serve test and production; SET ENV=TEST; INCLUDE MEMBER= pulls JCL fragments; JCLLIB ORDER= names procedure libraries.

Jobs are usually run by a scheduler (IBM Z Workload Scheduler, BMC Control-M, Broadcom CA-7) that manages dependencies and restarts.

//* Temporary dataset passed between steps
//SORT1    EXEC PGM=SORT
//SORTIN   DD DSN=PROD.DAILY.TRANS(0),DISP=SHR
//SORTOUT  DD DSN=&&SORTED,DISP=(NEW,PASS),SPACE=(CYL,(5,5))
//SYSIN    DD *
  SORT FIELDS=(1,6,CH,A)
/*
//UPDT     EXEC PGM=ACCTUPDT
//TRANSIN  DD DSN=&&SORTED,DISP=(OLD,DELETE)
//NEWGEN   DD DSN=PROD.ACCOUNT.MASTER(+1),DISP=(NEW,CATLG,DELETE),
//            SPACE=(CYL,(20,10),RLSE),LIKE=PROD.ACCOUNT.MASTER(0)
//NOFILE   DD DUMMY