OUTFIL control statement

The OUTFIL control statement describes the output file(s) and the processing to be done on the output records. OUTFIL processing is supported for sort, merge, and copy applications. Use the OUTFIL control statement to create multiple output files without making multiple passes through the input data.

OUTFIL control statement Examples

Example 1

The following example illustrates how to use the OUTFIL control statement to define mul- tiple output files.

 OUTFIL FILES=1,OUTREC=(10:1,20,40:45,5,50:60,8), 
 INCLUDE=(21,2,CH,EQ,C'NY')
 OUTFIL FILES=2,OUTREC=(20:1,20,50:60,8), INCLUDE=(21,2,CH,EQ,C'MA')

The two OUTFIL control statements illustrated above are required to create two different output files.

  • The output records in the first file (SORTOF1) contain three fields from the input record. The first input record field begins in byte 1 and is 20 bytes long, the second input record field begins in byte 45 and is 5 bytes long, and the third input record field begins in byte 60 and is 8 bytes long. This file will include only those records with ‘NY’ in bytes 21 and 22 of the input record. These three fields will begin in bytes 10, 40, and 50 of the output record.
  • The output records in the second file (SORTOF2) contain two fields from the input record. The first input record field begins in byte 1 and is 20 bytes long, and the second input field begins in byte 60 and is 8 bytes long. This file will include only those records with ‘MA’ in bytes 21 and 22 of the input record. These two fields will begin in bytes 20 and 50 of the output record.

Example 2

OUTFIL FILES=(01,02,03),OUTREC=(1:1,40,50:41,40)
  • This OUTFIL control statement creates three identically formatted output files: SORTOF01, SORTOF02, and SORTOF03. These files may be written to the same output device or to three different output devices.
  • The output records contain two input record fields. The first input record field begins in column 1. This field began in position 1 before OUTREC processing and is 40 bytes long. The second input record field begins in column 50. This field began in position 41 before OUTREC processing and is 40 bytes long. The two fields will begin in positions 1 and 50 after OUTREC has been processed.

Example 3

OUTFIL FTOV,VLTRIM=C’*',OUTREC=(1,7,9:8,8)

This OUTFIL control statement uses FTOV to convert fixed-length records to variable- length records and VLTRIM to remove the specified type of trailing bytes (in this case, asterisks).

Example 4

The SPLIT parameter of the OUTFIL control statement causes output records to be distrib- uted in rotation among files in an OUTFIL group.

OUTFIL FILES=(01,02,03),SPLIT

For the above example, the first record will be written to the SORTOF01 data set; the sec- ond, to SORTOF02; the third, to SORTOF03. The fourth record will be written to SORTOF01 again, and so on in round-robin fashion.

SPLIT, SPLITBY=n and SPLIT1R=n are mutually exclusive. SPLITBY=1 is equivalent to SPLIT.

OUTFIL FILES=(01,02,03),SPLITBY=1

The SPLITBY=n parameter writes groups of records in rotation among multiple output data sets and distributes multiple records at a time among the OUTFIL data sets. n specifies the number of records to split by. The minimum value for n is 1.

OUTFIL FILES=(01,02,03),SPLIT1R=10

The SPLIT1R=n parameter of the OUTFIL control statement causes all output records to be grouped and distributed among files in an OUTFIL group in a single rotation to maintain contiguity. The first n records are written to the first output file followed by the next n

Input:
 Length     |  Data
     45        John Lewis          -12.83  Research
     50        Ted Blank          +128.37  Manufacturing
     54        Marilyn Carlson    -282.83  Technical Support
     51        Rex Otis             +2.83  Marketing
 
