- JCL 教程
- JCL 首页
- JCL - 概述
- JCL - 环境
- JCL - JOB 语句
- JCL - EXEC 语句
- JCL - DD 语句
- JCL - 基本库
- JCL - 过程
- JCL - 条件处理
- JCL - 定义数据集
- JCL - 输入/输出方法
- JCL - 运行 COBOL 程序
- JCL - 实用程序
- JCL - 基本排序技巧
- JCL 有用资源
- JCL - 问答
- JCL - 快速指南
- JCL - 有用资源
- JCL - 讨论
JCL - 基本排序技巧
下面说明了企业世界中可以使用实用程序实现的日常应用需求。
1. 一个文件有 100 条记录。需要将前 10 条记录写入输出文件。
//JSTEP020 EXEC PGM=ICETOOL //TOOLMSG DD SYSOUT=* //DFSMSG DD SYSOUT=* //IN1 DD DSN=MYDATA.URMI.STOPAFT,DISP=SHR //OUT1 DD SYSOUT=* //TOOLIN DD * COPY FROM(IN1) TO(OUT1) USING(CTL1) /* //CTL1CNTL DD * OPTION STOPAFT=10 /*
STOPAFT 选项将在读取第 10 条记录后停止读取输入文件并终止程序。因此,10 条记录被写入输出。
2. 输入文件对同一员工编号有一条或多条记录。将唯一记录写入输出。
//STEP010 EXEC PGM=SORT //SYSOUT DD SYSOUT=* //SORTIN DD DSN=MYDATA.URMI.DUPIN,DISP=SHR //SORTOUT DD SYSOUT=* //SYSIN DD * SORT FIELDS=(1,15,ZD,A) SUM FIELDS=NONE /*
SUM FIELDS=NONE 删除在 SORT FIELDS 中指定的字段上的重复项。在上面的示例中,员工编号位于字段位置 1,15。输出文件将包含按升序排序的唯一员工编号。
3. 覆盖输入记录内容。
//JSTEP010 EXEC PGM=SORT //SORTIN DD DSN= MYDATA.URMI.SAMPLE.MAIN,DISP=SHR //SORTOUT DD SYSOUT=* //SYSPRINT DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSIN DD * OPTION COPY INREC OVERLAY=(47:1,6) /*
在输入文件中,位置 1,6 中的内容被覆盖到位置 47,6,然后复制到输出文件。为了在复制到输出之前重写输入文件中的数据,使用了 INREC OVERLAY 操作。
4. 向输出文件添加序列号。
//JSTEP010 EXEC PGM=SORT //SORTIN DD * data1 data2 data3 /* //SORTOUT DD SYSOUT=* //SYSPRINT DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSIN DD * OPTION COPY BUILD=(1:1,5,10:SEQNUM,4,ZD,START=1000,INCR=2) /*
输出将是
data1 1000 data2 1002 data3 1004
在输出的第 10 个位置添加 4 位序列号,从 1000 开始,每条记录递增 2。
5. 向输出文件添加页眉/页脚。
//JSTEP010 EXEC PGM=SORT //SORTIN DD * data1 data2 data3 /* //SORTOUT DD SYSOUT=* //SYSPRINT DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSIN DD * SORT FIELDS=COPY OUTFIL REMOVECC, HEADER1=(1:C'HDR',10:X'020110131C'), TRAILER1=(1:C'TRL',TOT=(10,9,PD,TO=PD,LENGTH=9)) /*
输出将是
HDR 20110131 data1 data2 data3 TRL 000000003
TOT 计算输入文件中的记录数。HDR 和 TRL 作为页眉/页脚的标识符添加,它是用户定义的,可以根据用户的需求进行自定义。
6. 条件处理
//JSTEP010 EXEC PGM=SORT //SORTIN DD * data1select data2 data3select /* //SORTOUT DD SYSOUT=* //SYSPRINT DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSIN DD * INREC IFTHEN=(WHEN=(6,1,CH,NE,C' '),BUILD=(1:1,15), IFTHEN=(WHEN=(6,1,CH,EQ,C' '),BUILD=(1:1,5,7:C'EMPTY ') OPTION COPY /*
输出将是
data1select data2 EMPTY data3select
根据文件的第 6 个位置,输出文件的构建方式不同。如果第 6 个位置为空格,则将文本“EMPTY”附加到输入记录。否则,输入记录按原样写入输出。
7. 备份文件
//JSTEP001 EXEC PGM=IEBGENER //SYSPRINT DD SYSOUT=* //SYSIN DD * //SYSOUT DD SYSOUT=* //SORTOUT DD DUMMY //SYSUT1 DD DSN=MYDATA.URMI.ORIG,DISP=SHR //SYSUT2 DD DSN=MYDATA.URMI.BACKUP,DISP=(NEW,CATLG,DELETE), // DCB=*.SYSUT1,SPACE=(CYL,(50,1),RLSE)
IEBGENER 将 SYSUT1 中的文件复制到 SYSUT2 中的文件。请注意,SYSUT2 中的文件采用与上述示例中 SYSUT1 相同的 DCB。
8. 文件比较
//STEP010 EXEC PGM=SORT //MAIN DD * 1000 1001 1003 1005 //LOOKUP DD * 1000 1002 1003 //MATCH DD DSN=MYDATA.URMI.SAMPLE.MATCH,DISP=OLD //NOMATCH1 DD DSN=MYDATA.URMI.SAMPLE.NOMATCH1,DISP=OLD //NOMATCH2 DD DSN=MYDATA.URMI.SAMPLE.NOMATCH2,DISP=OLD //SYSOUT DD SYSOUT=* //SYSIN DD * JOINKEYS F1=MAIN,FIELDS=(1,4,A) JOINKEYS F2=LOOKUP,FIELDS=(1,4,A) JOIN UNPAIRED,F1,F2 REFORMAT FIELDS=(?,F1:1,4,F2:1,4) OPTION COPY OUTFIL FNAMES=MATCH,INCLUDE=(1,1,CH,EQ,C'B'),BUILD=(1:2,4) OUTFIL FNAMES=NOMATCH1,INCLUDE=(1,1,CH,EQ,C'1'),BUILD=(1:2,4) OUTFIL FNAMES=NOMATCH2,INCLUDE=(1,1,CH,EQ,C'2'),BUILD=(1:2,4) /*
JOINKEYS 指定比较两个文件的字段。
REFORMAT FIELDS=? 将 'B'(匹配的记录)、'1'(存在于文件 1 中,但不存在于文件 2 中)或 '2'(存在于文件 2 中,但不存在于文件 1 中)放在输出构建的第 1 个位置。
JOIN UNPAIRED 对两个文件执行完全外部联接。
输出将是
MATCH File 1000 1003 NOMATCH1 File 1001 1005 NOMATCH2 File 1002
也可以使用 ICETOOL 实现相同的功能。