JCL - Prozeduren
Das JCL Proceduressind eine Reihe von Anweisungen innerhalb einer JCL, die zusammengefasst sind, um eine bestimmte Funktion auszuführen. Normalerweise wird der feste Teil der JCL in einer Prozedur codiert. Der unterschiedliche Teil des Jobs ist in der JCL codiert.
Sie können eine Prozedur verwenden, um eine parallele Ausführung eines Programms mit mehreren Eingabedateien zu erreichen. Für jede Eingabedatei kann eine JCL erstellt werden, und eine einzelne Prozedur kann gleichzeitig aufgerufen werden, indem der Name der Eingabedatei als symbolischer Parameter übergeben wird.
Syntax
Im Folgenden finden Sie die grundlegende Syntax einer JCL-Prozedurdefinition:
//*
//Step-name EXEC procedure name
Der Inhalt der Prozedur wird in der JCL für eine Instream-Prozedur gespeichert. Der Inhalt wird für eine katalogisierte Prozedur in einem anderen Mitglied der Basisbibliothek gespeichert. In diesem Kapitel werden zwei Arten von Prozeduren erläutert, die in JCL verfügbar sind, und schließlich werden wir sehen, wie wir verschiedene Prozeduren verschachteln können.
Instream-Prozedur
Wenn die Prozedur innerhalb desselben JCL-Mitglieds codiert ist, wird sie als Instream-Prozedur bezeichnet. Es sollte mit einer PROC-Anweisung beginnen und mit einer PEND-Anweisung enden.
//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID
//*
//INSTPROC PROC //*START OF PROCEDURE
//PROC1 EXEC PGM=SORT
//SORTIN DD DSN=&DSNAME,DISP=SHR
//SORTOUT DD SYSOUT=*MYINCL
//SYSOUT DD SYSOUT=*
//SYSIN DD DSN=&DATAC LRECL=80
// PEND //*END OF PROCEDURE
//*
//STEP1 EXEC INSTPROC,DSNME=MYDATA.URMI.INPUT1,
// DATAC=MYDATA.BASE.LIB1(DATA1)
//*
//STEP2 EXEC INSTPROC,DSNME=MYDATA.URMI.INPUT2
// DATAC=MYDATA.BASE.LIB1(DATA1)
//*
Im obigen Beispiel wird die Prozedur INSTPROC in STEP1 und STEP2 unter Verwendung verschiedener Eingabedateien aufgerufen. Die Parameter DSNAME und DATAC können beim Aufrufen der Prozedur mit unterschiedlichen Werten codiert werden. Diese werden als aufgerufensymbolic parameters. Die variierenden Eingaben in die JCL wie Dateinamen, Datenkarten, PARM-Werte usw. werden als symbolische Parameter an Prozeduren übergeben.
Verwenden Sie beim Codieren symbolischer Parameter keine SCHLÜSSELWÖRTER, PARAMETER oder UNTERPARAMETER als symbolische Namen. Beispiel: Verwenden Sie nicht TIME = & TIME, aber ja, Sie können TIME = & TM verwenden, und dies wird als richtige Methode zur Codierung von Symbolen angenommen.
Benutzerdefinierte symbolische Parameter werden aufgerufen JCL Symbols. Es werden bestimmte Symbole genanntsystem symbols, die für die Ausführung von Anmeldejobs verwendet werden. Das einzige Systemsymbol, das von normalen Benutzern in Stapeljobs verwendet wird, ist&SYSUID und dies wird im Parameter NOTIFY in der JOB-Anweisung verwendet.
Katalogisierte Prozedur
Wenn die Prozedur von der JCL getrennt und in einem anderen Datenspeicher codiert wird, wird sie als a bezeichnet Cataloged Procedure. Eine PROC-Anweisung muss nicht unbedingt in einer katalogisierten Prozedur codiert werden. Das folgende Beispiel zeigt eine JCL, in der die CATLPROC-Prozedur aufgerufen wird:
//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID
//*
//STEP EXEC CATLPROC,PROG=CATPRC1,DSNME=MYDATA.URMI.INPUT
// DATAC=MYDATA.BASE.LIB1(DATA1)
Hier ist die Prozedur CATLPROC in MYCOBOL.BASE.LIB1 katalogisiert. PROG, DATAC und DSNAME werden als symbolische Parameter an die Prozedur CATLPROC übergeben.
//CATLPROC PROC PROG=,BASELB=MYCOBOL.BASE.LIB1
//*
//PROC1 EXEC PGM=&PROG
//STEPLIB DD DSN=&BASELB,DISP=SHR
//IN1 DD DSN=&DSNAME,DISP=SHR
//OUT1 DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSIN DD DSN=&DATAC
//*
Innerhalb der Prozedur werden die symbolischen Parameter PROG und BASELB codiert. Bitte beachten Sie, dass der PROG-Parameter innerhalb der Prozedur durch den Wert in der JCL überschrieben wird und daher PGM während der Ausführung den Wert CATPRC1 annimmt.
Verschachtelte Prozeduren
Das Aufrufen einer Prozedur innerhalb einer Prozedur wird als a bezeichnet nested procedure. Prozeduren können bis zu 15 Ebenen verschachtelt werden. Die Verschachtelung kann vollständig im Stream oder katalogisiert sein. Wir können keine Instream-Prozedur innerhalb einer katalogisierten Prozedur codieren.
//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID
//*
//SETNM SET DSNM1=INPUT1,DSNM2=OUTPUT1
//INSTPRC1 PROC //* START OF PROCEDURE 1
//STEP1 EXEC PGM=SORT,DISP=SHR
//SORTIN DD DSN=&DSNM1,DISP=SHR
//SORTOUT DD DSN=&DSNM2,DISP=(,PASS)
//SYSOUT DD SYSOUT=*
//SYSIN DD DSN=&DATAC
//*
//STEP2 EXEC PROC=INSTPRC2,DSNM2=MYDATA.URMI.OUTPUT2
// PEND //* END OF PROCEDURE 1
//*
//INSTPRC2 PROC //* START OF PROCEDURE 2
//STEP1 EXEC PGM=SORT
//SORTIN DD DSN=*.INSTPRC1.STEP1.SORTOUT
//SORTOUT DD DSN=&DSNM2,DISP=OLD
//SYSOUT DD SYSOUT=*
//SYSIN DD DSN=&DATAC
// PEND //* END OF PROCEDURE 2
//*
//JSTEP1 EXEC INSTPRC1,DSNM1=MYDATA.URMI.INPUT1,
// DATAC=MYDATA.BASE.LIB1(DATA1)
//*
Im obigen Beispiel ruft die JCL die Prozedur INSTPRC1 in JSTEP1 auf und die Prozedur INSTPRC2 wird innerhalb der Prozedur INSTPRC1 aufgerufen. Hier wird der Ausgang von INSTPRC1 (SORTOUT) als Eingang (SORTIN) an INSTPRC2 übergeben.
EIN SET statementwird verwendet, um häufig verwendete Symbolik über Jobschritte oder -prozeduren hinweg zu definieren. Es initialisiert die vorherigen Werte in den symbolischen Namen. Sie muss vor der ersten Verwendung der symbolischen Namen in der JCL definiert werden.
Schauen wir uns die folgende Beschreibung an, um etwas mehr über das obige Programm zu erfahren:
Der SET-Parameter initialisiert DSNM1 = INPUT1 und DSNM2 = OUTPUT1.
Wenn INSTPRC1 in JSTEP1 von JCL aufgerufen wird, ist DSNM1 = MYDATA.URMI.INPUT1 und DSNM2 = OUTPUT1. Das heißt, der in der SET-Anweisung initialisierte Wert wird mit dem in einem der Jobschritte / Prozeduren festgelegten Wert zurückgesetzt.
Wenn INSTPRC2 in STEP2 von INSTPRC1 aufgerufen wird, ist DSNM1 = MYDATA.URMI.INPUT1 und DSNM2 = MYDATA.URMI.OUTPUT2.