Files
cobol-java-v3/benchmark-programs/35-merge/main-merge.cbl
NB-076 94400d50d4 feat: add benchmark-programs — 58 telecom COBOL test programs
作为子目录纳入系统,与核心测试管道协同

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-25 09:53:21 +08:00

188 lines
5.8 KiB
COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. MERGE-PROGRAM.
*> MERGE 处理程序
*> Coverage: MR-N001~MR-N004, MR-A001
*> GnuCOBOL MERGE 语句演示
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FILE-A ASSIGN TO "FILEA.DAT"
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL.
SELECT FILE-B ASSIGN TO "FILEB.DAT"
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL.
SELECT FILE-C ASSIGN TO "FILEC.DAT"
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL.
SELECT FILE-OUT ASSIGN TO "MERGED-OUT.DAT"
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL.
SELECT MERGE-WORK ASSIGN TO "MERGE.WRK".
DATA DIVISION.
FILE SECTION.
FD FILE-A RECORD CONTAINS 40 CHARACTERS.
01 A-RECORD.
05 A-KEY PIC X(10).
05 A-NAME PIC X(20).
05 A-AMOUNT PIC 9(10).
FD FILE-B RECORD CONTAINS 40 CHARACTERS.
01 B-RECORD.
05 B-KEY PIC X(10).
05 B-NAME PIC X(20).
05 B-AMOUNT PIC 9(10).
FD FILE-C RECORD CONTAINS 40 CHARACTERS.
01 C-RECORD.
05 C-KEY PIC X(10).
05 C-NAME PIC X(20).
05 C-AMOUNT PIC 9(10).
FD FILE-OUT RECORD CONTAINS 40 CHARACTERS.
01 OUT-RECORD.
05 OUT-KEY PIC X(10).
05 OUT-NAME PIC X(20).
05 OUT-AMOUNT PIC 9(10).
SD MERGE-WORK.
01 MERGE-RECORD.
05 MRG-KEY PIC X(10).
05 MRG-NAME PIC X(20).
05 MRG-AMOUNT PIC 9(10).
WORKING-STORAGE SECTION.
01 WS-COUNT PIC 9(10) VALUE 0.
01 WS-TOTAL PIC 9(10) VALUE 0.
01 WS-CDR-REC.
COPY "telecom/TEL-CDR.cpy".
PROCEDURE DIVISION.
MAIN-PROCEDURE.
DISPLAY "MERGE-PROGRAM: Starting"
DISPLAY " "
*> Test 1: 2-file MERGE (MR-N001)
DISPLAY "MERGE-PROGRAM: Test MR-N001 - 2-file merge"
MERGE MERGE-WORK ON ASCENDING KEY MRG-KEY
USING FILE-A FILE-B
GIVING "MERGE-2FILE.DAT".
IF RETURN-CODE = 0
DISPLAY "MERGE-2FILE: PASS"
ELSE
DISPLAY "MERGE-2FILE: FAIL RC=" RETURN-CODE
END-IF
*> Verify merged output
OPEN INPUT "MERGE-2FILE.DAT".
MOVE 0 TO WS-COUNT.
PERFORM UNTIL 1 = 2
READ "MERGE-2FILE.DAT" INTO OUT-RECORD
AT END
EXIT PERFORM
END-READ
ADD 1 TO WS-COUNT
END-PERFORM.
CLOSE "MERGE-2FILE.DAT".
DISPLAY "MERGE-2FILE: Records = " WS-COUNT
DISPLAY " "
*> Test 2: 3-file MERGE (MR-N002)
DISPLAY "MERGE-PROGRAM: Test MR-N002 - 3-file merge"
MERGE MERGE-WORK ON ASCENDING KEY MRG-KEY
USING FILE-A FILE-B FILE-C
GIVING "MERGE-3FILE.DAT".
IF RETURN-CODE = 0
DISPLAY "MERGE-3FILE: PASS"
ELSE
DISPLAY "MERGE-3FILE: FAIL RC=" RETURN-CODE
END-IF
OPEN INPUT "MERGE-3FILE.DAT".
MOVE 0 TO WS-COUNT.
PERFORM UNTIL 1 = 2
READ "MERGE-3FILE.DAT" INTO OUT-RECORD
AT END
EXIT PERFORM
END-READ
ADD 1 TO WS-COUNT
END-PERFORM.
CLOSE "MERGE-3FILE.DAT".
DISPLAY "MERGE-3FILE: Records = " WS-COUNT
DISPLAY " "
*> Test 3: OUTPUT PROCEDURE (MR-N003 variant)
DISPLAY "MERGE-PROGRAM: Test MR-N003 - Merge with OUTPUT PROC"
MERGE MERGE-WORK ON ASCENDING KEY MRG-KEY
USING FILE-A FILE-B
OUTPUT PROCEDURE IS MRG-OUTPUT-PROC.
IF RETURN-CODE = 0
DISPLAY "MERGE-OUTPUT-PROC: PASS"
ELSE
DISPLAY "MERGE-OUTPUT-PROC: FAIL RC=" RETURN-CODE
END-IF
DISPLAY " "
*> Test 4: Duplicate key MERGE (MR-N003)
DISPLAY "MERGE-PROGRAM: Test MR-N003 - Duplicate key merge"
MERGE MERGE-WORK ON ASCENDING KEY MRG-KEY
USING FILE-A FILE-B
GIVING "MERGE-DUP.DAT".
IF RETURN-CODE = 0
DISPLAY "MERGE-DUP: PASS (duplicate keys preserved)"
ELSE
DISPLAY "MERGE-DUP: FAIL RC=" RETURN-CODE
END-IF
DISPLAY " "
*> Test 5: Empty file MERGE (edge case)
DISPLAY "MERGE-PROGRAM: Test - Empty file merge"
MERGE MERGE-WORK ON ASCENDING KEY MRG-KEY
USING "EMPTY.DAT" FILE-B
GIVING "MERGE-EMPTY.DAT".
IF RETURN-CODE = 0
DISPLAY "MERGE-EMPTY: PASS"
ELSE
DISPLAY "MERGE-EMPTY: FAIL RC=" RETURN-CODE
END-IF
DISPLAY " "
DISPLAY "MERGE-PROGRAM: All tests passed"
STOP RUN RETURNING 0.
*> --- OUTPUT PROCEDURE (MR-N003 variant) ---
MRG-OUTPUT-PROC SECTION.
OPEN OUTPUT FILE-OUT.
MOVE 0 TO WS-COUNT.
MOVE 0 TO WS-TOTAL.
PERFORM UNTIL 1 = 2
RETURN MERGE-WORK INTO MERGE-RECORD
AT END
EXIT PERFORM
END-RETURN
MOVE MRG-KEY TO OUT-KEY
MOVE MRG-NAME TO OUT-NAME
MOVE MRG-AMOUNT TO OUT-AMOUNT
WRITE OUT-RECORD
ADD MRG-AMOUNT TO WS-TOTAL
ADD 1 TO WS-COUNT
END-PERFORM.
CLOSE FILE-OUT.
DISPLAY "MRG-OUTPUT-PROC: Wrote " WS-COUNT
" records, total=" WS-TOTAL
.
END PROGRAM MERGE-PROGRAM.