COBOL - 内部排序

在几乎所有面向业务的应用程序中,对文件中的数据进行排序或合并两个或多个文件是一项常见的必要条件.排序用于按升序或降序排列记录,以便可以执行顺序处理.有两种技术用于在COBOL&minus中对文件进行排序;

  • 外部排序是用于在JCL中使用SORT实用程序对文件进行排序.我们在JCL章节中已经讨论过这个问题.截至目前,我们将重点关注内部排序.
  • 内部排序用于对COBOL程序中的文件进行排序. SORT 动词用于对文件进行排序.

排序动词

在COBOL中的排序过程中使用了三个文件;

  • 输入文件是我们必须按升序或降序排序的文件.
  • 工作文件用于在排序过程中保存记录正在处理.输入文件记录将传输到工作文件以进行排序过程.该文件应在SD条目下的文件部分中定义.
  • 输出文件是我们在排序后得到的文件处理.它是Sort动词的最终输出.

语法

以下是语法排序文件 :

SORT work-file ON ASCENDING KEY rec-key1
   [ON DESCENDING KEY rec-key2]
USING input-file GIVING output-file.

SORT执行以下操作 :

  • 在IO模式下打开工作文件,在INPUT模式下打开输入文件,在OUTPUT模式下打开输出文件.
  • 传输输入中的记录-file到工作文件.
  • 通过rec-key按升序/降序对SORT-FILE进行排序.
  • 将已排序的记录从工作文件传输到输出文件.
  • 关闭输入文件和输出-file并删除工作文件.

示例

在以下示例中,INPUT是输入文件,需要按升序排序;

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
      SELECT INPUT ASSIGN TO IN.
      SELECT OUTPUT ASSIGN TO OUT.
      SELECT WORK ASSIGN TO WRK.

DATA DIVISION.
   FILE SECTION.
   FD INPUT.
      01 INPUT-STUDENT.
         05 STUDENT-ID-I PIC 9(5).
         05 STUDENT-NAME-I PIC A(25).
   FD OUTPUT.
      01 OUTPUT-STUDENT.
         05 STUDENT-ID-O PIC 9(5).
         05 STUDENT-NAME-O PIC A(25).
   SD WORK.
      01 WORK-STUDENT.
         05 STUDENT-ID-W PIC 9(5).
         05 STUDENT-NAME-W PIC A(25).

PROCEDURE DIVISION.
   SORT WORK ON ASCENDING KEY STUDENT-ID-O
   USING INPUT GIVING OUTPUT.
   DISPLAY 'Sort Successful'.
STOP RUN.

JCL 执行上述COBOL程序 :

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//IN DD DSN = INPUT-FILE-NAME,DISP = SHR
//OUT DD DSN = OUTPUT-FILE-NAME,DISP = SHR
//WRK DD DSN = &&TEMP

编译并执行上述程序时,它会产生以下结果 :

Sort Successful

合并动词

使用Merge语句合并两个或多个相同顺序的文件.合并过程中使用的文件 :

  • 输入文件 : 输入1,输入-2
  • 工作文件
  • 输出文件

语法

以下是合并两个或多个文件的语法 :

MERGE work-file ON ASCENDING KEY rec-key1
   [ON DESCENDING KEY rec-key2]

USING input-1, input-2 GIVING output-file.

合并执行以下操作 :

  • 在IO模式下打开工作文件,在INTPUT模式下输入文件,在OUTPUT模式下打开输出文件.
  • 传输存在于输入文件到工作文件.
  • 通过rec-key按升序/降序排序SORT-FILE.
  • 将已排序的记录从工作文件传输到输出文件.
  • 关闭输入文件和输出文件并删除工作文件.

示例

在下面的示例中,INPUT1和INPUT2是要按升序和减号合并的输入文件;

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
      SELECT INPUT1 ASSIGN TO IN1.
      SELECT INPUT2 ASSIGN TO IN2.
      SELECT OUTPUT ASSIGN TO OUT.
      SELECT WORK ASSIGN TO WRK.

DATA DIVISION.
   FILE SECTION.
   FD INPUT1.
      01 INPUT1-STUDENT.
         05 STUDENT-ID-I1 PIC 9(5).
         05 STUDENT-NAME-I1 PIC A(25).
   FD INPUT2.
      01 INPUT2-STUDENT.
         05 STUDENT-ID-I2 PIC 9(5).
         05 STUDENT-NAME-I2 PIC A(25).
   FD OUTPUT.
      01 OUTPUT-STUDENT.
         05 STUDENT-ID-O PIC 9(5).
         05 STUDENT-NAME-O PIC A(25).
   SD WORK.
      01 WORK-STUDENT.
         05 STUDENT-ID-W PIC 9(5).
         05 STUDENT-NAME-W PIC A(25).

PROCEDURE DIVISION.
   MERGE WORK ON ASCENDING KEY STUDENT-ID-O
   USING INPUT1, INPUT2 GIVING OUTPUT.
   DISPLAY 'Merge Successful'.
STOP RUN.
JCL 执行上述COBOL程序 :
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//IN1 DD DSN=INPUT1-FILE-NAME,DISP=SHR
//IN2 DD DSN=INPUT2-FILE-NAME,DISP=SHR
//OUT DD DSN = OUTPUT-FILE-NAME,DISP=SHR
//WRK DD DSN = &&TEMP

编译并执行上述程序时,会产生以下结果 :

Merge Successful