📜  JCL-基本排序技巧(1)

📅  最后修改于: 2023-12-03 15:02:07.297000             🧑  作者: Mango

JCL-基本排序技巧

JCL(Job Control Language)是IBM主要操作系统中的脚本语言,它被用于控制作业流程。JCL包含许多有用的指令,其中一种是排序指令。排序指令可以帮助程序员对数据集进行排序,以便更轻松地管理和处理数据。

排序指令

在JCL中,SORT指令用于对数据集进行排序。SORT指令可以根据用户指定的关键字对数据集中的记录进行排序。下面是一个典型的SORT指令:

//SORTJOB JOB account-info,other-info
//SORT EXEC PGM=SORT
//SORTIN DD DSN=data-set-name,DISP=SHR
//SORTOUT DD DSN=output-data-set-name,DISP=(NEW,CATLG,DELETE),UNIT=.....
//SYSOUT DD SYSOUT=*
//SYSIN DD *
   SORT FIELDS=(3,4,CH,A,5,2,PD,D)
/*

这里做一下解释:

  • SORTJOB:表示JOB卡,account-info是你从主机管理员处获取的系统账号,other-info是用户定义的其他信息如日期等。
  • SORT EXEC PGM=SORT:执行SORT程序。
  • SORTIN:输入的数据集名字和类型,DISP=SHR表示共享模式。
  • SORTOUT:排序后的输出数据集的名字,DISP=(NEW,CATLG,DELETE)表示新建、目录化、删除。
  • SYSOUT:表示SORT程序的输出。
  • SYSIN:SORT程序的输入。在这里,我们可以通过SYSIN控制我们的排序过程。
排序控制语句

SORT控制语句告诉SORT程序如何排序数据集。在SYSIN DD卡中,程序员可以按照自己的需要编写控制语句。下面是一些常用的控制语句:

  • SORT FIELDS=(field-position,length,type,order):按照指定关键字对数据集进行排序。其中field-position表示关键字的开始位置;length表示关键字的长度;type表示关键字的类型(如CH,ZD等);order表示排序的顺序(如A表示递增,D表示递减)。
  • INCLUDE/OMIT COND=(expression):利用表达式对排序数据集进行过滤,以便只选择满足条件的记录。
  • INREC/OUTREC:用于控制输入和输出数据集记录的格式,以使其可处理。
  • SUM FIELDS=(field-position,length,position,length,...):将关键字的唯一值合并为一个唯一值,并将其他字段的值累加。这对于数据集中的聚合和总计非常有用。
  • JOINKEYS:用于连接两个数据集。可以使用INNER JOIN,LEFT JOIN,RIGHT JOIN,FULL OUTER JOIN。
示例

下面是一些示例。这些示例假设有一个名为SORTIN的数据集,其中包含以下内容:

1234JOSHUA DAVE      1234.89
2345JORDAN JON       5678.25
3456BRYANT KOBE        45.50
4567OLAJUWON HAKEEM  1234.56
5678JAMES LEBRON      678.27
示例1:按照名字和薪水进行排序
//SORTJOB JOB account-info,other-info
//SORT EXEC PGM=SORT
//SORTIN DD DSN=data-set-name,DISP=SHR
//SORTOUT DD DSN=output-data-set-name,DISP=(NEW,CATLG,DELETE),UNIT=.....
//SYSOUT DD SYSOUT=*
//SYSIN DD *
   SORT FIELDS=(9,15,CH,A,24,7,PD,D)
/*

这里我们使用SORT指令,选择对SORTIN数据集进行排序,排序的关键字是第9个位置(长度为15)和第24个位置(长度为7),分别按照字母顺序和数字顺序进行排序。输出将是:

3456BRYANT KOBE        45.50
5678JAMES LEBRON      678.27
1234JOSHUA DAVE      1234.89
2345JORDAN JON       5678.25
4567OLAJUWON HAKEEM  1234.56
示例2:过滤掉特定的记录
//SORTJOB JOB account-info,other-info
//SORT EXEC PGM=SORT
//SORTIN DD DSN=data-set-name,DISP=SHR
//SORTOUT DD DSN=output-data-set-name,DISP=(NEW,CATLG,DELETE),UNIT=.....
//SYSOUT DD SYSOUT=*
//SYSIN DD *
   INCLUDE COND=(3,4,CH,EQ,C'BRYA')
   SORT FIELDS=(9,15,CH,A,24,7,PD,D)
/*

这里我们使用INCLUDE控制语句,过滤掉名字中包含“BRYA”的记录。输出将是:

4567OLAJUWON HAKEEM  1234.56
2345JORDAN JON       5678.25
示例3:合并并累加记录
//SORTJOB JOB account-info,other-info
//SORT EXEC PGM=SORT
//SORTIN DD DSN=data-set-name,DISP=SHR
//SUMOUT DD DSN=output-data-set-name,DISP=(NEW,CATLG,DELETE),UNIT=.....
//SYSOUT DD SYSOUT=*
//SYSIN DD *
   INREC OVERLAY=(25:1,8,ZD,M11,LENGTH=8)
   SORT FIELDS=(9,15,CH,A)
   SUM FIELDS=(25,8)
/*

这里我们使用INREC控制语句,将输入记录的前25个字节复制到输出记录的前25个位置,然后将输入记录的第1到8个字节作为数字字段合并到输出记录的第25个位置。排序完成后,程序将按名字对记录进行分组,找到每个名称的唯一值,并将其他位置的值累加。输出将是:

2345JORDAN JON            5678.25
3456BRYANT KOBE             45.50
4567OLAJUWON HAKEEM       1234.56
5678JAMES LEBRON           678.27
1234JOSHUA DAVE           1234.89
结论

在JCL中使用SORT指令可以对数据集进行排序,以方便程序员对数据进行处理。在编写SORT控制语句时,请务必考虑到您的业务需求,并确保您的代码正确性和性能。