COBOL - 内部排序

  • 简述

    在几乎所有面向业务的应用程序中,对文件中的数据进行排序或合并两个或多个文件是一种常见的需求。排序用于按升序或降序排列记录,以便执行顺序处理。有两种技术用于在 COBOL 中对文件进行排序 -
    • External sort用于使用 JCL 中的 SORT 实用程序对文件进行排序。我们已经在 J​​CL 章节中讨论过这个问题。到目前为止,我们将专注于内部排序。
    • Internal sort用于在 COBOL 程序中对文件进行排序。SORT动词用于对文件进行排序。
  • 排序动词

    COBOL 的排序过程中使用了三个文件 -
    • Input file是我们必须按升序或降序排序的文件。
    • Work file用于在排序过程进行时保存记录。输入文件记录被传输到工作文件以进行排序过程。该文件应在 SD 条目下的文件部分中定义。
    • Output file是我们在排序过程之后得到的文件。它是排序动词的最终输出。

    句法

    以下是对文件进行排序的语法 -
    
    SORT work-file ON ASCENDING KEY rec-key1
       [ON DESCENDING KEY rec-key2]
    USING input-file GIVING output-file.
    
    SORT 执行以下操作 -
    • 在 IO 模式下打开工作文件,在 INPUT 模式下打开输入文件,在 OUTPUT 模式下打开输出文件。
    • 将输入文件中存在的记录传输到工作文件。
    • 通过 rec-key 以升序/降序对 SORT-FILE 进行排序。
    • 将排序的记录从工作文件传输到输出文件。
    • 关闭输入文件和输出文件并删除工作文件。
    Example
    在以下示例中,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 语句组合两个或多个相同顺序的文件。合并过程中使用的文件 -
    • 输入文件 - Input-1,Input-2
    • 工作档案
    • 输出文件

    句法

    以下是合并两个或多个文件的语法 -
    
    MERGE work-file ON ASCENDING KEY rec-key1
       [ON DESCENDING KEY rec-key2]
    USING input-1, input-2 GIVING output-file.
    
    合并执行以下操作 -
    • 在 IO 模式下打开工作文件,在 INPUT 模式下打开输入文件,在 OUTPUT 模式下打开输出文件。
    • 将输入文件中存在的记录传输到工作文件。
    • 通过 rec-key 以升序/降序对 SORT-FILE 进行排序。
    • 将排序的记录从工作文件传输到输出文件。
    • 关闭输入文件和输出文件并删除工作文件。
    Example
    在以下示例中,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