SYSIN:
    OPTION COPY
    OUTFIL IFTHEN=(WHEN=INIT,
     OVERLAY=(5:5,18,JFY=(SHIFT=LEFT,LEAD=C'''',TRAIL=C''''),
              34:34,19,JFY=(SHIFT=LEFT,LEAD=C'''',TRAIL=C''''))),
     IFTHEN=(WHEN=INIT,
     BUILD=(1,4,5,60,SQZ=(SHIFT=LEFT,PAIR=APOST,MID=C’,'))),
             VLTRIM=C' 

This example illustrates how you can create VB output records with comma separated values from VB input records containing fields in fixed positions.

Output:
 Length   |  Data
     52      'John Lewis'          -12.83 'Research'
     52      'Ted Blank'          +128.37 'Manufacturing'
     54      'Marilyn Carlson'    -282.83 'Technical Support'
     52      'Rex Otis'             +2.83 'Marketing'

OUTFIL control statement with PARM

On the EXEC statement, specify PARM=’…,JPn”string”,…’ where n is from 0 to 9. The quotes delimit the start and end of the string, so the string should not contain any imbedded quotes. If apostrophes are required, two should be specified for each one so as not to terminate the PARM field. Up to 10 such JPn PARMs can be used in one PARM field.

The string may contain any combination of

  • SET or PROC symbols from the JCL. These are prefaced by an ampersand: &symbol
  • System symbols, which are also prefaced by an ampersand, such as &JOBNAME or &YYMMDD
  • Any characters except quotes; characters after a symbol name may be appended with a period: &symbol.text

Example 1 : Using system symbols

Select data for the current month using system symbols for MM and YYYY

//SELECT2 EXEC PGM=SORT,PARM='JP1"&MON&YR4"' 
 //SYSOUT DD SYSOUT=*
 //SYMNOUT DD SYSOUT=*
 //SORTIN DD *
 062013
 072012
 072013
 012013
 //SORTOUT  DD SYSOUT=*
 //SYSIN    DD *
  INCLUDE COND=(1,6,CH,EQ,JP1)
  SORT FIELDS=(1,6,CH,A)
 //*

Assuming this JCL was executed in July 2013, after data dictionary symbol substitution the INCLUDE statement becomes

INCLUDE COND=(1,6,CH,EQ,C’072013')

The output would be – 072013

Example 2 : Using JCL SET symbols

Select data for only certain states where the list of states will vary:

 // SET STATE1='NY'
 // SET STATE2='NJ'
 // SET STATE3='PA'
 // SET STATE4='CT'
 // SET STATE5=' '
 // SET STATE6=' '
 // SET STATE7=' '
 // SET STATE8=' '
 //SELECT1 EXEC PGM=SORT,
 // PARM=('JP1"&STATE1",JP2"&STATE2",JP3"&STATE3",JP4"&STATE4"', 
 //       'JP5"&STATE5",JP6"&STATE6",JP7"&STATE7",JP8"&STATE8"') 
 //SYSOUT DD SYSOUT=*
 //SYMNOUT  DD SYSOUT=*
 //SORTIN   DD *
 TALLAHASSEE   FL
 TRENTON       NJ
 TOPEKA        KS
 HARTFORD      CT
 SACRAMENTO    CA
 //SORTOUT DD SYSOUT=*
 //SYSIN    DD *
 INCLUDE COND=(15,2,CH,EQ,L(JP1,JP2,JP3,JP4,JP5,JP6,JP7,JP8)) 
 SORT FIELDS=(1,16,CH,A)
 //*

After data dictionary symbol substitution, the INCLUDE statement becomes

INCLUDE COND=(15,2,CH,EQ,L(C'NY',C'NJ',C'PA',C'CT',C' ',C' ', C' ',C' '))
The output is
HARTFORD      CT
TRENTON       NJ

OUTFIL control statement with multiple files

 //SORT01   EXEC  PGM=SORT                     
 //SYSOUT   DD  SYSOUT=*                      
 //SORTIN   DD DSN=XXXX.YYYY.RECORDS.INPUT,DISP=SHR           
 //OUTPUT01   DD DSN=XXXX.YYYY.OUTPUT01, 
 //            DISP=(NEW,CATLG,DELETE),       
 //            UNIT=3390,SPACE=(TRK,(10,10))    
 //OUTPUT02    DD DSN=XXXX.YYYY.OUTPUT01,
 //            DISP=(NEW,CATLG,DELETE),       
 //            UNIT=3390,SPACE=(TRK,(10,10))       
 //FILE01   DD SYSOUT=*              
 //FILE02   DD SYSOUT=* 
 //SORTWK01 DD SPACE=(CYL,20),UNIT=SYSDA
 //SORTWK02 DD SPACE=(CYL,20),UNIT=SYSDA
 //SORTWK03 DD SPACE=(CYL,20),UNIT=SYSDA
 //SYSIN    DD    *            
  SORT FIELDS=(6,5,CH,A)  
  OUTFIL FNAMES=(OUTPUT01,OUTPUT02) 
  OUTFIL FNAMES=FILE01,           
    INCLUDE=(1,3,CH,EQ,C'G01'),   
    HEADER2=(2/,20:'EMPLOYEE INFOMATION',   
    2/,1:'FIRSTNAME',14:'LASTNAME',29:'WORK DEPT', 
    41:’HIRE DATE',54:'LEVEL',65:'SALARY', /,1:’---------',
    14:'--------',29:'---------',    
    40:’----------',54:'------',65:'---------'), 
    OUTREC=(1:3,12,C' ',17,15,C' ',32,3,7C' ', 
    36,10,C' ',47,2,BI,M0,5C' ',50,5,PD,M2)          
  OUTFIL FNAMES=FILE02,             
    INCLUDE=(1,3,CH,EQ,C'G02'),     
    HEADER2=(2/,20:'EMPLOYEE INFOMATION',   
    2/,1:'FIRSTNAME',14:'LASTNAME',29:'WORK DEPT', 
    41:’HIRE DATE',54:'LEVEL',65:'SALARY', /,1:’---------',
    14:'--------',29:'---------',    
    40:’----------',54:'------',65:'---------'), 
    OUTREC=(1:3,12,C' ',17,15,C' ',32,3,7C' ', 
    36,10,C' ',47,2,BI,M0,5C' ',50,5,PD,M2)     
 //*

SORT statement. FIELDS specifies an ascending 5-byte character control field starting at position 6.

OUTFIL statement. The sorted input records are written to the OUTPUT01 and OUTPUT02 data sets.

OUTFIL statement. The subset of sorted input records containing ‘G01’ in positions 1 through 3 are used to produce a report, which is written to the FILE01 data set.

OUTFIL statement. The subset of sorted input records containing ‘G02’ in positions 1 through 3 are used to produce a report, which is written to the FILE02 data set.

 FILE01
 ------
                   EMPLOYEE INFORMATION
 FIRSTNAME LASTNAME WORK DEPT HIRE DATE   LEVEL SALARY
 --------- -------- --------- ---------   ----- ------  
 CHRISTINE HAAS       A00     01/01/1975  11    50,000.00
 CHRISTINE MIKE.      A00     01/01/1976  12    52,750.00
 DIANE     HARISON    A00     01/01/1977  13    55,000.00
 DIANE     HEMMINGER  A00     01/01/1978  14    60,750.00
                  
 
 FILE02
 ------
                   EMPLOYEE INFORMATION
 FIRSTNAME LASTNAME WORK DEPT HIRE DATE   LEVEL SALARY
 --------- -------- --------- ---------   ----- ------  
 JOAN      PAN        A00     01/01/1979  15    50,750.00
 KEVEN     MASK       B00     01/01/1980  16    51,750.00
 MAGGIE    NEME       A00     01/01/1981  17    56,000.00
 MIKE      BUSH       B00     01/01/1982  18    58,750.00
 PETER     MAWAH      B00     01/01/1983  19    59,000.00
 STEVE.    ARNEY      B00     01/01/1984  20    75,000.00

JCL blogs – Click Here SYNCSORT Manual: Click Here

Scroll to Top