📅  最后修改于: 2023-12-03 14:43:05.403000             🧑  作者: Mango
JCL(Job Control Language)是IBM主机上运行批处理作业的一种语言,而JCL过程则是JCL中的一个重要概念,它类似于其他编程语言中的子程序或函数,可以将一段可重用的JCL代码逻辑封装在其中,简化批处理作业的编写过程。
创建JCL过程十分简单,只需要在JCL文件中定义一个PROC,并在其中填写相关参数即可。
例如,下面这段代码定义了一个名为“TESTPROC”的JCL过程,它接受两个参数,分别为INFILE和OUTFILE。
//TESTPROC PROC INFILE=,OUTFILE=
//STEP1 EXEC PGM=SORT
//SORTIN DD DSN=&INFILE,DISP=SHR
//SORTOUT DD DSN=&OUTFILE,DISP=(NEW,CATLG,DELETE),
// UNIT=DISK,SPACE=(TRK,(5,5),RLSE)
//SYSOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=(1,3,CH,A)
/*
//
在JCL文件中调用上述JCL过程,则需要使用以下语法:
//TESTJOB JOB ACCT#,CLASS=6,MSGCLASS=H,REGION=6M
//STEP1 EXEC TESTPROC,INFILE=IN.DAT,OUTFILE=OUT.DAT
其中,TESTJOB是整个作业的名称,STEP1是作业步骤的名称,EXEC TESTPROC则是调用JCL过程的语法,INFILE和OUTFILE是传递给JCL过程的参数名称及值。
在JCL过程中,可以使用两种方式来引用参数值。首先可以使用符号“&”将参数名称变为变量引用,例如“&INFILE”表示引用INFILE参数的值。
其次,还可以使用“&&”将变量引用变为可重用的变量,即JCL的“符号表”,以便在整个文件中共用。例如:
//MYPROC PROC INFILE=&INFILE,OUTFILE=&OUTFILE
//STEP1 EXEC PGM=SORT
//SORTIN DD DSN=&&INFILE,DISP=SHR
//SORTOUT DD DSN=&&OUTFILE,DISP=(NEW,CATLG,DELETE),
// UNIT=DISK,SPACE=(TRK,(5,5),RLSE)
//SYSOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=(1,3,CH,A)
/*
//
在JCL文件中调用上述JCL过程时,可以利用“&&”定义的符号表来传递参数,例如:
//MYJOB JOB ACCT#,CLASS=6,MSGCLASS=H,REGION=6M
//STEP1 EXEC MYPROC,INFILE=IN.DAT,OUTFILE=OUT.DAT
// ,&&INFILE=IN.DAT2,&&OUTFILE=OUT.DAT2
其中,MYJOB是整个批处理作业的名称,STEP1是作业步骤的名称,EXEC MYPROC则是调用JCL过程的语法。注意,第二行除了定义了传递给JCL过程的参数值,还利用“&&”定义了两个符号表项。
JCL过程的还支持IF/THEN/ELSE条件语句来动态地构建过程流程。例如:
//TESTPROC PROC INFILE=,OUTFILE=
//STEP1 EXEC PGM=IF,COND=((1,EQ,2),EVEN)
//OUT DD SYSOUT=*
//IN DD *
1
2
3
/*
//STEP2 EXEC PGM=SORT,COND=(0,EQ,EVEN)
//SORTIN DD DSN=&INFILE,DISP=SHR
//SORTOUT DD DSN=&OUTFILE,DISP=(NEW,CATLG,DELETE),
// UNIT=DISK,SPACE=(TRK,(5,5),RLSE)
//SYSOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=(1,3,CH,A)
/*
//
上述JCL过程中,STEP1的COND参数指定了条件表达式“((1,EQ,2),EVEN)”,即如果第一行输入为2,则执行跳转到EVEN标签处;否则执行下一条语句。因为第一行输入为1,因此会跳过STEP1,执行STEP2。
STEP2的COND参数指定了条件表达式“(0,EQ,EVEN)”,即如果上一步骤的返回码为偶数,则执行;否则跳过。由于STEP1跳过了,因此STEP2也会被跳过,不被执行。
总的来说,JCL过程有以下几个优点:
更加简单方便:JCL过程可以将可重用代码逻辑封装在一个过程中,方便重复使用,并减少了JCL文件中重复的代码量。
更好的维护性:将重复的代码抽象成JCL过程后,可以更容易地维护和修改。
更好的可读性:JCL过程可以将复杂的代码逻辑封装起来,以便于代码阅读和理解。
更灵活的控制:JCL过程支持IF/THEN/ELSE条件语句,以便动态地控制过程流程。
JCL过程是JCL编程中非常重要的概念之一,它能够将可重用的JCL代码逻辑封装在一个过程中,提高JCL文件的重用率、简洁性和维护性,同时还能动态地控制过程流程,从而使批处理作业编写变得更加简单和灵活。