SORT & MERGE
Use procedures to filter or transform records before sorting (RELEASE) and to process sorted records directly (RETURN) without an intermediate file:
23.1 Simple SORT (USING / GIVING)
The sort work file is described with SD (sort description), not FD. Files named in USING/GIVING must not be open — SORT opens and closes them.
WITH DUPLICATES IN ORDER keeps equal keys in input order; COLLATING SEQUENCE IS changes the ordering. SORT-RETURN is 0 on success, 16 on failure.
IDENTIFICATION DIVISION.
PROGRAM-ID. SORTSALE.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT SALES-IN ASSIGN TO "sales.txt"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT SALES-OUT ASSIGN TO "sales-sorted.txt"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT SORT-WORK ASSIGN TO "sortwork.tmp".
DATA DIVISION.
FILE SECTION.
FD SALES-IN.
01 SALES-IN-REC PIC X(40).
FD SALES-OUT.
01 SALES-OUT-REC PIC X(40).
SD SORT-WORK.
01 SORT-REC.
05 SR-REGION PIC X(10).
05 SR-REP PIC X(20).
05 SR-AMOUNT PIC 9(7)V99.
05 FILLER PIC X.
PROCEDURE DIVISION.
SORT SORT-WORK
ON ASCENDING KEY SR-REGION
ON DESCENDING KEY SR-AMOUNT
USING SALES-IN
GIVING SALES-OUT
IF SORT-RETURN NOT = 0
DISPLAY "SORT FAILED, SORT-RETURN = " SORT-RETURN
MOVE 16 TO RETURN-CODE
END-IF
STOP RUN.23.2 INPUT PROCEDURE and OUTPUT PROCEDURE
Use procedures to filter or transform records before sorting (RELEASE) and to process sorted records directly (RETURN) without an intermediate file:
(WS-IN-EOF and WS-SORT-EOF are PIC X VALUE "N" items in WORKING-STORAGE.) You may mix: USING with an OUTPUT PROCEDURE, or an INPUT PROCEDURE with GIVING.
SORT SORT-WORK
ON ASCENDING KEY SR-REGION SR-REP
INPUT PROCEDURE IS 1000-SELECT-SALES
OUTPUT PROCEDURE IS 2000-PRINT-SALES
STOP RUN.
1000-SELECT-SALES.
OPEN INPUT SALES-IN
PERFORM UNTIL WS-IN-EOF = "Y"
READ SALES-IN
AT END MOVE "Y" TO WS-IN-EOF
NOT AT END
MOVE SALES-IN-REC TO SORT-REC
* Keep only sales of 100.00 or more
IF SR-AMOUNT >= 100
RELEASE SORT-REC
END-IF
END-READ
END-PERFORM
CLOSE SALES-IN.
2000-PRINT-SALES.
PERFORM UNTIL WS-SORT-EOF = "Y"
RETURN SORT-WORK
AT END MOVE "Y" TO WS-SORT-EOF
NOT AT END
DISPLAY SR-REGION " " SR-REP " " SR-AMOUNT
END-RETURN
END-PERFORM.23.3 MERGE
MERGE combines two or more files already sorted on the same keys:
MERGE supports OUTPUT PROCEDURE but not INPUT PROCEDURE.
MERGE MERGE-WORK
ON ASCENDING KEY MW-CUST-ID
USING TRANS-EAST TRANS-WEST TRANS-CENTRAL
GIVING TRANS-ALL23.4 Sorting on z/OS
The COBOL SORT verb calls the system sort product (DFSORT or Syncsort/Precisely MFX). Provide SORTWK01… DD statements or let dynamic allocation handle work space.
Many shops sort with a standalone JCL step instead of in COBOL — usually faster:
(ZD = zoned decimal; PD = packed; BI = binary; CH = character.)
//SORTSTEP EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=USER01.SALES.DATA,DISP=SHR
//SORTOUT DD DSN=USER01.SALES.SORTED,DISP=(NEW,CATLG,DELETE),
// SPACE=(CYL,(5,5),RLSE),DCB=*.SORTIN
//SYSIN DD *
SORT FIELDS=(1,10,CH,A,31,9,ZD,D)
INCLUDE COND=(31,9,ZD,GE,10000)
/*