JCL
JCL
JCL
INTRODUCTION TO JCL
Introduction to JCL
Objectives
What is JCL?
How MVS handles Jobs Initiators
Structure of JCL
Parameters Schematic representation of a Job-flow
Objectives
Understand the need for JCL. Understand the concept of a Job. Visualize the processing flow of a Job. Understand the structure of coding JCL. Differentiate between the different types of parameters used in JCL.
What is JCL?
JCL stands for Job Control Language.
P R O G R
INPUT
A M
OUTPUT
Figure: 1-1 JCL is a language that coordinates the activities of batch programs on the operating system. Using JCL you can tell the system: What program(s) you want to execute. What input and output datasets these program(s) will be using. What should be done with the datasets once the program(s) end(s). A Batch Job is a set of JCL statements that are used to input this information to the system.
MVS MVS
JES JES
CONVERSION CONVERSION
EXECUTION EXECUTION
OUTPUT OUTPUT
Job Entry Subsystem (JES) handles the Jobs before and after the execution. The Base Control Program (BCP) controls when a job gets the CPU for processing (this is called dispatching).
Input: The Job is put into JES Input Queue waiting to be dispatched.
Conversion: The Job is checked for Syntax and Validity. Execution: BCP handles the dispatching of the Job based on priority.
Output: Job is sent to JES Output Queue from where it will be sent for printing.
Purge: Job is in the JES Output Queue from where it can be purged from the system.
Initiators
Input Queue JOB1 (Class A) JOB2 (Class A) JOB3 (Class B) JOB4 (Class X)
Initiator 3
EXECUTION
An Initiator is a special Address Space to which Batch Jobs are mapped during execution. A system has a predetermined number of Initiators. A Job must be mapped to an Initiator in order to be executed.
Each Initiator is associated with one or more Classes and can take Jobs with those Classes only (Each Job has one Class). An Initiator holds a Job until the execution of the entire Job is over. Only then can it take on any other waiting Job. In Figure 1-3 for example,
Jobs Job1 and Job2 get mapped to Initiator1 and Initiator2 respectively since their Classes match with those of the Initiators,
Job Job3 will have to wait for an Initiator, as, even though Initiator3 is free, it cannot take a Job of Class B. Same case with Job4.
Initiators (Continued)
Input Queue
JOB1
Initiator 3
JOB2
Initiator1 and Initiator2 are now free, Job3 is the next Job in the Input Queue, so, it gets associated with Initiator1, Similarly, Job4 gets mapped to Initiator2, Initiator3 remains idle waiting for a Job with Class Z.
Structure of JCL
JOB
Step Data Definitions
A Job contains one or more Steps. Each Step signifies the execution of a Program.
Each Step has its own set of Data Definitions. These define the datasets to be used in the step.
All the Steps in a Job are executed sequentially. Max No. of steps can be up to 255. Max No. of DD statements can be up to 3273.
//STEPNAME EXECParameter,Parameter,
//STEPNAME EXECParameter,Parameter,
//DDNAME3 //*This line is a comment //STEPNAME EXECParameter,Parameter, //DDNAME4 // //DDNAME5 //DDNAME6 DDParameter,Parameter, One more comment DDParameter,Parameter, DDParameter,Parameter, Parameter,Parameter
Figure: 1-6
There are three primary operations (statement types) in JCL: JOB, EXEC and DD.
A JOB statement signifies the beginning of a Job and also describes the attributes for the entire Job in the form of parameters. An EXEC statement signifies the beginning of a Step (Execution of a program) and, optionally, the attributes of that Step.
All DD statements following an EXEC are the data definitions for that step. They identify input and output datasets in the step.
the
These are only a few of the statements available in JCL. There are more, which will be discussed later in this course.
Each statement accepts a list of parameters. Some parameters are optional, others are mandatory.
a. // b. /* c .//*
Indicates a JCL statement and its type. They are: in columns 1 and 2, define all JCL statements except the delimiters and comments. in columns 1 and 2 as a delimiter. This signifies the end of in-stream control statements. Installation-designated characters may also be used. in columns 1,2, and 3 depicts a comment statement
2.
NAME Field
Identifies a statement so that it can be referred to later. The name field identifies the name of the job, the name of the step, etc,: Must begin in column 3. 1-8 characters in length (alphanumeric or national (#, @, $)) First character must be alphabetic or national. Must be followed by at least one blank. Example: //ABC JOB MY ACCOUNT,PROGRAMMER NAME,CLASS=A
The example above shows the beginning of job ABC, as defined in the name field of the Job statement.
3.
OPERATION Field
Specifies the type of statement or command (e.g. JOB, EXEC, DD, etc.): i. Follows the NAME Field ii. Must be preceded and followed by at least one blank.
//STEP01 EXEC
The first example contains the JOB operation, which identifies the JCL statement as a JOB card.
The second example contains the EXEC operation, which identifies the statement as a step (called STEP01).
4. PARAMETER Field
Contains parameters separated by commas: i. ii. iii. iv. v. Follows the OPERATION field. Must be preceded and followed be at least one blank Consists of two types: Positional Keyword
The above JOB statement contains three parameters. Notice that they are each separated by a comma, with no spaces in between.
5.
COMMENT Field:
Comments can contain any information and are used to document elements of the JCL. The Comment Field: i. ii. Example: //ABC JOB MY ACCOUNT,PROGRAMMER NAME,CLASS=A Follows the PARAMETER field Must be preceded by at least one blank. Comment statement is recommended.
//STEP01 EXEC PGM=APGEN GENERATES THE MONTHLY A/P REPORT Anything to the right of a space that follows the last parameter on the line is a comment. Notice that there are no parameters following PGM=APGEN, so everything else on the line is treated as a comment. //ABC JOB MY ACCOUNT,PROGRAMMER NAME,CLASS=A
Syntax
No spaces Maximum 8 characters. //JOBNAME1 Comments JOB between parameters. Parameter,Parameter,
//
Parameter,Parameter
Figure: 1-7
Leave at least one blank and code the Operation (In this case, JOB).
Leave no blanks between two parameters. The parameters for a single statement can span across multiple lines. Parameters continued from a previous line must always begin between columns 4 and 16.
Caution: If a blank is left between two parameters on the same line, all the parameters
on that line following the blank are treated as comment entries.
Parameters
There are two types of parameters: Positional parameters and Keyword parameters. 1) Positional parameters If coded, must appear in a particular order. 2) Keyword parameters Can appear in any order.
he above example, assume A and B to be positional parameters and, X,Y and Z to be Keyword parameters.
//JOBNAME
JOB A,B,Z=3,Y=2,X=1
//JOBNAME
JOB B,A,X=1,Y=2,Z=3
If you do not want to code any value for the first positional parameter (A) then, you have to notify the absence by coding a positional comma before (B), i.e. //JOBNAME JOB ,B,Y=2,X=1,Z=3
Observe that keyword parameters are usually identifiable by an equal-to (=) operator. In other words, they accept values in the form of one or more constants or parameters.
Subsets of these two types of parameters are listed in the next page.
Parameters (Continued)
Even though PGM is a keyword parameter (accepts program name), if it is coded, it must appear immediately after EXEC.
Example:
Keyword parameters that accept positional sub-parameters There are sub-parameters that may also be positional. Example: //DDNAME DD DISP=(A,B,C) CANNOT be coded as //DDNAME DD DISP=(B,C,A)
There are also sub-parameters that are not positional. Example: //DDNAME CAN be coded as //DDNAME DD DCB=(B=2,A=1) DD DCB=(A=1,B=2)
NO
When a job is submitted, JES prepares it for execution, and temporarily stores its information on DASD until OS/390 is ready to accept it. When an initiator becomes available, JES selects the job for OS/390 execution. As OS/390 executes the JOB there is syntax check. If a JCL syntax error is detected, the system bypasses the entire job, notify the user and does not attempt job execution.
NO
If More Steps?
YES
Otherwise the job is executed step by step, simultaneously printing the output after execution of each step.
STOP
Figure: 1-8
Unit 1 Exercises
Complete the following: 1. Which of the following is not a stage during a Jobs processing? (Circle One) A. Input B. Conversion C. D. E. Execution Substantiation Output
F. Purge
2. The MVS subsystem that handles a Job before and after execution is called _____________________
3.
A special Address Space to which Batch Jobs are mapped during execution is called a
_____________________
4. 5.
In order for a Job to use an Initiator, the Job must have the same as the initiator. The statement signifies the beginning of a Job.
6.
7. 8.
The
The statement contains the data definitions for that step. Which of the following is not a field in a JCL statement? (Circle One)
A.
B. C. D.
E.
F.
UNIT 2
Accounting information and Programmer name CLASS MSGCLASS NOTIFY MSGLEVEL REGION TIME RESTART TYPRUN
Objectives
Understand what the JOB statement accomplishes Learn the most important parameters for the JOB statement Code different JOB statements depending on the need of the Job
To identify the Job and the person who submitted the Job.
You can code more than one Job in the same member, though it is not usually recommended.
Syntax
The JOB statement accepts both positional and keyword parameters.
You can use the same Jobname for more than one of your Jobs.
When a job is submitted to the CPU, it is assigned a unique JES number. Thus, if multiple jobs with the same Jobname are submitted to the CPU, they are tracked individually by their JES number.
Positional parameters Accounting information and Programmers name are both positional parameters.
for billing purposes. An installation dependent value ranging from 1 to 143 characters. A comma will replace absence of the accounting Information field.
Programmer Name:
Identifies the person or department who is responsible for the job. A character string ranging from 1 to 20 characters. A comma will replace absence of the Programmer Name field. Appears at the bottom of every page of printed output for the Job.
Parameter CLASS
Type: Keyword parameter
Purpose: To assign a Class to the Job. Syntax: //JOBNAME JOB ACCTINFO,PROGRAMMER NAME,CLASS=A,.. CLASS=Class (1 Character. Installation dependent. A thru Z and 0 thru 9) Example:
//ABC
JOB
ACCT123,PROGRAMMER NAME,CLASS=A,.
Job ABC will execute in class A. As we have seen in Unit 1, the Class of a Job determines the input priority (a basis for Initiator selection)
As most installations do not prefer the users specifying the dispatching priority for
their Jobs(a different parameter), the CLASS parameter provides a less explicit way to specify the input priority. For example, the user might select a Class that most Initiators can handle.
Parameter MSGCLASS
Type: Keyword parameter
//JOBNAME
Using the MSGCLASS parameter, you can tell the system how to handle the output of your Job. The valid values that you can specify for this parameter are dependent on your installation.
In one installation, MSGCLASS=Z may mean that the output has to be immediately routed to a printer. In another installation, it may mean that the output has to be held in the Output Queue for later retrieval.
Parameter NOTIFY
Type: Keyword parameter
Purpose:
NOTIFY=User-Id
(Any valid User ID defined to your security system)
Examples:
//ABC
JOB
ACCT123,PROGRAMMER NAME,NOTIFY=IBMUSER
This example will notify the user id MAIN006 when the job completes
//ABC
JOB
ACCT123,PROGRAMMER NAME,NOTIFY=&SYSUID
The value &SYSUID indicates that the user id, which submitted the job, should be notified when the job completes.
The NOTIFY parameter can used be when someone needs to be notified when a job completes, along with its maximum return-code (discussed later) or Abend code.
Once the Job finishes, if the user specified in NOTIFY has logged on, he or she will get the message once he or she presses ENTER or any other Attention Identifier Key. If not logged on, the user will get the message(s) along with the logon prompts during the next login procedure.
Parameter MSGLEVEL
Type: Keyword parameter accepting 2 positional parameters.
Purpose: To specify how much output has to be generated for this Job by the system. Syntax: //ABC JOB ACCT123,PROGRAMMER, NAME,MSGLEVEL=(a,b) MSGLEVEL=(a,b) a: Specifies how much of the Job has to be printed in the output (job log). Valid values are 0, 1 and 2
b:
Specifies which messages will be printed in the output (job log). Valid values are 0 and 1 0 Print the entire messages only if the Job abends (abnormal termination).
1 Print all the messages regardless of the outcome of the Job how the job terminates
//ABC
JOB
ACCT123,PROGRAMMER NAME,MSGLEVEL=(,1)
//ABC
JOB
ACCT123,PROGRAMMER NAME,MSGLEVEL=(2,)
Parameter REGION
Type: Purpose: Syntax: //JOBNAME REGION=nnnnnnnK n:Numeric value Valid ranges: or JOB ACCTINFO,PROGRAMMER NAME,REGION=nnnnM REGION=nnnnM Keyword parameter To limit the maximum amount of memory that the Job can utilize.
//ABC
//ABC
JOB
JOB
ACCT123,PROGRAMMER NAME,REGION=1024K
ACCT123,PROGRAMMER NAME,REGION=1M
REGION need not be explicitly coded unless specified in the documentation for certain utilities. If REGION=0K or REGION=0M is coded, the system assumes a default region size.
Parameter TIME
Type: Keyword parameter Purpose: The TIME parameter can be used to specify the maximum length of CPU time that a job or job step is to use the processor. Syntax: //JOBNAME JOB ACCTINFO,PROGRAMMER NAME,TIME(m,ss)
Any combination of minutes and seconds can be coded. However, there are three values for the parameter that have a special meaning:
TIME=NOLIMIT TIME=1440 means the job or step is not to be timed. TIME=1440 is equivalent to coding TIME=NOLIMIT, indicating that the job will not be timed. Thus 1440 is the only numerical value of TIME that is not to be interpreted literally.
TIME=MAXIMUM means the job or step will be allowed to use to 357912 minutes. (This is about 8.25 months of processor time) If coded on the JOB statement and any step causes the total time to be exceeded, the job is abnormally terminated. If not coded, the JES installation default is used.
//STP1
//STP2
//STP3
The entire job will be limited to a maximum of 1 minute and 30 seconds. The first step will be limited to a maximum of 1 minute.
Note that the submitter is apparently asking that the last step not be timed. However, coding TIME=NOLIMIT on the last step will NOT accomplish this objective. The TIME=(1,30) on the JOB statement will limit the maximum time for step 3 to 1 minute and 30 seconds.
If the time consumed by a job (or step) exceeds the value specified for the TIME parameter for that job (or step), the job ABENDS.
Parameter RESTART
Type: Keyword parameter
Purpose: The RESTART parameter allows you to begin the execution of the Job from a Step other than the first one. Syntax: //JOBNAME JOB ACCTINFO,PROGRAMMER , NAME,RESTART=Stepname
If you want to skip one or more of the initial steps in the Job before starting execution, use the RESTART parameter. For example, if you have run a Job with 2 steps, the first step runs and the second step abends. You make the changes in the second step to set right any error causing statement or parameter. Now, you will require running only the second step. Therefore, you change the JOB statement and add the RESTART parameter to start execution from the second step onwards.
Parameter TYPRUN
Type: Keyword parameter Purpose: The TYPRUN parameter controls the type of execution for the Job. Syntax: //JOBNAME JOB ACCTINFO,PROGRAMMER NAME,TYPRUN=typerun, TYPRUN=SCAN TYPRUN=SCAN Only check the Job for syntax errors. Do not execute the Job.This is a common way to debug errors in your JCL. The output, including error messages, if any, is directly sent to the Output Queue.
TYPRUN=HOLD TYPRUN=HOLD Check the Job for syntax errors and, if no errors are present, hold it in the Input Queue. The job will execute when a person (usually an operator) or another program releases the hold.
TYPRUN=COPY place.
takes
The source content of the Job immediately gets directed to the Output Queue. The JCL is copied as submitted to the sysout class specified in the MSGCLASS parameter (JES 2 ONLY). Example: //JOB1 JOB ACCT2254,MARK JOHN,TYPRUN=SCAN, //JOB2 JOB ACCT2112,MARK JOHN,TYPRUN=HOLD, //JOB3 JOB ACCT634,MARK JOHN,TYPRUN=COPY,
MSGCLASS=X,CLASS=A,
//
Sample2
MSGLEVEL=(1,1)
//MAINJOB1 //
JOB
,,RESTART=STEP3,
REGION=4M
TIME=1440,
//
MSGLEVEL=(2,0)
It is a good practice to code individual parameters on separate lines. If one of the parameters needs to be cancelled, all you need to do is comment out the line containing the parameter (by putting an * in column 3).
UNIT 3
- TIME PARM
Objectives
Understand the need for the EXEC statement.
To specify the system required parameters for each Step. The main purpose of a Job is to execute programs. Therefore, any Job will have at least one Step (EXEC statement).
When speaking of the EXEC statements, Step and Exec are very frequently used interchangeably.
All parameters required by a Program are coded along with that step. Parameters may also be coded to override either the default parameter values and/or the parameters given in the JOB statement.
Syntax
The EXEC statement has one positional parameter and other keyword parameters. Example: //JONNAME JOB NOTIFY=userid //STEPNAME EXEC PGM=Program-name or //JONNAME JOB NOTIFY=userid //STEPNAME EXEC PROC=Proc-name or //JOBNAME JOB NOTIFY=Userid //STEPNAME EXEC Procedure-name
The program or procedure parameter must be the first parameter in the EXEC statement. Hence, it is Positional in nature.
Parameter PGM
Type: Positional parameter
Purpose: To name the load module program which is to be executed in the EXEC statement
Syntax:
//JOBNAME JOB ACCTINFO,PROGRAMMER NAME,CLASS=A,. //STEP1 EXEC PGM=Program-Name,..
//STEP1
EXEC PGM=SAMPLE,.
The PGM parameter names the load-module you wish to execute in a particular Step. The name of the load-module is a character-string ranging from 1 to 8 characters.
Parameter PROC
Type: Positional parameter Purpose: To name the Procedure which is to be executed in the EXEC statement Syntax: //JOBNAME JOB ACCTINFO,PROGRAMMER NAME,CLASS=A,. //STEP1 EXEC PROC=Proc-Name,..
Instead of coding PROC= procedure-name, one can code the procedure-name directly, without the PROC= syntax, since this parameter is positional in nature.
Parameter REGION
Type: Purpose: Syntax: Keyword parameter To limit the maximum amount of memory that the Step can utilize.
Valid ranges:
0 thru 2047000 in case of K 0 thru 2047 in case of M K: Kilobytes M: Megabytes
EXEC PGM=MYPGM1,REGION=1024K
//ABC //STEP1
JOB
ACCT123,PROGRAMMER NAME,CLASS=A,..
EXEC PGM=MYPGM2,REGION=10M
As with the JOB statement, the REGION parameter can also be coded for the EXEC statement. If it is coded in both the statements, the value specified in the EXEC statement overrides that of the JOB statement. However, the value in the EXEC statement cannot be more than that of the JOB statement.
Parameter TIME
Type: Keyword parameter
Purpose: The TIME parameter can be used to specify the maximum length of CPU time that a job or job step is to use the processor. Syntax: //JOBNAME JOB ACCTINFO,PROGRAMMER NAME,CLASS=A,..
//STP1
As with the JOB statement, the TIME parameter can also be coded with the EXEC statement. If it is coded in both the statements, the value specified in the EXEC parameter overrides that of the JOB statement. But, the value specified in the EXEC statement cannot be more than that of the JOB statement.
Parameters PARM
Type: Purpose: Syntax: //JOBNAME JOB ACCTINFO,PROGRAMMER NAME Keyword parameter To pass data to the program that is being executed in the step.
The maximum length of the value specified to be passed to the program should be 100 bytes. But, the system attaches a 2-byte binary value at the beginning of the data-block passed. This filler contains the length of the data passed. Hence, the program should compensate for the additional 2 bytes at the beginning of the data-block into which it receives the value and refer the actual data beginning only from the 3rd byte onwards.
//JOBLIB
//STEP1 //DDIN //DDOUT
DD
DSN=MAIN006.X100.LOADLIB,DISP=SHR
Parm Indicator is equal to the string PRINT. Parm-length is the length of the parm field.
UNIT 4
THE DD STATEMENT
The DD statement
Objectives.
Purpose of the DD statement. Syntax. Parameters.
a.
b. c. d.
DSN
DISP SPACE VOL
e.
f. g.
UNIT
DCB SYSOUT
Temporary datasets
Refer backs Special DD names Dataset concatenation
Objectives
3. To specify all the dataset attributes required for creating new datasets
4. To manipulate and specify attributes for existing datasets so that they meet the requirements of the executing Step 5. To provide input data other than dataset input to programs that are executing in the Step
6. To direct the output created onto an output device or onto the spool
Most DD statements appear after at least one EXEC statement. But, some special DD statements, as we shall see, appear before any EXEC statement in the Job.
All DD statements related to a particular EXEC statement should be coded before coding the next EXEC statement. The next set of DD statements can now be coded for the new EXEC statement
Syntax
The DD statement accepts positional and keyword parameters. //DDNAME DD DSN=X.Y.Z,DISP=NEW Example:
//DDIN
//DDOUT
DD
DD
DSN=MAINUSR.COBOL.INPUT,DISP=OLD
DUMMY
There are many keyword parameters that can be coded along with a DD statement, as
Usually DUMMY is the only parameter coded on a DD statement, but keyword parameters
can follow. However if the keyword parameters are coded as the first parameters then there is no
need to code a comma to signify the absence of a positional parameter.
Type: Purpose:
The DSN parameter is used to specify the name of the dataset, which is used by the Step. The Step will have a DD statement for each dataset used by the Program. The dataset may be used for input or output purposes as required by the program.
q
q q
Example: //JOBNAME //STEP1 //DD1 //DD2 JOB DD DD ,,CLASS=A DSN=MAINUSR.COBOL.INPUT,DISP=OLD DSN=MAINUSR.COBOL.IN,DISP=(SHR,UNCATLG,DELETE) EXEC PGM=SAMPLE1
//DD3
// //STEP2 //DDIN
DD
EXEC DD
DSN=MAINUSR.COBOL.OUT,DISP=(NEW,CATLG,DELETE),
VOL=SER=SYSDA,SPACE=(TRK,(1,1)) PGM=SAMPLE2 DSN=MAINUSR.VSAM.IN,DISP=SHR
//DDOUT
//
DD
DSN=MAINUSR.VSAM.OUT,DISP=MOD,
VOL=SER=SYSDA,SPACE=(TRK,(1,1))
The above example is a two Step JOB. In the first Step, the program SAMPLE1 requires the use of three datasets specified by the DD names DD1, DD2, and DD3. In the first DD statement (DD1) the DSN parameter names the physical dataset and DISP parameter states that the dataset already exists and that we want exclusive use of this dataset (DISP=OLD).
In the second DD statement (DD2) the DISP parameter states to use the existing dataset for shared use and that the dataset is to be uncataloged after completion of the program. However if the program terminates abnormally we want to delete this dataset.
In the third DD statement (DD3) the DISP parameter states that a new dataset is to be created. After completion of the program we want to catalog the dataset. However, if the program terminates abnormally than the dataset should be deleted.
The Disposition parameter is used to specify if the dataset already exists or if it is going to be a new dataset. It also determines what is to be done to the dataset once the program terminates normally, and if it terminates abnormally for some reason.
The DISP parameter refers to the entire dataset and not to members of a PDS. The default DISP parameter is DISP=(NEW,DELETE,DELETE)
DISP
= (__________,__________,__________)
CATLG, UNCATLG KEEP DELETE PASS CATLG UNCATLG KEEP DELETE
NEW Dataset does not exist at the beginning of the step and is to be created. This parameter requires coding of some additional parameters like Space, Volume and Data Control Block (DCB). Code DISP=NEW when creating a new data set. DISP=NEW allows only one user to access the data set at a time.
OLD Dataset exists at the beginning of the step and should be opened for exclusive use by the step, i.e. no other process can access the dataset until this step finishes execution. Also, if records are being written to the dataset, the new records will overwrite existing records..
Code DISP=OLD to reference an existing data set. DISP=OLD allows only one user to access the dataset at a time. The system places other users in a wait state. If DISP=OLD is coded in output, the system starts at the beginning of the data set and writes over existing data. The system writes an end-of-file (EOF) after writing the last record.
SHR Dataset exists at the beginning of the step and should be opened for this step in
shared mode, i.e. any other process can also access the same dataset while the current step is executing but, only in shared mode. This means that no other process can code DISP=OLD for this dataset.
Code DISP=SHR to reference an existing data set and allow other users to access the data set at the same time.
MOD If dataset exists, open it in exclusive mode (DISP=OLD) and, if records are being
written to it, add the records at the end of the dataset. If the dataset does not exist then the status defaults to NEW.
Code DISP=MOD to indicate records are to be appended to the logical end of an existing data set. If DISP=MOD is coded and the data set does not exist, the disposition is treated as DISP=NEW.
Parameter - SPACE
Type: Keyword parameter that accepts positional parameters
Values are:
TRK requests allocation of storage for the new dataset in terms of tracks CYL requests allocation of storage for the new dataset in terms of cylinders p -Numerical value that indicates the primary quantity of space to be allocated in terms of the unit specified s -Numerical value that indicates the secondary quantity to be allocated once the primary quantity is exhausted d -Numerical value that specifies the number of directory blocks for a PDS (see below)
Directory Blocks
greater than zero creates a Partitioned Dataset. Coding a zero in this parameter or skipping it altogether creates a Physical Sequential dataset.
RLSE
Releases any unused secondary space from the dataset for use by other processes
Example:
//DDOUT
//
DD
DSN=MAINUSR.COBOL.OUT,DISP=(NEW,CATLG),
SPACE=(TRK,(2,3,1)RLSE),VOL=SER=SYSDA
be created since the directory block is a value of one, and the space required
is in terms of tracks. The primary quantity is two tracks and secondary is three tracks.
Parameter - VOLUME
Type: Keyword parameter that accepts keyword and positional parameters
Purpose:
To specify the Volume serial number on which the dataset exists or needs to be created.
Syntax: VOL=SER=volume-serial-number
Volume serial number is the installation-dependent serial number of the volume on which the dataset resides or needs to be created. or VOL=REF=cataloged-dataset-name
When you want to specify the name of a cataloged dataset instead of specifying the
volume-serial. Here, the dataset will be referenced from or created (depending on the disposition) on the same volume on which the cataloged dataset, mentioned in the parameter resides.
Example:
//DDOUT // DD DSN=MAINUSR.COBOL.OUT,DISP=(NEW,KEEP), SPACE=(TRK,(2,3,1)RLSE),VOL=SER=LP2WK1
Volume serial number is an important parameter to be mentioned for datasets that are given the Disposition of KEEP and for those datasets that are uncataloged.
For new datasets that are going to be cataloged there is no need to mention a volume serial number.
When you retrieve a cataloged existing dataset there is no need to mention the volume serial number. The VOL parameter is a must while creating a dataset or accessing an uncataloged dataset.
Parameter - UNIT
Type:
Purpose: Syntax:
To specify what type of device the dataset resides on or should be created. UNIT=Generic-unit-name or
UNIT=Unit-model-number
or UNIT=/Machine-address
Generic-unit-name:
SYSDA
TAPE SYSSQ
Unit-model-number:
Machine-address:
SPACE=(TRK,(2,3,1)RLSE),VOL=SER=LP2WK1,UNIT=SYSDA
Type:
Purpose: DCB is used to tell the system about the characteristics of the dataset being referenced, such as the structure of the record and the Block size.
Syntax: DCB=(LRECL=nnnn,BLKSIZE=nnnn,RECFM=record-format)
n a numeric value
LRECL The Logical Record Length - Specifies the maximum length of a record in the dataset. Values can range from 1 to 32760 bytes.
BLKSIZE The Block Size - Specifies the maximum length of a block in the dataset. Values can range from 18 to 32760 bytes.
RECFM The Record Format - Specifies the format of the records in the dataset i.e. fixed, variable, blocked, undefined etc.
record-format -
F FB V
For the RECFM parameter, some additional characters can be added at the end of the RECFM value. They are, A M S T If the records contain a carriage-return control character in the first byte. I f the records contain machine-specific device control characters other than the carriage-return control character in the first byte. If the records size may exceed the block size. If the records may be bigger than the track capacity of the device.
Also you can code each of these sub parameters separately without including them in the DCB parameter. However, if the DCB parameter is coded then all these sub parameters, if coded, must appear within the DCB parameter.
Parameter - SYSOUT
Type:
Purpose:
Syntax: SYSOUT=class value or SYSOUT = * (refers to the MSGCLASS value on the JOB card).
If coded, the SYSOUT parameter should appear immediately after the DD statement.
Use the SYSOUT parameter if you want to direct the output meant for any dataset to the print spool maintained by JES.
Directs the output meant for dataset SYSPRINT to the systems output spool.
Temporary Datasets
Temporary datasets are used as scratchpads for storing data only for the run of that step. After the end of the step, the temporary dataset is deleted unless Passed to the next step.
A temporary data set is one that is created and deleted in the same job. There are three ways to request the creation of a temporary data set:
In this case the system will create temporary data set having a 44-character name. The system builds date, time, and other information into this name to ensure the name is unique.
The system will create a temporary data set having a 44-character name. The system
builds date, time, and other information into the name to ensure its uniqueness.
3 Code a name beginning with & such as DSN=&TEMP //C DD DSN=&TEMP,UNIT=SYSDA,SPACE=(CYL,1)
The system will create a temporary data set with a 44-character name. The system creates
a unique name containing date, time and other information. Names prefixed by && are preferable to those prefixed by &. In a name of the form, DSN=&TEMP, the &TEMP can mean a temporary data set or a symbolic parameter (to be covered later).
Refer back
You can use refer backs if you dont want to explicitly code the value for parameters.
The presence of the * indicates that a backward reference is being used. DSN = *.DDNAME *.STEPNAME.DDNAME //STEP1 EXEC //DD1 DD DSN=A.B.C,
//STEP2 EXEC .
//DD2 DD DSN=*.STEP1.DD1 //
Syntax:
Parameter=*.STEPNAME.DDNAME
Many parameters in JCL statements can use a backward reference to fill in information. A backward reference (or refer back) is a reference to an earlier statement in the job or in a cataloged or instream procedure called by a job step.
*.STEPNAME.NAME OR *.STEPNAME.DDNAME
*.STEPNAME.PROCSTEPNAME.NAME OR *.STEPNAME.PROCSTEPNAME.DDNAME
Special DD names
You can use any name for your DD statements but there are certain names that have a meaning to the system or to the program(s) that are being executed.
special
Below are some of the most common DD names that have special meaning on most installations. STEPLIB JOBLIB Default search library PDS for the load-module being executed in the step Default search library PDS for the load-modules of all the steps in the Job
SYSPRINT
SYSOUT SYSIN
Note that if a DD name has a special meaning to one program, it may mean nothing at all to another program
STEPLIB
The //STEPLIB DD statement alters the normal program search strategy to locate the program being executed.When included in a step, the library named on the //STEPLIB DD statement is searched before the system searches the default library, SYS1.LINKLIB
MY.LIB1SYS1.LINKLIB//LIBJOB //ONE //STEPLIB EXEC DD JOB PGM=FIRST 8877,CLASS=T
MY.LIB1 SYS1.LINKLIB
DSN=MY.LIB1, DISP=SHR
PGM=SECOND
SYS1.LINKLIB
DSN=MY.LIB2, DISP=SHR
You are permitted to concatenate libraries to a STEPLIB DD statement. If you do so the libraries are searched in their concatenation order. STEPLIB overrides JOBLIB in the step, which has the STEPLIB statement.
JOBLIB
//ZEBRA JOB //JOBLIB //ONE 66,CLASS=T DD EXEC DSN=MY.LIB,DISP=SHR PGM=FIRST
//TWO
EXEC ---------------
PGM=SECOND
//THREE EXEC
PGM=THIRD
Code the //JOBLIB DD statement to identity a private library/libraries the system is to search for each program in the job.
The //JOBLIB DD statement must be coded before the first EXEC statement
You are permitted to concatenate libraries to a JOBLIB DD statement. If you do so the libraries are searched in their concatenation order.
Dataset Concatenation
//INDATA // // //OUTDATA // // // // // // DD DSN=USERID.INPUT.FILE1,DISP=SHR DD DSN=USERID.INPUT.FILE2,DISP=SHR DD DSN=USERID.INPUT.FILE3,DISP=SHR DD DSN=USERID.OUTPUT.DATA1,DISP=OLD DD DSN=USERID.OUTPUT.DATA2,DISP=OLD DD DSN=USERID.OUTPUT.DATA3, DISP=(NEW,CATLG,DELETE), SPACE=(TRK,(1,1),RLSE),LRECL=80, BLKSIZE=6160,RECFM=FB, VOL=SER=LP1WK1,UNIT=SYSDA
Concatenation is the method of combining 2 or more datasets and making them behave as a single file from the point of view of the program.
In case of input datasets records will be read in from files in the same order as specified in the concatenation i.e. start reading from the first file, once there are no more records in the first file, continue with the second file and so on until the last file is read. Only then will the system encounter the end-of-file condition.
In case of output datasets, writing will start from the first dataset. Once all the space in the
first dataset is exhausted, the next dataset in the concatenation order will be written to and, so on.
UNIT 5 UTILITIES
Utilities
Objectives
OS/390 Utilities Utility Classification Utility Control Statement Syntax
IEBGENER Utility IEBPTPCH Utility IEHLIST Utility IEBCOPY Utility IEHPROGM Utility IEBUPDTE Utility IDCAMS Utility
SORT Utility
Objectives
OS/390 Utilities
Utilities are IBM-supplied programs that are intended to perform certain routine and frequently occurring tasks in the OS/390 environment. Utilities are used in DASD, tape drives, print and punch operations. Utilities are used to allocate, update, delete, catalog and uncatalog data sets, and also to list the contents of VTOC (Volume Table of Contents).
Utility Classification
Utilities are broadly classified into two different categories: Data set Utilities (prefixed with IEB) System Utilities (prefixed with IEH) Data set utilities are used to copy, print, update, reorganize, and compare data at the dataset and/or record level. System utilities are used to list VTOC information, copy, delete, catalog and uncatalog datasets, to write tape labels and to add or delete dataset passwords.
JOB EXEC DD DD DD
DD
In the above example, the dataset MAINUSR.SEQ.INPUT is being copied to a new file called ABC.SEQ.OUTPUT.
The EXEC statement specifies the program to be executed (IEBGENER). The SYSPRINT DD statement defines the message dataset. The SYSUT1 DD statement defines the input dataset. The SYSUT2 DD statement defines the output dataset (can have multiple SYSUTn, where n should be 1,2,3). The SYSIN DD statement defines the control dataset. This is where IEBGENER looks for any utility control statements. When DUMMY is specified, there are no control statements being used.
Example:
//JOBNAME JOB ACCT,APARNASANDEEP //STEP1 EXEC PGM=IEBGENER //SYSPRINT DD SYSOUT=* //SYSUT1 DD DSN=MAINUSR.ABC.REC //SYSUT2 DD SYSOUT=* //SYSIN DD * GENERATE MAXFLDS=2 RECORD FIELD=(10,20,,1),FIELD=(10,1,,15) /* //
This step executes IEBGENER to create the SYSUT2 output data and route it to a print class. - SYSIN DD * indicates that instream records or control statements follow this statement. - The GENERATE statement specifies that editing of the input data is to be performed. - MAXFLDS=2 indicates that no more than 2 fields will be described on the subsequent RECORD statement. - The RECORD statement describes the input and output fields thru the FIELD parameter. - Each FIELD parameter specifies the fields length, its location in the input record, what type of conversion is to be done on the field, and where it should be placed in the output record. The format is: FIELD=(LENGTH OF FIELD,POSITION IN INPUT, CONVERSION, POSITION IN OUTPUT) The FIELD parameters in the above example state to: - move the 10 bytes starting in position 20 of the input record to the 10 bytes starting in 1 in the output record; - and to move the 10 bytes starting in position 1 of the input record to the 10 bytes starting in 15 in the output record
Example: //STEP1 EXEC PGM=IEBPTPCH //SYSPRINT DD SYSOUT=* //SYSUT1 DD DSN=MAINUSR.ABC.REC,DISP=SHR //SYSUT2 DD SYSOUT=* //SYSIN DD * PRINT TYPROG=PS,MAXFLDS=2 TITLE ITEM=(EMPLOYEES PROFILE,27) TITLEITEM=(NAME ADDRESS,15) RECORD FIELD=(8,2,,10),FIELD=(5,10,,20)
- The PRINT control statement specifies that the dataset has an organization of physical sequential and that a maximum of two fields will be printed on output. - The output titles are specified on the TITLE control statements. - EMPLOYEES PROFILE will be placed position 27 of the output file - NAME and ADDRESS will be placed on the next title line, beginning in position 15 - The RECORD statement describes the input and output fields thru the FIELD parameter. - Each FIELD parameter specifies the fields length, its location in the input record, what type of conversion is to be done on the field, and where it should be placed in the output record. The format is: FIELD=(LENGTH OF FIELD,POSITION IN INPUT, CONVERSION, POSITION IN OUTPUT) - The FIELD parameters in the above example state to: move the 8 bytes starting in position 2 of the input record to the 8 bytes starting in 10 in the output record; and to move the 5 bytes starting in position 10 of the input record to the 5 bytes starting in 20 in the output record
//
The above example uses IEHLIST to print two VTOC listings: The IEHLIST looks for utility control statements coded below the SYSIN DD statements: The first LISTVTOC control statement requests an formatted (FORMAT ) VTOC listing for pack ABC. This includes DSCB and space allocation information. If FORMAT is omitted, an abbreviated version is listed. The second LISTVTOC control statement requests a formatted VTOC listing for two datasets: MTPL.FILE1 and MTPL.FILE2.
Example 2:
//STEP1 //SYSPRINT //DD1 //SYSIN LISTPDS /* // EXEC PGM=IEHLIST DD SYSOUT=* DD DISP=OLD,UNIT=SYSDA,VOL=SER=ABC DD * DSNAME=MTPL.FILE,VOL=SYSDA=ABC
The above example uses IEHLIST to list entries in a PDS directory. The LISTPDS control statement requests a listing of the directory for the PDS, MTPL.FILE. NOTE: DSNAME cannot be abbreviated as DSN on a control statement
The SELECT statement identifies the members of the PDS to be copied. The format is: SELECT MEMBER=NAME (to specify a single member) -orSELECT MEMBER=(NAME,NAME,NAME) (to specify multiple members) -orSELECT MEMBER=(old,new,R) (to copy a member and change its name)
The EXCLUDE statement indicates that all members should be copied except those specified in the EXCLUDE statement. The format is: EXCLUDE MEMBER=NAME (to specify a single member) -orEXCLUDE MEMBER=(NAME,NAME,NAME) (to specify multiple members)
//MODAL2 JOB 0.2AMIP,. //STEP1 EXEC PGM=IEBCOPY //SYSPRINT DD SYSOUT=* //IN DD DSN=MTPL.FILE1,DISP=SHR //OUT DD DSN=MTPL.FILE2,DISP=SHR //SYSIN DD * COPY OUTDD=OUT,INDD=IN /*
The above example copies all of the members from the PDS, MTPL.FILE1 to an existing PDS, MTPL.FILE2.
Notice that the same DD name is specified in both the INDD and OUTDD parameters.
X
X
The RENAME control Statement tells IEHPROGM to rename member XYZ to PQR in the PDS, MTPL.FILE1.
Example 2:
//IEHPROGM2 JOB A123,MAHESH,.. //STEP1 EXEC PGM=IEHPROGM //SYSPRINT DD SYSOUT=A //SYSUT1 DD UNIT=3390,VOL=SER=LP2WK1 //SYSIN DD * UNCATLG DSNAME=ABC.FILE,VOL=SER=LP2WK1,UNIT=3390 /* // In the above example:
In the above example, the PDS MTPL.MYPDS, contains a member named MEM, which
contains two records with sequence numbers (00000050 and 00000070) in columns 73 thru 80. When the IEBUPDTE job is executed, those two records will be replaced by the two records in the SYSIN input stream. This is an Update in Place. Before: ELIZABETH THOMAS RICO TIMOTHY MARY HARRIET After: ELIZABETH THOMAS JAY TIMOTHY MARY HARRIET
To Uncatalog a Dataset
//UNCATLOG JOB A123,SUSAN JOHN //STEP1 EXEC PGM=IEFBR14 //DD1 DD DSN=MAINUSR.COBOL.FILE1,DISP=(OLD,DELETE)
To Catalog a Dataset
//CATALOG JOB A123, SUSAN JOHN //STEP1 EXEC PGM=IEFBR14 //DD1 DD DSN=MAINUSR.COBOL.FILE3,DISP=(NEW,CATLG)
To Create A Dataset
//CREATE //STEP3 //SYSIN //DD1 // // // //SYSIN DD JOB A123, SUSAN JOHN PGM=IEFBR14
Example:
//JOBNAME //STEP1 //SYSPRINT //SYSIN
/* // In the above example when the step executes, IDCAMS deletes the non-VSAM dataset MTPL.SEQ.DATA. Functions coded on IDCAMS Utility The IDCAMS Utility can be executed for the following function on VSAM datasets. Define them Load records into them Print them
23,SUSAN JOHN
//STEP1 EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=A //SYSIN DD * ALTER MAINUSR.COBOL.LOADLIB (PROGRAM1) NEWNAME(MAINUSR.COBOL.LOADLIB (SAMPLE1)) /* //
Example: //STEP1 EXEC PGM=SORT //SYSOUT DD SYSOUT=* //SORTIN DD DSN=MAINUSR.SEQ1.INPUT,DISP=OLD //SORTOUT DD DSN=MAINUSR.SEQ2.OUTPUT,DISP=OLD //SYSIN DD * SORT FIELDS=(21,2,CH,A) /*
The above example will sort the records of the input dataset specified in the SORTIN DD statement based on the field specified in the control statement of the SYSIN DD. The sorted dataset is copied to the output dataset specified in the SORTOUT DD statement.
JOB (A123),SUSAN JOHN,NOTIFY=&USERID EXEC PGM=SORT DD SYSOUT=A DD SYSOUT=A DD DSN=MAINUSR.ADDRESS.BOOK1,DISP=SHR DD DSN=MAIN006.ADDRESS.BOOK2, DISP=(NEW,CATLG,DELETE), UNIT=SYSDA, SPACE=(CYCL,(2,1),RLSE),VOL=SER=LP2WK1, DCB=(RECFM=FB,LRECL=80,BLKSIZE=800) DD UNIT=SYSDA,SPACE=(CYL,(20,10),RLSE) DD * FIELDS=(2,3,CH,A)
The above example sorts ascending on the 3-byte string which starts in position 2. Assume MAINUSR.ADDRESS.BOOK1 in the input file has three records 089134 - Ms. Patti Smith,Nevada 012345 - Mr.John Henley,Califorina 042345 - Mr. Abraham Scott,NewYork
After successful completion the output file will look into this. 012345 Mr. John Henley,California 042345 - Mr. Abraham Scott,NewYork 089134 - Ms. Patti Smith,Nevada
Merge
This process takes records from up to 16 sorted data sets and combines them in a single sorted output data set. Each of the input data sets must be previously sorted in the same sequence before the merge In the above example two sorted data sets are merged into a single sorted data set. Example
//STEP1 EXEC PGM=ICEMAN //SYSOUT DD SYSOUT=* //SORTIN DD DSN=MTPL.SEQ1,DISP=OLD //SORTIN2 DD DSN=MTPL.SEQ2,DISP=OLD //SORTOUT DD DSN=MTPL.SEQ3,DISP=OLD //SYSIN DD * MERGE FIELDS =(21,2,CH,A) /*
The merge control statement format is similar to that of the sort. Input data sets must already be sorted in the same sequence. If all fields have the same format, then the merge control statement can be written in the form: MERGE FIELDS =(21,2,CH,A)
Unit 5 Exercises
1.
2. 3. 4. 5. 6. 7. The The The The The The utility can be used to create, copy or print sequential datasets. utility is used to allocate and delete VSAM, non-VSAM datasets. utility is used to copy the contents from one PDS to another. DD name is used to code the control statement(s) for a utility program. utility is used to print the contents of a dataset. utility is used to list the contents of a DASD VTOC. program to sort an input dataset.
IEBGENER
Use the JCL listed below as a guide to this lab. 3. 4. Add a step called //STEP1 to execute the program IEBGENER. Include one DD statement called SYSPRINT. It should put the SYSOUT on the same Print class as indicated in the JOB statement. Include one DD statement called SYSUT1 referring to the member JOBTEST2 on the library userid.JCL.CNTL Include one DD statement named SYSUT2. It should allocate a new dataset called userid.JCL.LAB5A that JOBTEST2 will be copied to. Include one DD statement named SYSIN for a dataset that does not exist.
5.
6.
7.
8.
Submit your job and review/debug the results. EXEC DD DD DD PGM=IEBGENER SYSOUT=* DSN=userid.JCL.CNTL(JOBTEST2),DISP=SHR DSN=userid.JCL.LAB5A, DISP=(,CATLG,DELETE), SPACE=(TRK,(1,1)), RECFM=FB,LRECL=80,UNIT=SYSDA DUMMY
DD
IEBCOPY
Use the JCL listed below as a guide to this lab. 1. In your PDS called userid.JCL.CNTL, create a new member called JOBTEST6. 2. Copy the job card from JOBTEST5, and rename the job to userid6. 3. Add a step called //STEP1 to execute the program IEBCOPY. 4. For this step: a. Copy the member JOBTEST2 from userid.JCL.CNTL to a new PDS called userid.JCL.CNTL1 Rename JOBTEST2 to COPY1 during the copy. //STEP1 EXEC PGM=IEBCOPY //SYSPRINT DD SYSOUT=* //IN DD DSN=userid.JCL.CNTL,DISP=SHR //OUT DD DSN=userid.JCL.CNTL1,DISP=(NEW,CATLG), // SPACE=(TRK,(2,3,1)RLSE),VOL=SER=SYSDA //SYSIN DD * COPY OUTDD=OUT,INDD=IN SELECT MEMBER=((JOBTEST2,COPY1,R))
b.
UNIT 6
PROCEDURES
Procedures Objectives
What is a Procedure?
Objectives
Understand the concept of a Procedure
What is a Procedure?
A Procedure is a JCL consisting of multiple executable steps but no JOB statement. This means that a Procedure consists of EXEC statements along with their respective DD statements.
A Procedure would generally be written for a set of programs that you want executed a number of times. Instead of coding these Steps repeatedly, you would make these Steps a part of a Procedure and would then execute the procedure as many times as required.
There are two types of procedures: Instream Procedures and Cataloged Procedures.
JOB
Procedure P1
Example:
//JOBNAME
//STEP
JOB
EXEC
NOTIFY=&USERID
PROC=procedure name
A Procedure name is a positional parameter of the EXEC statement and therefore can be coded with out the PROC= syntax, such as: //JOBNAME //STEP JOB EXEC NOTIFY=&USERID procedure name
Cataloged Procedures
A procedure which is part of a library is called a CATALOGED PROCEDURE.
EXECUTE CATPROC
Figure 6-2
It is not mandatory to have PROC statement in a cataloged procedure to signify the beginning of the procedure. However, as we will see, this statement is coded to contain the default values of symbolic parameters.
Instream Procedure
When you code the procedure in the job input stream, it is called an Instream Procedure
JOB
Procedure INPROC
Figure 6-3 An Instream Procedure begins with a PROC statement and ends with a PEND statement.
Instream Procedures can only be executed by the Jobs in which they are coded.
JOB statements DD * statements DD DATA statements Delimiter statements (/* followed by 78 blanks) Null statements (// followed by 78 blanks) Non-JCL statements (for example, JES or utility control statement)
//DD1
// // //
DD
DSN=MAINUSR.JCL1.CNTL,
DISP=(NEW,CATLG,DELETE), VOL=SER=LP2WK1, UNIT=SYSDA,SPACE=(TRK,(1,1,1),RLSE),
//
//SYSPRINT // //*
DCB=(BLKSIZE=800,LRECL=80,RECFM=FB)
DD SYSOUT=* PEND
//JCLSTEP
//SYSIN //*
EXEC
DD DUMMY
PROC=CREPROC
The name of the procedure is determined by the LABEL field of the PROC statement (CREPROC above). his is the Procedure name that will be used by the
At Runtime:
//MYJOB
JOB
//*JOBSTEP EXEC PROC=MYPROC //* This is what the system visualizes EXEC PGM=IEFBR14
//STEP1
In the example, the instream procedure begins with the PROC statement and ends with the PEND statement.
The procedure name is MYPROC which will be used to invoke the procedure in the EXEC statement.
During Run-time
//MYJOB
JOB
//SYSIN
DD DUMMY
Note that the PEND statement is not necessary for a Cataloged Procedure
The member name in which the cataloged procedure is coded becomes the name of the procedure, which will be used to invoke it in a Job.
Use the IEBUPDTE utility or ISPF/PDF to add a procedure to a proclib or modify a procedure. (IEBUPDTE is described in the next topic) A PROC statement in a cataloged procedure is optional and its label is also optional. Its only function is to contain default symbolic overrides.
//STEP1 EXEC
//DD1 // // // //SYSPRINT // //* JCL //CATGC //DD1 //CREAT EXEC //SYSIN //* DD JOB PEND
PGM=IEFBR14
DD DSN=MAINUSR.PROC1.PROC, DISP=(NEW,CATLG,DELETE),VOL=SER=LP2WK1, UNIT=SYSDA,SPACE=(TRK,(1,1,1),RLSE), DCB=(BLKSIZE=800,LRECL=80,RECFM=FB) DD SYSOUT=*
PROC=JCLPROC DUMMY
Procedures are executed when invoked from a Job, in its EXEC statement. The programs coded in the procedure are executed as they are without any changes. However, JCL overrides allow you to change the parameters given in the EXEC statement and the DD statements of the Procedure. These changes are limited for that run of the JCL only.
All overrides to EXEC parameters must be completed before overriding parameters in a subsequent step.
RULES for DD statement overriding To override any parameters in a DD statement an independent DD statement must be coded in the following format: //stepname.ddname DD overriding parameters The sequence of overriding DD statements must be the same as the sequence of the corresponding overridden statements.
An additional DD statement must be the last one coded in a steps overriding statements.
//SYSUT1 DD DUMMY
//SYSUT2 DD DUMMY
// PEND
//MYJOB
//STEP1
JOB NOTIFY=USERID
EXEC PGM=IEBGENER,TIME=10
AT RUNTIME
//MYJOB JOB //STEP1 //DD1 //DD2 EXEC PGM=IEFBR14 DD DD DSN=MAINUSR.JCL,PDS,DISP=SHR,VOL=SER=LP2WK1 DSN=MAINUSR.COPYLIB,DISP=SHR
The syntax for overriding Procedure DD parameters is //PROC-STEPNAME.DDNAME DD Parameter-modifications In the above example In DD1, LP1WK1 was changed to LP2WK1 The LRECL parameter was nullified (discarded) A new DD statement DD2 was added
Symbolic parameters
A symbolic parameter can be coded in place of any parameter as part of an EXEC statement or DD statement. Symbolic parameters are variables, which hold values that can be changed when the Procedure is called.
A symbolic parameter is a name preceded by an ampersand (&) and can be a maximum of 8 characters long.
The default values for the symbolic parameter can be coded in the PROC statement. To override the default parameter you will have to code the values for the symbolic parameter in the EXEC statement that invokes the procedure.
Symbolic overrides can be used only when symbolic parameters have been coded inside the procedure.
//
// //STEPX
UNIT=&B
PEND EXEC MYPROC,A=LP1WK1,B=SYSSQ
AT RUNTIME
//STEP1 EXEC PGM=IEFBR14 //DD1 DD DSN=MAINUSR.ABC.INPUT,DISP=SHR,
//
//
VOL=SER=LP1WK1,
UNIT=SYSSQ
In the above example, A and B are symbolic parameters. Instead of hard-coding the values for the VOL and UNIT parameters, they have been assigned the values contained in the symbolic parameters.
In case we do not change the value of the Symbolic parameters when the Procedure is called, the default values specified at the Procedure-declaration statement (PROC) are taken.
//
// // //SET1 PEND
VOL=SER=&A,
UNIT=&B
SET A=LP1WK1
//SET2
//STEPX
SET B=SYSSQ
EXEC MYPROC
The SET statement can appear anywhere in a JCL between the JOB statement and the
Similar to the way PROCs are used, INCLUDE allows you to code a single set of JCL statements
that you can use in multiple jobs.
//MYJOB JOB
//DD1
JCLLIB
ORDER=COMMOM.PDS
PGM=MYPGM DSN=A.B.C,DISP=SHR
INCLUDE MEMBER=COMMON
AT RUNTIME
UNIT 7
CONDITIONAL EXECUTION
Conditional Execution
Objectives
COND Parameter
Objectives Understand the need for the Conditional statement Understand the different types of COND Parameter and their usage
COND Introduction
Once a JOB starts executing, all of the steps are executed in the order in which they are coded. JES returns a condition code after the execution of each Job Step in a job
This condition code has a special meaning in the execution process. A condition code
of zero specifies a successful execution, while a code other than zero indicates some kind of error. The error code can be a value ranging from 0 to 4095. Some typical non-zero condition codes (and their meaning) are: COND CODE COND CODE COND CODE 0000 0004 0008 Program execution was completely successful. Execution was ok but cause warning messages. Program execution was seriously flawed.
COND CODE
COND CODE
0012
0016
Condition codes are different from ABEND codes. If a Job STEP abnormally terminates (ABENDS), then all subsequent Steps are bypassed. If a step returns a non-zero condition code, processing continues. The COND parameter gives you the ability to determine which steps of the job should execute, based on the condition codes returned in previous steps. The COND parameter is used on the JOB and EXEC statements. Another way to control step execution based on condition codes is the IF-THEN-ELSE-ENDIF statement, discussed later in this unit.
2. To process a step even if a previous step in a job has abended or only if a previous step has abended. Ordinarily MVS will terminate the entire job when a step abends. The COND parameter allows you to conditionally execute steps based on whether or not the job abended (such as executing a recovery step at the point of an abend).
Parameter COND
The COND parameter can be coded on both JOB and EXEC statements. The flow chart below explains how the COND parameter works.
IF CON D?
The COND parameter states that if a condition is true then the step in which this COND parameter is coded is to be bypassed. If the condition is false than the step is to be executed.
Syntax
The pattern to code COND parameter is COND=(value, operator, stepname) (0-4095) GT , The name of a previous step that returned
LT
EQ NE GE
LE
COND OPERATORS GT LT greater than less than
EQ
NE GE LE
equal to
not equal to greater than or equal to less than or equal to
Example:
//STEP08 EXEC PGM=IEWL,COND=(4,LT,STEP06)
As mentioned earlier, the COND parameter states that if a condition is true then the step in which this COND parameter is coded is to be bypassed. If the condition is false than the step is to be executed.
In the above example, if 4 is less than the condition code returned for STEP06, then
STEP08 will be bypassed and will not execute.
If STEP06 has this CCODE 0000 0001 0002 0003 0004 0005 0006 Yes Yes Yes Yes Yes No No
Will STEP08 Execute? Why? Because 4 is not less than 0. Because 4 is not less than 1. Because 4 is not less than 2. Because 4 is not less than 3. Because 4 is not less than 4. Because 4 is less than 5. Because 4 is less than 6.
Compound Tests
There is an implied OR relationship in any compound COND test. Any one condition that is satisfied is sufficient to by-pass the step.
Example:
//LKED EXEC PGM=IEWL,COND=((4,LT,COB),(4,LT,PC))
In this example, the step LKED is conditionally executed based on two separate steps COB and PC.
The JOB statement COND parameter performs the same return code tests for every step in a job. If the JOB statements return code test is satisfied, the job terminates.
The JOB COND parameter performs its return code tests for every step in the job, even when EXEC statements also contain COND parameters.
If any step satisfies the return code test in the JOB statement, the job terminates. The job terminates regardless of whether or not any EXEC statements contain COND parameters and whether or not an EXEC return code test would be satisfied.
If the JOB statements return code test is not satisfied, the system then checks the COND parameter on the EXEC statement for the next step. If the EXEC statement return code test is satisfied, the system bypasses that step and begins processing of the following step, including return code testing.
This example asks 'Is 10 greater than the return code or is 20 less than the return code? If either is true, the system skips all remaining job steps. If both are false the system executes all job steps. For example, if a step returns a code of 12, neither test is satisfied, the next step is executed. however, if a step returns a code of 25, the first test is false, but the second test is satisfied: 20 is less than 25. The system bypasses all remaining job steps.
This example says 'If 50 is greater than or equal to a return code, or 60 is less than a return code, bypass the remaining job steps.' In other words, the job continues as long as the return codes are 51 through 60.
//STEP2
//STEP3
//STEP4
The COND parameter can be coded on second and subsequent steps of a job stream.
You can define one or more conditions on a step. If any condition in a COND is true the step is by-passed.
If you omit the stepname in the COND parameter, the test applies to all previous steps (such as in //STEP4 in the example above).
1.
2.
All jobs start up in normal processing mode, but when a program abends MVS changes the job to abnormal termination mode. In normal processing mode MVS recognizes each EXEC
step and attempts to execute the program coded at it. If any COND conditions on an EXEC
are true MVS does not run that step but goes on to the next step. A job gets into an abnormal termination mode because a program has abended. MVS dumps out the program that fails and flushes out the reminder of the job with
no further processing. MVS will acknowledge the presence of the steps remaining after
the step that failed, but will not process them. EVEN and ONLY are used under such cases. EVEN and ONLY prevents MVS from flushing out the rest of the steps when an abend occurs and prevents exiting the program.
If COND=EVEN is coded on an EXEC statement, MVS will process the step even when the job was
already put into abend mode by the failure of a previous step.
If COND=ONLY is coded, MVS will process the step only if the job is in abend mode. Such a step
EVEN or ONLY can be used along with normal COND CODE test.
In this example, MVS will process STEP4 even if a previous step bends.
EVEN and ONLY do not guarantee that a Job step will be executed if a previous step has abended. Only control comes to this step and then a check of all JOB and EXEC level COND parameters are done before actually executing the step.
Step is processed, Return code tests can cause step to be skipped. Step is processed, return code tests can cause step to be skipped.
Step is acknowledged but not processed. Step is processed Return code tests can cause step to be skipped. Step is processed Return code tests can cause step to be skipped.
COND=EVEN
COND=ONLY
IF/THEN/ELSE/ENDIF
The way you code the IF/THEN/ELSE/ENDIF statement construct determines whether the statement construct tests all job steps, a single job step, or a procedure step .
You can code the IF/THEN/ELSE/ENDIF statement construct anywhere in the job after the JOB statement. Code it as follows:
IF
ELSE
ENDIF
//STEP1
//SYSPRINT //SYSIN
EXEC
DD DD
PGM=IDCAMS
SYSOUT=* *
For the above example given, first it does the repro (copy) for the files cobol.source.file2, cobol.source.file4 from the files cobol.source.file1, cobol.source.file3, if MaxCC is greater than zero then set that to 16 i.e. (MaxCC=16), else it will delete the input datasets.
//STEP3
//ENDTEST //NEXTSTEP
EXEC PGM=U
ENDIF EXEC
The system executes STEP3 if The return code from STEP1 is greater than 20, or the return code from STEP2 equals 60. If the evaluation of the relational expression is false, the system bypasses STEP3 and continues processing with step NEXTSTEP.
(STEP4.LINK.ABEND=FALSE) THEN
PGM=ERRTN
The relational expression tests that an ABEND did not occur in procedure LINK, called by the EXEC statement in STEP4. If the relational expression is true, no ABEND occurred. The null THEN statement passes control to step NEXTSTEP. If the relational expression is false, an ABEND occurred. The ELSE clause passes control to the program called ERRTN. This example implies the following naming convention STEP4.LINK.ABEND=FALSE is how you would test for an ABEND in STEP4.LINK meaning that you type the job step and procstep followed by a dot (.) and the work ABEND.
Example 3: This example tests for a user abend completion code in the job.
PGM=CLEANUP
If any job step produced the user abend completion code 0100, the EXEC statement GOAHEAD calls the procedure CONTINUE. If no steps produced the completion code, the EXEC statement EXIT calls program CLEANUP.
REPRO
For the above example given, first it does the repro (copy) for the files cobol.source.file2, cobol.source.file4 from the files cobol.source.file1, cobol.source.file3, if MaxCC is greater than zero then set that to 16 i.e. (MaxCC=16), else it will delete the input datasets.
DELETE(COBOL.SOURCE.FILE3)
Comparison operators (GT, LT, etc.) compare a relational expression keyword to a numeric value. The comparison results in a true or false condition.
The logical operators & (AND) and | (OR) indicate that the system should evaluate the Boolean result of two or more relational expressions.
Relational expression keywords indicate that you are evaluating a return code, ABEND condition, or ABEND completion code.
The THEN clause or ELSE clause must contain at least one EXEC statement. The EXEC statement indicates a job step that the system executes based on its evaluation of the relational expression. A THEN or ELSE clause that does not contain an EXEC statement is a null clause.
Example 1: This example tests the return code for a step. //RCTEST //STEP3 //ENDTEST //NEXTSTEP IF (STEP1.RC GT 20|STEP2.RC = 60) THEN
The system executes STEP3 if: The return code from STEP1 is greater than 20, or The return code from STEP2 equals 60.
If the evaluation of the relational expression is false, the system bypasses STEP3 and continues processing with step NEXTSTEP.
UNIT 8
GDG
Objectives
A Generation Data Group (GDG) consists of like-named data sets that are chronologically or functionally related. A data set in a GDG is called a generation.
You can only catalog one entry of a particular dataset name. In other words, once a dataset (ABC.DATA for example) is cataloged, you cannot catalog a new version of that dataset (another ABC.DATA).
Case1: You attempt to catalog a new data set with the same name as an existing data set. CATALOG ERROR1 NAME ALREADY IN THE CATALOG.
Case2: You keep the new data set with the same name.
Case3: You catalog or keep the data set with different names. JCL STATEMENT MUST BE CHANGED TO THE NEW NAMES
PURPOSE OF GDGs:
For datasets that get created on a daily basis, GDGs allow you to create new versions of a dataset where the base name of the dataset remains the same, and a new generation number gets tagged onto the end of each new version of the dataset name.
One example of GDG use might be a daily transaction log. Each day a new file is created showing the transactions of that day. The base name of the transaction log might be TRANS.LOG, where the actual generations would be called TRANS.LOG.G0001V00, TRANS.LOG.G0002V00, TRANS.LOG.G0003V00, etc.
DSN=ABD.DAILY.TRANS(+n)DSN=ABC.DAILY.TRANS.GxxxxVyy (+n) Add a new generationGxxxxVyy: (+0) Use current generation numberxxxxGeneration number (-n) Use an old generationyyVersion number
EXAMPLE DSN=ABC.DAILY.TRANS(+1)DSN=ABC.DAILY.TRANS.G0053V00
Absolute Data Set Name: The absolute data set name is the true data set name you would see on the volume table of contents
(VTOC).
The Format is: DSN = NAME.GDG.G0052V00 VERSION NUMBER
GENERATION NUMBER
Possible Formats (+n) Create a new generation by adding n to the current generation in the catalog
DSN=NAME.GDG(+1)
(0) Use the current generation in the catalog DSN=NAME.GDG(0)
(-n)
DSN=NAME.GDG(-1)
Example
Current Catalog Entries ABC.TRANS.DAILY.G0053V00
ABC.TRANS.DAILY.G0052V00
ABC.TRANS.DAILY.G0051V00 With the current catalog entries shown above, the following GDGs would be translated as shown:
Dataset Translates to
DSN=ABC.TRANS.DAILY(-1),DISP=OLD ABC.TRANS.DAILY.G0052V00
The current generation in the catalog is G0053V00. Since 53 1 = 52, G0052V00 is the generation requested. This is common when reading the previous cycles file.
The current generation in the catalog is G0053V00. This is used to read the most current file available.
DSN=ABC.TRANS.DAILY(+1),DISP=(NEW,CATLG)
ABC.TRANS.DAILY.G0054V00
The current generation in the catalog is G0053V00. Since 53 + 1 = 54, G0054V00 is the generation requested. This is used when creating a new file for the current cycle.
IBM does not use the V00 or Version number. The version number is set to V00 with the first generation. If a generation is damaged and needs to be replaced, an installation can code the absolute name with a new version number, to replace the damaged generation, such as //INDD //OUTDD DD DSN=NAME.GDG.G0052V00,DISP=OLD DD DSN=NAME.GDG.G0052V01,DISP=(,CATLG)
There are five control statement parameters which are used in creating a GDG base catalog entry. They are:
LIMIT EMPTY
Maximum number of generations allowed for this GDG entry When limit is exceeded, uncatalog all generations. When limit is exceeded, uncatalog oldest entry only
NOEMPTY
SCRATCHDelete any uncataloged generation. NOSCRATCH Do not delete any uncataloged generation.
The model DSCB (//DSCB in the example above) ensures that the same DCB and EXPDT information is used to create all generations. This ensures greater consistency among generations.
The model DSCB must be allocated with Zero space, and it cannot be cataloged.
The model DSCB must also lie on the same volume where the base catalog entry is cataloged.
+0 -1 -2 -3 -4 -5 -6
Notice that the catalog entry operates like a pushdown stack. As new generations get created, the relative numbers for existing generations changes
TEST.GDG
+0
G0001
TEST.GDG.G0001V00
As the first generation of the generation data group named TEST.GDG is created:
The GDG Base must be created prior to creating any generation of the dataset
TEST.GDG
+0 -1
G0002 G0001
TEST.GDG.G0002V00 TEST.GDG.G0001V00
As the second generation of the generation data group named TEST.GDG is created:
The current generation (0) is used as input. You are not required to code the plus sign with the zero (+0), a zero without the plus sign (0) is acceptable and commonly used. A new generation (+1) is created. Notice that the catalog entry operates like a push-down stack. Generation G0001V00 is now the (-1) generation.
TEST.GDG
+0 -1 -2
As the third generation of the generation data group named TEST.GDG is created:
The current generation (0) is used as input. A new generation (+1) is created. Notice that the catalog entry operates like a pushdown stack.
Once a GDG reaches the number of generations defined in its LIMIT, the oldest generation rolls off the catalog as a new generation gets created.
+0 -1 -2
As the fourth generation of the generation data group named TEST.GDG is created: The current generation (0) is used as input.
Since NOSCRATCH was specified, this generation will be kept, though it will no longer be cataloged
Other Notes If the generations are SMS managed, this generation will remain in the catalog. If the generations were NN-SMS managed, the generation would have been uncataloged. The maximum no. of generations that MVS can manage for a data set is 255.
--------------
----------
STEP1
A GDGALL request (DSN=A.AIR) is IBMs terminology for automatic concatenation of ALL generations currently in the catalog. The (+1) generation in DD OUT1 creates a new generation.
STEP3
Notice that the (+1) generation is now OLD. Even though that generation was cataloged in STEP1, and the catalog pushed down, you do not adjust the relative generation numbers within the same job. The system does that internally. As additional generations are specified in this step, increment the relative generation number. An increment of 1 is shown, but any increment can be used.
Notes
Relative GDG numbers are not updated until end of job, therefore the relative numbers are held constant throughout a single job.
Use DISP=OLD when processing a GDG to prevent other jobs (on the same system) from processing the same GDG at the same time.
When creating a new non-SMS-managed generation data set, always code the parameters
VOLUME
SPACE
LABEL DCB
In the DSNAME parameter, code the name of the GDG followed by a number, +1 to +255, in parentheses.
If this is the first dataset being added to a GDG in the job, code +1 in parentheses. Each time in the job you add a dataset to the same GDG, increase the number by one.
When referring to this data set in a subsequent job step, code the relative generation number used to create it on the DSNAME parameter. You cannot refer to the dataset in the same step in which it was created.
At the end of the job, the system updates the relative generation numbers of all generations in the group to reflect the additions.
Use the DELETE parameter of the IDCAMS utility to delete a GDG from the catalog, such as: //MODAL2 //STEP1 //SYSPRINT JOB EXEC DD 0.2AMIP PGM=IDCAMS SYSOUT=*
//SYSIN
DELETE /* //
DD
*
FORCE
ABC.DATA.MONTHLY
In this example the GDG called ABC.DATA.MONTHLY is deleted. The FORCE parameter physically purges all entries related to GDG.
UNIT 9
SMS
Advantages of SMS
SMS Constructs
Specifying Constructs
Objectives
Storage Management Subsystem (SMS) is an optional feature of MVS, which is used to improve the management of available disk space in the data center.
In JCL, normally the developer must specify allocation attributes of datasets, such as the size and location about the data sets, to the operating systems. If they dont allocate files correctly, this can lead to wasted disk space, and makes it difficult to manage the DASD in the data center.
ADVANTAGES OF SMS
SMS managed data sets have several advantages:
Users are relieved of making decisions about the resource allocation of datasets, since it is handled by SMS. SMS provides the capability of concatenating data sets of unlike devices.
SMS Managed data sets cannot be deleted unless they are first uncataloged Due to this extra step, erroneous deletion of data sets is minimized.
Additional features are available in the use of IDCAMS in the SMS environment.
VSAM data sets created in an SMS environment offer more flexibility than those created through JCL in a nonSMS environment. With SMS, the system obtains information about the attributes of a data set from the data class
for the data set. In many cases, the attributes defined in the data class, selected by an installationwritten automatic class selection (ACS) routine, are sufficient for the data sets you create with DD statements.
(record format)
(record length) (average record length, primary, secondary, and directory quantity) (volume-count)
AVGREC
RETPD (retention period) or EXPDT (expiration date) DSNTYPE (data set type, PDS or PDSE
The above parameters are also JCL parameters, but which are used in VSAM.
The storage administrator at your installation defines the names of data classes and their data set attributes.
To view a list of data class names and their attributes, use the Interactive Storage
SMS Constructs
With SMS, a new data set can have one or more of the following three constructs:
Data class - contains the data set attributes related to the allocation of the data set.
Management class - contains the data set attributes related to the migration and backup of the data set. A management class can only be assigned to a data set that also has a storage
class assigned.
Storage class - contains the data set attributes related to the storage occupied by the data set. A data set that has a storage class assigned is defined as an SMS-managed data set".
The storage administrator at your installation writes the automatic class selection (ACS)
routines that SMS uses to assign the constructs to a new data set.
For example, with SMS you can code the DDNAME, DSNAME, and DISP parameters to
define a new data set: //SMSDS0 DD DSNAME=MYDS0.PGM,DISP=(NEW,KEEP)
//SMSDSR
DD
DSNAME=MYDS0.PGM,DISP=MOD
In the example, installation-written ACS routines (possibly based on the data set name and information from your JOB, EXEC, and DD statements) can select a data class,
management class, and storage class appropriate for the data set.
You code only the ddname, dsname, and disposition of the data set. The constructs selected by the ACS routines contain all the other attributes needed to manage the data set
Specifying Constructs
In many cases, the constructs selected by the installation-written ACS routines are sufficient for your data sets.
However, when defining a new data set, you can select a data class, management class, or storage class by coding one or more of the following DD parameters:
The storage administrator has defined the names of the classes you can specify. You can view the names and attributes defined in each of the named classes by using ISMF
Unit 9 Exercises
1. SMS stands for ________________ ____________________ _________________. 2. 3. 4. ________ contains allocation attributes that describe the logical data format. _______ contains desired performance and availability objectives. _________ defines a list of volumes for data allocation.