内部排序( Internal Sort)
在几乎所有面向业务的应用程序中,对文件中的数据进行排序或合并两个或多个文件是常见的必要条件。 排序用于按升序或降序排列记录,以便可以执行顺序处理。 有两种技术可用于在COBOL中对文件进行排序 -
External sort用于通过使用JCL中的SORT实用程序对文件进行排序。 我们在JCL章节中讨论过这个问题。 截至目前,我们将专注于内部排序。
Internal sort用于对COBOL程序中的文件进行排序。 SORT动词用于对文件进行排序。
排序动词
COBOL中的排序过程中使用了三个文件 -
Input file是我们必须按升序或降序排序的文件。
Work file用于在排序过程进行时保存记录。 输入文件记录将传输到工作文件以进行排序过程。 该文件应在SD条目下的文件部分中定义。
Output file是我们在排序过程后得到的文件。 它是Sort动词的最终输出。
语法 (Syntax)
以下是对文件进行排序的语法 -
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语句组合两个或多个相同顺序的文件。 合并过程中使用的文件 -
- 输入文件 - 输入-1,输入-2
- 工作文件
- 输出文件
语法 (Syntax)
以下是合并两个或多个文件的语法 -
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