OS JCL consists of three basic statement types: • JOB statement, which identifies the start of the job, and information about the whole job, such as billing, run priority, and time and space limits. • EXEC statement, which identifies the program or
procedure to be executed in this step of the job, and information about the step, including
CONDitions for running or skipping a step. • DD (Data Definition) statements, which identify a data file to be used in a step, and detailed info about that file. DD statements can be in any order within the step. Right from the start, JCL for the OS family (up to and including
z/OS) was more flexible and easier to use. The following examples use the old style of syntax which was provided right from the launch of
System/360 in 1964. The old syntax is still quite common in jobs that have been running for decades with only minor changes.
Rules for coding JCL statements Each JCL statement is divided into five fields: Identifier-Field Name-Field Operation-Field Parameter-Field Comments-Field ^ ^ ^ ^ no space space space space Identifier-Field should be concatenated with Name-Field, i.e. there should be no spaces between them. • Identifier-Field (//): The identifier field indicates to the system that a statement is a JCL statement rather than data. The identifier field consists of the following: • Columns 1 and 2 of all JCL statements, except the delimiter statement, contain // • Columns 1 and 2 of the delimiter statement contain /* • Columns 1, 2, and 3 of a JCL comment statement contain //* • Name-Field: The name field identifies a particular statement so that other statements and the system can refer to it. For JCL statements, it should be coded as follows: • The name must begin in column 3. • The name is 1 through 8 alphanumeric or national ($, #, @) characters. • The first character must be an alphabetic. • The name must be followed by at least one blank. • Operation-Field: The operation field specifies the type of statement, or, for the command statement, the command. Operation-Field should be coded as follows: • The operation field consists of the characters in the syntax box for the statement. • The operation follows the name field. • The operation must be preceded and followed by at least one blank. • The operation will be one of JOB, EXEC and DD. • Parameter-Field: The parameter field, also sometimes referred to as the operand field, contains parameters separated by commas. Parameter field should be coded as follows: • The parameter field follows the operation field. • The parameter field must be preceded by at least one blank. • The parameter field contains parameters which are keywords that used in the statement to provide information such as the program or dataset name. • Comments-Field: This contains
comments. Comments-Field should be coded as Follows: • The comments field follows the parameter field. • The comments field must be preceded by at least one blank.
Keyword parameters //NEWFILE DD DSN=MYFILE01,UNIT=DISK,SPACE=(TRK,80,10), // DCB=(LRECL=100,BLKSIZE=1000), // DISP=(NEW,CATLG,DELETE) All of the major parameters of OS JCL statements are identified by keywords and can be presented in any order. A few of these contain two or more sub-parameters, such as SPACE (how much disk space to allocate to a new file) and DCB (detailed specification of a file's layout) in the example above. Sub-parameters are sometimes positional, as in SPACE, but the most complex parameters, such as DCB, have keyword sub-parameters. Positional parameter must precede keyword parameters. Keyword parameters always assign values to a keyword using the
equals sign (=).
Data access (DD statement) The DD statement is used to reference data. This statement links a program's internal description of a dataset to the data on external devices: disks, tapes, cards, printers, etc. The DD may provide information such as a device type (e.g. '181','2400-5','TAPE'), a
volume serial number for tapes or disks, and the description of the data file, called the DCB subparameter after the
Data Control Block (DCB) in the program used to identify the file. Information describing the file can come from three sources: The DD card information, the dataset label information for an existing file stored on tape or disk, and the DCB macro coded in the program. When the file is opened this data is merged, with the DD information taking precedence over the label information, and the DCB information taking precedence over both. The updated description is then written back to the dataset label. This can lead to unintended consequences if incorrect DCB information is provided. Because of the parameters listed above and specific information for various access methods and devices the DD statement is the most complex JCL statement. In one IBM reference manual description of the DD statement occupies over 130 pages—more than twice as much as the JOB and EXEC statements combined. The DD statement allows inline data to be injected into the job stream. This is useful for providing control information to utilities such as IDCAMS, SORT, etc. as well as providing input data to programs.
Device independence From the very beginning, the JCL for the OS family of operating systems offered a high degree of device independence. Even for new files which were to be kept after the end of the job one could specify the device type in generic terms, e.g., UNIT=DISK, UNIT=TAPE, or UNIT=SYSSQ (tape or disk). Of course, if it mattered one could specify a model number or even a specific device address.
Procedures Procedures permit grouping one or more "
EXEC PGM=" and
DD statements and then invoking them with "
EXEC PROC=procname" -or- simply "EXEC procname" A facility called a Procedure Library allowed pre-storing procedures.
PROC & PEND Procedures can also be included in the job stream by terminating the procedure with a // PEND statement, then invoking it by name the same way as if it were in a procedure library. For example: //SUMPRINT PROC //PRINT EXEC PGM=IEBGENER //SYSUT1 DD DSN=CEO.FILES.DAYEND.RPT24A,DISP=SHR //SYSUT2 DD SYSOUT=A //SYSIN DD DUMMY // PEND // EXEC SUMPRINT
Parameterized procedures OS JCL procedures were parameterized from the start, making them rather like
macros or even simple
subroutines and thus increasing their
reusability in a wide range of situations. //MYPROC PROC FNAME=MYFILE01,SPTYPE=TRK,SPINIT=50,SPEXT=10,LR=100,BLK=1000 ..... //NEWFILE DD DSN=&FNAME,UNIT=DISK,SPACE=(&SPTYPE,&SPINIT,&SPEXT), // DCB=(LRECL=&LR,BLKSIZE=&BLK),DISP=(NEW,CATLG,DELETE) .... In this example, all the values beginning with ampersands "&" are parameters which will be specified when a job requests that the procedure be used. The PROC statement, in addition to giving the procedure a name, allows the programmer to specify default values for each parameter. So one could use the one procedure in this example to create new files of many different sizes and layouts. For example: //JOB01 JOB .......... //STEP01 EXEC MYPROC FNAME=JOESFILE,SPTYPE=CYL,SPINIT=10,SPEXT=2,LR=100,BLK=2000 or //JOB02 JOB .......... //STEP01 EXEC MYPROC FNAME=SUESFILE,SPTYPE=TRK,SPINIT=500,SPEXT=100,LR=100,BLK=5000
Referbacks In multi-step jobs, a later step can use a
referback instead of specifying in full a file which has already been specified in an earlier step. For example: //MYPROC ................ //MYPR01 EXEC PGM=.......... //NEWFILE DD DSN=&MYFILE,UNIT=DISK,SPACE=(TRK,50,10), // DCB=(LRECL=100,BLKSIZE=1000),DISP=(NEW,CATLG,DELETE) .... //MYPR02 EXEC PGM=.......... //INPUT01 DD DSN=*.MYPR01.NEWFILE Here, MYPR02 uses the file identified as NEWFILE in step MYPR01 (DSN means "dataset name" and specifies the name of the file; a DSN could not exceed 44 characters). In jobs which contain a mixture of job-specific JCL and procedure calls, a job-specific step can refer back to a file which was fully specified in a procedure, for example: //MYJOB JOB .......... //STEP01 EXEC MYPROC Using a procedure //STEP02 EXEC PGM=......... Step which is specific to this job //INPUT01 DD DSN=*.STEP01.MYPR01.NEWFILE where DSN=*.STEP01.MYPR01.NEWFILE means "use the file identified as NEWFILE in step MYPR01 of the procedure used by step STEP01 of this job". Using the name of the step which called the procedure rather than the name of the procedure allows a programmer to use the same procedure several times in the same job without confusion about which instance of the procedure is used in the referback.
Comments JCL files can be long and complex, and the language is not easy to read. OS JCL allows programmers to include two types of explanatory comment: • On the same line as a JCL statement. They can be extended by placing a continuation character (conventionally "X") in column 72, followed by "// " in columns 1–3 of the next line. • Lines which contain only comment, often used to explain major points about the overall structure of the JCL rather than local details. Comment-only lines are also used to divide long, complex JCL files into sections. //MYJOB JOB .......... //* Lines containing only comments. //******** Often used to divide JCL listing into sections ******** //STEP01 EXEC MYPROC Comment 2 on same line as statement //STEP02 EXEC PGM=......... Comment 3 has been extended and X // overflows into another line. //INPUT01 DD DSN=STEP01.MYPR01.NEWFILE
Concatenating input files OS JCL allows programmers to concatenate ("chain") input files so that they appear to the program as
one file, for example //INPUT01 DD DSN=MYFILE01,DISP=SHR // DD DSN=JOESFILE,DISP=SHR // DD DSN=SUESFILE,DISP=SHR The 2nd and third statements have no value in the name field, so OS treats them as concatenations. The files must be of the same basic type (almost always sequential), and must have the same record length, however the block length need not be the same. In early versions of the OS (certainly before OS/360 R21.8) the block length must be in decreasing order, or the user must inspect each instance and append to the named DD statement the maximum block length found, as in, for example, //INPUT01 DD DSN=MYFILE01,DISP=SHR,BLKSIZE=800 // DD DSN=JOESFILE,DISP=SHR (BLKSIZE assumed to be equal to or less than 800) // DD DSN=SUESFILE,DISP=SHR (BLKSIZE assumed to be equal to or less than 800) In later versions of the OS (certainly after OS/MVS R3.7 with the appropriate "selectable units") the OS itself, during allocation, would inspect each instance in a concatenation and would substitute the maximum block length which was found. A usual fallback was to simply determine the maximum possible block length on the device, and specify that on the named DD statement, as in, for example, //INPUT01 DD DSN=MYFILE01,DISP=SHR,BLKSIZE=8000 // DD DSN=JOESFILE,DISP=SHR (BLKSIZE assumed to be equal to or less than 8000) // DD DSN=SUESFILE,DISP=SHR (BLKSIZE assumed to be equal to or less than 8000) The purpose of this fallback was to ensure that the access method would allocate an input buffer set which was large enough to accommodate any and all of the specified datasets.
Conditional processing OS expects programs to set a return code which specifies how successful the
program thought it was. The most common conventional values are:
Utilities Jobs use a number of
IBM utility programs to assist in the processing of data. Utilities are most useful in batch processing. The utilities can be grouped into three sets: • Data Set Utilities - Create, print, copy, move and delete data sets. • System Utilities - Maintain and manage catalogs and other system information. • Access Method Services - Process
Virtual Storage Access Method (VSAM) and non-VSAM data sets.
Difficulty of use OS JCL is undeniably complex As one instructional book on JCL asked, "Why do even sophisticated programmers hesitate when it comes to Job Control Language?" Such an attitude could be found in programming language textbooks, which preferred to focus on the language itself and not how programs in it were run. As one
Fortran IV textbook said when listing possible error messages from the
WATFOR compiler: "Have you been so foolish as to try to write your own 'DD' system control cards? Cease and desist forthwith; run, do not walk, for help." Nevertheless, some books that went into JCL in detail emphasized that once it was learned to an at least somewhat proficient degree, one gained freedom from installation-wide defaults and much better control over how an IBM system processed your workload. ==Job Entry Control Language==