COBOL - 内部排序
在几乎所有面向业务的应用程序中,对文件中的数据进行排序或合并两个或多个文件是常见的需要。 排序用于将记录按升序或降序排列,以便执行顺序处理。 COBOL 中有两种用于对文件进行排序的技术 −
外部排序用于通过使用JCL中的SORT实用程序对文件进行排序。 我们已在 JCL 章节中对此进行了讨论。 目前,我们将重点关注内部排序。
内部排序用于在 COBOL 程序中对文件进行排序。 SORT 动词用于对文件进行排序。
SORT 排序动词
COBOL 中的排序过程使用了三个文件 −
输入文件是我们必须按升序或降序排序的文件。
工作文件用于在排序过程进行时保存记录。 输入文件记录被传输到工作文件以进行排序过程。 该文件应在 SD 条目下的文件部分中定义。
输出文件是我们排序后得到的文件。 它是 Sort 动词的最终输出。
语法
以下是对文件进行排序的语法 −
SORT work-file ON ASCENDING KEY rec-key1 [ON DESCENDING KEY rec-key2] USING input-file GIVING output-file.
SORT 执行以下操作 −
在 I-O 模式下打开工作文件,在 INPUT 模式下打开输入文件,在 OUTPUT 模式下打开输出文件。
将输入文件中的记录传输到工作文件。
按 rec-key 对 SORT-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 合并动词
使用 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.
合并执行以下操作 −
在 I-O 模式下打开工作文件,在 INPUT 模式下打开输入文件,在 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