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.