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
// ENDIF35.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