RETURN Statement


The RETURN statement transfers records from the final phase of a sorting or merging operation to an OUTPUT PROCEDURE. It is used only within the OUTPUT PROCEDURE associated with a SORT or MERGE statement. At least one RETURN statement should be coded in an OUTPUT PROCEDURE.

Syntax -

RETURN work-file-1 INTO record-1
    AT END statements-block-1
    NOT AT END statements-block-2
END-RETURN
Note! All statements coded in [ ] are optional.

Parameters -

  • work-file-1 - This is the work file that will hold the sorted records.
  • INTO record-1 - The retrieved record is placed into this data item.
  • AT END ... - Specifies the statements to be executed when there are no more sorted records.
  • NOT AT END ... - Specifies the statements to be executed when a record is successfully retrieved.
  • END-RETURN - Specifies the end the of the RETURN statement and is not required when RETURN statement ended with period.

Practical Example -


Scenario - Let us assume we have a file with the employee information and need to sort the file based on the employee number (1-5 bytes). But, we need to skip the DIR (having employee number E0001) record after the sort and before writing it to output file.

Input -

MATEPK.EMPFILE.NSINPUT1

----+----1----+----2----+----3----+----4----+--
E0004EMPLOYEE4     TL   DEPT1LOC1 0000050000
E0002EMPLOYEE2     MGR  DEPT1LOC1 0000080000
E0006EMPLOYEE6     SE   DEPT1LOC1 0000034000
E0001EMPLOYEE1     DIR       LOC1 0000100000

MATEPK.EMPFILE.INPUT2

Code -

----+----1----+----2----+----3----+----4----+----5----+
       IDENTIFICATION DIVISION.
       PROGRAM-ID. RETURNSR.
       AUTHOR. MTH.

       ENVIRONMENT DIVISION. 
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT EMPFILE1 ASSIGN TO INPUT1. 
           SELECT EMPFILEO ASSIGN TO OUTPUT1.
           SELECT WORKFILE ASSIGN TO WORK1.

       DATA DIVISION.
       FILE SECTION.
       FD EMPFILE1 
           RECORD CONTAINS 47 CHARACTERS 
           DATA RECORD EMP-REC1
           RECORDING MODE F.
       01 EMP-REC1.
          COPY EMPREC.
       FD EMPFILEO
           RECORD CONTAINS 47 CHARACTERS
           DATA RECORD EMP-RECO
           RECORDING MODE F.
       01 EMP-RECO.
          COPY EMPREC.
       SD WORKFILE
           RECORD CONTAINS 47 CHARACTERS
           DATA RECORD WORK-REC
           RECORDING MODE F.
       01 WORK-REC.
          05 WORK-EMP-NUM         PIC 9(05).
          05 WORK-REM-REC         PIC X(42).
		  
       WORKING-STORAGE SECTION.
       01 WS-SORTEOF-SW           PIC X(01) VALUE 'N'.
          88 SORT-EOF             VALUE 'Y'. 

       PROCEDURE DIVISION
	  * SORT using OUTPUT PROCEDURE
           SORT WORKFILE
             ON ASCENDING KEY WORK-EMP-NUM
             USING EMPFILE1
             OUTPUT PROCEDURE IS 1000-WRITE-RECORDS.
           STOP RUN.

       1000-WRITE-RECORDS.

           OPEN OUTPUT EMPFILEO.
      * RETURN statement with LOOP to process all records
           PERFORM UNTIL SORT-EOF
                   RETURN WORKFILE
                          AT END SET SORT-EOF   TO TRUE   
                      NOT AT END PERFORM 2000-WRITE-OUTPUT
                   END-RETURN 
           END-PERFORM.

           CLOSE EMPFILEO. 

       2000-WRITE-OUTPUT.
	  * Skipping E0001 record while writing
           IF WORK-EMP-NUM  EQUAL 'E0001'
              CONTINUE
           ELSE
              MOVE  WORK-REC   TO EMP-RECO
              WRITE EMP-RECO
           END-IF.

JCL -

//MATEPKRJ JOB MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//STEP01  EXEC PGM=RETURNSR
//STEPLIB  DD  DSN=MATEPK.COBOL.LOADLIB,DISP=SHR
//INPUT1   DD  DSN=MATEPK.EMPFILE.NSINPUT1,DISP=SHR
//OUTPUT1  DD  DSN=MATEPK.EMPFILE.RETURNOP,
//            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.RETURNOP) -

----+----1----+----2----+----3----+----4----+--
E0002EMPLOYEE2     MGR  DEPT1LOC1 0000080000   
E0004EMPLOYEE4     TL   DEPT1LOC1 0000050000   
E0006EMPLOYEE6     SE   DEPT1LOC1 0000034000

Explaining Example -

In the above example, SORT uses 1000-WRITE-RECORDS as a output procedure which returns every record. RETURN...AT END phase is used to write the records to the output file. The director record (E0001) is successfully skipped during the File WRITE.