在 JCL 中,通常使用 &(& 符号)后跟变量名来创建符号参数。
但是在数据集名称中,它必须在变量名称后面加上点号。例子:
//J&USER JOB 1
//MYSTEP EXEC PGM=MYPROG
//MYDATA DD DSN=&USER..MYCLASS.COOL
为什么呢?怕以后不一致,所以才问这个问题。感谢您提前提供任何帮助。
就像符号参数的开头用 & 符号标记一样。它可以由空格或句点终止。当以句点结尾时,句点不是名称的一部分(就像开头的&符号不是)。
当整个字符串被符号参数替换时,它只是按原样编码:
// SET MYPROG=FRED
//RUNIT EXEC PGM=&MYPROG
这里&MYPROG
被替换为它的值,FRED
。确定符号名称的开始或结束位置没有问题。现在假设您要运行 3 个程序FRED1
:FRED2
和FRED3
. 您可以执行以下操作:
//RUN3 EXEC PGM=&MYPROG.3
在这里,程序FRED3
正在运行。符号MYPROG
以句点结尾,等于FRED
,文本的其余部分被添加到此FRED3
。
在数据集名称中使用符号参数时同样适用。第一个句点用于终止符号名称,下一个句点是数据集名称本身的一部分。例如,如果 symbolUSER
的计算结果为
ABC123
,则
//MYDSN DD DSN=&USER..MYDATA
评估ABC123.MYDATA
为数据集名称。相似地,
//MYDSN DD DSN=&USER.X.MYDATA
计算结果为:ABC123X.MYDATA
请注意,生成的 DSN 有一个句点,因为第一个句点终止了符号名称并且不是结果的一部分。
简单来说,如果一个符号参数后跟一个句点 (.),则需要添加一个额外的句点 (.),从而产生 2 个句点 (.)。
根据您的情况,您必须使用两个句点 (.) 是正确的。
这个讨论说第一个句点用于连接,而其他一些人说它是符号变量终止的一部分。但这并不重要。第二个句点成为数据集名称的一部分。
如果&USER解析为USR01,那么它将被解释为
//JUSR01 JOB 1
//MYSTEP EXEC PGM=MYPROG
//MYDATA DD DSN=USR01.MYCLASS.COOL
您的数据集中只会使用第二个周期。
但是,想象一下如果你有这样的事情,会发生什么
//MYDATA DD DSN=&USER.MYCLASS.COOL
数据集类似于USR01MYCLASS.COOL。这是一个错误,因为每个级别不应超过 8 个字符。