MERGE Statement
MERGE Statement
- MERGE statement is used to combine two or more sequentially ordered files into a single, merged, and sequentially ordered output file.
- The files should be in sorted order according to the ascending or descending key that is common for both files.
- This operation is usually required when we have multiple files with data in a similar format and want to generate a consolidated, sorted dataset.
- A MERGE statement can be coded anywhere in the procedure division except in a declarative section.
Syntax -
MERGE work-file-1
ON ASCENDING/DESCENDING KEY key-name-1 [key-name-2 ...]
[COLLATING SEQUENCE {IS} alphabet-name-1]
[USING input-file-1 [, input-file-2, ...]]
[OUTPUT PROCEDURE IS para-1 THRU para-2]
[GIVING output-file-1 [, output-file-2, ...]]
Parameters -
- work-file-1 - The name of the merge work file. It's a logical file and does not correspond to any physical file.
- ON ASCENDING/DESCENDING KEY - Defines the sorting order for the merge based on the specified keys.
- key-name-1, key-name-2, ... - Specifies the data items that determine the sort order.
- COLLATING SEQUENCE {IS} alphabet-name-1 - Optional. Specifies the collating sequence for sorting. If not mentioned, machine's native sequence is used.
- USING input-file-1, input-file-2, ... - Specifies the input files that we want to merge. They should be sorted in the sequence mentioned by the sort keys.
- OUTPUT PROCEDURE IS para-1 THRU para-2 - Specifies the name of a procedure used to select or modify output records from the merge operation.
- GIVING output-file-1, output-file-2, ... - Specifies the output file or files to which the merged records are written.
Merge processing steps -
- It opens work file in I-O mode, input files in INPUT mode, and output file in OUTPUT mode.
- Transfers the records from all input files to the work file using the order coded with key-name-1.
- Transfers the sorted records from work file to output file.
- Closes the input, output files and releases (deletes) the work-file.
Practical Example -
Scenario - Let us assume two different employee files contain employee information, and create one merged file containing all employee details from two files.
Input -
MATEPK.EMPFILE.INPUT1
----+----1----+----2----+----3----+----4----+-- E0001EMPLOYEE1 DIR LOC1 0000100000 E0002EMPLOYEE2 MGR DEPT1LOC1 0000080000 E0004EMPLOYEE4 TL DEPT1LOC1 0000050000 E0006EMPLOYEE6 SE DEPT1LOC1 0000034000
MATEPK.EMPFILE.INPUT2
----+----1----+----2----+----3----+----4----+-- E0003EMPLOYEE3 MGR DEPT2LOC2 0000075000 E0005EMPLOYEE5 SSE DEPT1LOC1 0000045000 E0007EMPLOYEE7 SSE DEPT2LOC2 0000046000
Code -
----+----1----+----2----+----3----+----4----+----5----+
...
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT EMPFILE1 ASSIGN TO INPUT1.
SELECT EMPFILE2 ASSIGN TO INPUT2.
SELECT EMPFILEO ASSIGN TO OUTPUT1.
SELECT WORKFILE ASSIGN TO WORK1.
...
DATA DIVISION.
FILE SECTION.
* Use declarations from SORT example
...
PROCEDURE DIVISION.
MERGE WORKFILE
ON ASCENDING KEY WORK-EMP-NUM
USING EMPFILE1, EMPFILE2
GIVING EMPFILEO.
...
JCL -
//MATEPKRJ JOB MSGLEVEL=(1,1),NOTIFY=&SYSUID //* //STEP01 EXEC PGM=MERGEFLS //STEPLIB DD DSN=MATEPK.COBOL.LOADLIB,DISP=SHR //INPUT1 DD DSN=MATEPK.EMPFILE.INPUT1,DISP=SHR //INPUT2 DD DSN=MATEPK.EMPFILE.INPUT2,DISP=SHR //OUTPUT1 DD DSN=MATEPK.EMPFILE.OUTPUT1, // DISP=(NEW,CATLG,DELETE), // SPACE=(TRK,(3,2),RLSE), // UNIT=SYSDA, // DCB=(DSORG=PS,RECFM=FB,LRECL=47,BLKSIZE=470) //WORK1 DD DSN=&&TEMP, // DISP=(NEW,DELETE,DELETE), // SPACE=(CYL,(10,5),RLSE), // UNIT=SYSDA, // DCB=(DSORG=PS,RECFM=FB,LRECL=47,BLKSIZE=470) //SYSOUT DD SYSOUT=*
Output (MATEPK.EMPFILE.OUTPUT1) -
----+----1----+----2----+----3----+----4----+-- E0001EMPLOYEE1 DIR LOC1 0000100000 E0002EMPLOYEE2 MGR DEPT1LOC1 0000080000 E0003EMPLOYEE3 MGR DEPT2LOC2 0000075000 E0004EMPLOYEE4 TL DEPT1LOC1 0000050000 E0005EMPLOYEE5 SSE DEPT1LOC1 0000045000 E0006EMPLOYEE6 SE DEPT1LOC1 0000034000 E0007EMPLOYEE7 SSE DEPT2LOC2 0000046000