C16-COBOL 内部排序

COBOL 内部排序

在几乎所有面向业务的应用程序中,对文件中的数据进行排序或合并两个或多个文件是常见的需求。排序是用于以升序或降序排列记录,以便可以执行顺序处理。有两种技术用于在COBOL中排序文件:

  • **外部排序:**通过使用JCL中的SORT工具对文件进行排序。我们已经在JCL章节中讨论过。目前,我们将关注内部排序。
  • **内部排序:**用于对COBOL程序内的文件进行排序。SORT动词用于对文件进行排序。

Sort(排序)动词

在COBOL的排序进程中使用的三个文件:

  • **Input file:**是我们必须按升序或降序排序的文件。
  • **Work file:**用于在排序进程正在进行时保存记录。输入文件记录被传送到工作文件进行排序进程。该文件应该在SD条目下的文件节(file section)中定义。
  • **Output file:**是我们在排序进程之后得到的文件。它是排序动词的最终输出。

语法

以下是排序文件的语法:

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

SORT执行以下操作:

  • 在I-O模式下打开work-file,在INPUT模式下打开input-file,在OUTPUT模式下打开output-file。
  • 将input-file中存在的记录传送到work-file。
  • 通过rec-key按升序/降序排序SORT-FILE。
  • 将排序的记录从work-file传送到output-file。
  • 关闭input-file和output-file,删除work-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(合并)动词

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

  • 输入文件:Input-1,Input-2
  • 工作文件:work-file
  • 输出文件:output-file

语法

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

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

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

MERGE执行以下操作:

  • 在I-O模式下打开work-file,在INPUT模式下打开input-file,在OUTPUT模式下打开output-file。
  • 将input-file中存在的记录传送到work-file。
  • 通过rec-key按升序/降序排序SORT-FILE。
  • 将排序的记录从work-file传送到output-file。
  • 关闭input-file和output-file,删除work-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

你可能感兴趣的:(cobol,cobol)