DFSORT TUTORIAL
ASSUMPTIONS
Before discussing about SORT,let us assume following things
Input file has following data and structure
INPUT FILE
MOHANK 23423423434534344 KIRAN
MOHANK 13342345345345345 RAJEEV
ARAMES 34535345325354324 SURESH
SURESH 98347385385933987 PULI
RAMESH 67575789769876785 MADHU
KRISHN 50830948530859340 OIIED
KRISHN 30495849572938495 MADHU
SURESH 98347385385933987 PULI
Simple SORT jcl structue is as follows - Sample sort jcl ----
.
.
//STEP10 EXEC PGM=SORT,REGION=1024K,PARM=parameters
//SYSOUT DD SYSOUT=* Output messages from SORT
//SORTIN DD DSN=...,DISP=SHR Input if SORT request
//SORTOUT DD DSN=... Output for SORT request
//SORTOFxx DD DSN=... OUTFILE output data sets
//SORTXSUM DD DSN=... Output eliminated by the SUM stm
//SORTWKnn DD UNIT=SYSDA, Work files if SORT request
//SYSIN DD * Control statement input data set
sort control statements
/*
.
.
FOLLOWING ARE THE SORTCARDS FOR DIFFERENT TYPES OF SORTS
TASK 1. SORT A GIVEN FILE - SAMPLE JCL
//SYSIN DD *
SORT FIELDS=(1,3,CH,A,9,3,CH,A)
/*
OUTPUT FILE
ARAMES 34535345325354324 SURESH
KRISHN 30495849572938495 MADHU
KRISHN 50830948530859340 OIIED
MOHANK 13342345345345345 RAJEEV
MOHANK 23423423434534344 KIRAN
RAMESH 67575789769876785 MADHU
SURESH 98347385385933987 PULI
SURESH 98347385385933987 PULI
EXPLANATION
Above syntax of SORT sorted the recrods, depends
on keys we have provided
(we have provided two keys in FIELDS parameter)
FIRST KEY
1,3,CH,A - first key started at col 1 , its length is 3
SECOND KEY
9,3,CH,A - second key started at col 9, its length is 3
In the above example,
CH- means character we may use BI for binary
A - Ascending order
TASK 2. ELEMINATE DUPLICATES
//SYSIN DD *
SORT FIELDS=(1,3,CH,A)
SUM FIELDS=NONE
/*
//** copyright www.mainframegurukul.com
OUTFILE
ARAMES 34535345325354324 SURESH
KRISHN 50830948530859340 OIIED
MOHANK 23423423434534344 KIRAN
RAMESH 67575789769876785 MADHU
SURESH 98347385385933987 PULI
EXPLANATION
if we give SUM FIELDS=NONE it will eliminate duplicates
TASK 3. SPLIT FILE INTO TWO OR THREE FILES DEPENDS
ON CONDITIONS
.
.
.
//SORTOF01 DD DSN=dataset1,
// DISP=(NEW,CATLG,DELETE),UNIT=SYSDA,
// SPACE=(CYL,(1,4),RLSE),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=0)
//SORTOF02 DD DSN=dataset2,
// DISP=(NEW,CATLG,DELETE),UNIT=SYSDA,
// SPACE=(CYL,(1,4),RLSE),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=0)
//SORTOF03 DD DSN=dataset3,
// DISP=(NEW,CATLG,DELETE),UNIT=SYSDA,
// SPACE=(CYL,(1,4),RLSE),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=0)
.
.
.
//SYSIN DD *
SORT FIELDS=COPY
OUTFIL FILES=01,INCLUDE=(1,6,CH,EQ,C'MOHANK')
OUTFIL FILES=02,INCLUDE=(1,6,CH,EQ,C'SURESH')
OUTFIL FILES=03,INCLUDE=(1,6,CH,EQ,C'KRISHN')
/*
SORTOF01
MOHANK 23423423434534344 KIRAN
MOHANK 13342345345345345 RAJEEV
SORTOF02
SURESH 98347385385933987 PULI
SURESH 98347385385933987 PULI
SORTOF03
KRISHN 50830948530859340 OIIED
KRISHN 30495849572938495 MADHU
EXPLANATION
1. SORT FIELDS=COPY - indicate , it for copy of records, not for sort
2. OUTFIL FILES=01,INCLUDE=(1,6,CH,EQ,C'MOHANK')
OUTFIL FILES=02,INCLUDE=(1,6,CH,EQ,C'SURESH')
OUTFIL FILES=03,INCLUDE=(1,6,CH,EQ,C'KRISHN')
- SYNCSORT will take data from 1st positioon to 6th position of input
file and it will compare that data with MOHANK or SURESH or KRISHN
- If data equals to MOHANK then that recorrd will copies to dataset defined
in SORTOF01 step. ( because we defined FILES=01 in second condition )
- If data equals to SURESH then that recorrd will pass to dataset defined
in SORTOF02 step. ( because we defined FILES=02 in second condition )
- If data equals to KRISHN then that recorrd will copied to dataset difned
in SORTOF03 step. ( because we defined FILES=03 in third condition )
TASK 4. COPY ELIMINATED DUPLICATES INTO ANOTHER
FILE - SAMPLE JCL
.
.
//SORTXSUM DD DSN=datasetname,
// DISP=(NEW,CATLG,DELETE),UNIT=SYSDA,
// SPACE=(CYL,(1,4),RLSE),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=800)
.
.
//SYSIN DD *
SORT FIELDS=(1,3,CH,A)
SUM FIELDS=NONE,XSUM
/*
//*copyright www.mainframegurukul.com &
www.geocitie.comhttp://www.mainframetutorials.com
SORTOUT
ARAMES 34535345325354324 SURESH
KRISHN 50830948530859340 OIIED
MOHANK 23423423434534344 KIRAN
RAMESH 67575789769876785 MADHU
SURESH 98347385385933987 PULI
SORTXSUM
KRISHN 30495849572938495 MADHU
MOHANK 13342345345345345 RAJEEV
SURESH 98347385385933987 PULI
EXPLANATION
1. SORT FIELDS=(1,3,CH,A)
Input file will be sorted depending up on the key specified above
1,3,CH,A - key starting position is 1 and length 3, comparing type
character, sorting is don in ascending order
2. SUM FIELDS=NONE,XSUM
SUM FIELDS=NONE means it will eliminate duplicates
XSUM options will copy all records eliminated in sort
process will copy to another data set defined in
SORTXSUM step
TASK 5. COPY RECORDS DEPENDING UPON CONDITION
//SYSIN DD *
SORT FIELDS=COPY
INCLUDE COND=(1,6,CH,EQ,C'SURESH')
/*
//* copyright www.mainframegurukul.com
OUTPUTFILE
SURESH 98347385385933987 PULI
SURESH 98347385385933987 PULI
EXPLANATION
above card is to copy records from input file which
contains SURESH at 1st position
TASK 6. FORMATING A FILE (USING INREC)
//SYSIN DD *
SORT FIELDS=COPY
INREC FIELDS=(7:2,5,20:10,3)
/*
//* copyright www.mainframegurukul.com
OUTPUT FILE
OHANK 342a
OHANK 334
RAMES 453
URESH 834
AMESH 757
RISHN 083
RISHN 049
URESH 834
EXPLANATION
1. SORT FIELDS=COPY
It is for copy records to output file
2. INREC FIELDS=(7:2,5,20:10,3) (for formatting)
Here we have two formattings,
1. 7:2,5 - data at 2nd position of input file with length 5
copied to 7th position of output file
2. 20:10,3 - data at 10th position of input file with length 3
copied to 20th position of output file
In above example, we can use OUTREC instread of INREC,
INREC adds, deletes, or reformats fields before the
records are sorted or merged. so that performance will
be improved
OUTREC adds, deletes, or reformats fields after the
records are sorted or merged.
Other parameters we can pass with sort card
SKIPREC=n
causes sort to skip over 'n' records in the input file before
starting a sorting or copying operation.
STOPAFT=n
causes sort to stop after 'n' records in the input file have
been sorted or copied.
COBOL DB2 COMPILE JCL
//DB2COMP (XXX,XXX),'COMPILE JCL',
// CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID
//*********************************************************
***********
//* COMPILATION, LINK EDIT AND THE BIND STEP FOR A COBOL
DB2 PROGRAM *
//* WILL BE DONE BY SUBMITTING THIS JOB.
*
//* THE DB2 REGIONS AND CORRESPONDING PARAMETERS NEEDS TO
BE CHANGED *
//* WITH RESPECT TO THE PROGRAM
*
//*********************************************************
***********
//* PRECOMPILE DB2 PROGRAM
*
//*-------------- LOCATION OF DBRM LIBRARY
-------------------------*
//*********************************************************
***********
//PC EXEC PGM=DSNHPC,
// PARM='HOST(COB2),APOST,SOURCE',
// REGION=4096K
//DBRMLIB DD DISP=SHR,
// DSN=DEV.SURESH.DBRM(DB2PROG)
<------------------------ (1)
//STEPLIB DD DISP=SHR,
// DSN=SYSX.DB2.XXX.XXXXX
//*********************************************************
***********
//*SYSIN -----------INPUT COBOL DB2 PROGRAM
LOCATION-----------------*
//*********************************************************
***********
//SYSIN DD DISP=SHR,
// DSN=DEV.SURESH.SRC(DB2PROG)
<---------------------- (2)
//SYSCIN DD DISP=(MOD,PASS),
// DSN=&&TEMP,
// SPACE=(800,(500,500)),
// UNIT=SYSDA
//*********************************************************
***********
//* DCLGEN MEMBER LOCATION
*
//*SYSLIB-----------------INPUT SOURCE LIBRARY FOR
SQL---------------*
//*********************************************************
***********
//SYSLIB DD DISP=SHR,
// DSN=DEV.SURESH.DCL
<---------------------- (3)
// DD DISP=SHR,
// DSN=DEV.SURESH.CPY
//SYSPRINT DD SYSOUT=T
//SYSTERM DD SYSOUT=T
//SYSUDUMP DD SYSOUT=*
//SYSUT1 DD SPACE=(800,(500,500),,,ROUND),
// UNIT=SYSDA
//SYSUT2 DD SPACE=(800,(500,500),,,ROUND),
// UNIT=SYSDA
//*
//*********************************************************
***********
//* COMPILATION
*
//*********************************************************
***********
//*
//COB EXEC PGM=IGYCRCTL,
// COND=(4,LT,PC),
//
PARM=('SIZE(4000K),BUFSIZE(32760),LIST,LIB,MAP,OBJECT',
// 'DATA(31),XREF,RENT'),
// REGION=4M
//STEPLIB DD DISP=SHR,
// DSN=XXXX.XXXXXX
//SYSIN DD DISP=(OLD,DELETE),
// DSN=&&TEMP
//SYSLIN DD DISP=(MOD,PASS),
// DSN=&&LOADTMP,
// SPACE=(800,(500,500)),
// UNIT=SYSDA
//*********************************************************
***********
//*--------------SOURCE LIBRARIES FOR COBOL DB2 CODE (COPY
LIBRARIES)*
//*********************************************************
***********
//SYSLIB DD DISP=SHR,
// DSN=DEV.SURESH.DCL
<----------------- (4)
// DD DSN=DEV.SURESH.CPY,DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSUT1 DD SPACE=(800,(500,500),,,ROUND),
// UNIT=SYSDA
//SYSUT2 DD SPACE=(800,(500,500),,,ROUND),
// UNIT=SYSDA
//SYSUT3 DD SPACE=(800,(500,500),,,ROUND),
// UNIT=SYSDA
//SYSUT4 DD SPACE=(800,(500,500),,,ROUND),
// UNIT=SYSDA
//SYSUT5 DD SPACE=(800,(500,500),,,ROUND),
// UNIT=SYSDA
//SYSUT6 DD SPACE=(800,(500,500),,,ROUND),
// UNIT=SYSDA
//SYSUT7 DD SPACE=(800,(500,500),,,ROUND),
// UNIT=SYSDA
//*
//*
//*********************************************************
***********
//* LINK EDIT
*
//*********************************************************
***********
//*
//LKED EXEC PGM=IEWL,
// COND=((4,LT,COB),(4,LT,PC)),
// PARM='XREF'
//SYSLIB DD DISP=SHR,
// DSN=SXXX.SXXXXXXX
// DD DISP=SHR,
// DSN=XXXX.DB2.XXX.XXXXLOAD
// DD DISP=SHR,
// DSN=SYS1.VSCLLIB
//SYSLIN DD DISP=(OLD,DELETE),
// DSN=&&LOADTMP
//* DD DDNAME=SYSIN
//*********************************************************
***********
//*----------------LOCATION OF LOAD
LIBRARY--------------------------*
//SYSLMOD DD DISP=SHR,
// DSN=DEV.SURESH.LOADLIB(DB2PROG)
<------------ (5)
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSUT1 DD SPACE=(1024,(50,50)),
// UNIT=SYSDA
//*
//*********************************************************
***********
//* BIND - BIND THE DB2 PACKAGE
*
//*********************************************************
***********
//BIND EXEC PGM=IKJEFT01,
// COND=(4,LT),
// REGION=4096K
//STEPLIB DD DISP=SHR,
// DSN=XXX4.DB2.XXXX.XXXXLOAD
//DBRMLIB DD DISP=SHR,
// DSN=DEV.SURESH.DBRM(DB2PROG)
<--------------- (6)
//SYSPRINT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM (DEVDB )
BIND MEMBER (DB2PROG) -
PACKAGE (PACKG11) -
LIBRARY ('DEV.SURESH.DBRM') -
<---------------- (7)
ACTION (REP) -
ISOLATION (CS) -
VALIDATE (BIND)-
RELEASE (COMMIT) -
OWNER (SURESH) -
QUALIFIER (DEVQUALI)
END
/*
**************************** Bottom of Data
****************************
(1) - When we precompiled, precompiler will create the
DBRM, it will
be placed in the pds specified here.
(2) - Location of COBOL-DB2 program
(3) - Needs to speficiy DCLGEN member locations
(4) - Needs to specify DCLGEN and COPYBOOK locations here
(5) - Load module location, load module will be created
here. this
location needs to be given in run jcl.
(5) & (6) - specify the location of DBRM, ( same location
used in step1 ).
Quick Start on IKJEFT01 utility
Quick Start on IKJEFT01 Utility
1) Unload data using DB2 Utility IKJEFT01
2) DB2 BIND using IKJEFT01 Utility
3) Executing DB2 program using IKJEFT01 Utitlity.
1) IKJEFT01 can be used to extract data from db2 tables.
as shown below.
JCL to extract data from db2 tables using IKJEFT01 Utility.
//STEP002 EXEC PGM=IKJEFT01,
// DYNAMNBR=20,COND=(0,NE)
//STEPLIB DD DISP=SHR,
// DSN=SYS.DB2.XXX.RUNXX.LOAD
// DD DISP=SHR,
// DSN=SYS.DB2.XXX.SDSNEXIT
// DD DISP=SHR,
// DSN=SYS.DB2.XXX.SDSNLOAD
//SYSIN DD *
SELECT *
FROM EMP_TABLE
WITH UR;
//*
//SYSTSIN DD *
DSN SYSTEM(XXX) RETRY(20)
RUN PROGRAM(DSNTIAUL) PLAN(DSNTIAUL) PARMS('SQL') -
LIB ('SYS.DB2.XXX.RUNXX.LOAD')
END
/*
//***UNLOAD FILE
//SYSREC00 DD DISP=(NEW,CATLG,DELETE),
// DSN=DEV.UNLOAD.FILE,
// UNIT=SYSDA,SPACE=(CYL,(50,50),RLSE)
//*
//***TABLE STRUCTURE
//SYSPUNCH DD DUMMY
//*
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
2) Using IKJEFT01 utility for DB2 BIND Sample JCL to DB2 BIND
//* DB2 BIND JCL
//*
//BIND EXEC PGM=IKJEFT01,
// COND=(4,LT),
// REGION=4096K
//STEPLIB DD DISP=SHR,
// DSN=XXX4.DB2.XXXX.XXXXLOAD
//DBRMLIB DD DISP=SHR,
// DSN=DEV.SURESH.DBRM(DB2PROG) <---------------
(1)
//SYSPRINT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM (DEVDB )
BIND MEMBER (DB2PROG) -
PACKAGE (PACKG11) -
LIBRARY ('DEV.SURESH.DBRM') - <----------------
(2)
ACTION (REP) -
ISOLATION (CS) -
VALIDATE (BIND)-
RELEASE (COMMIT) -
OWNER (SURESH) -
QUALIFIER (DEVQUALI)
END
/*
(1) & (2) - specify the location of DBRM.
It is a part of cobol db2 compile jcl.. Refer COBOL DB2 program
compile JCL
3) Using IKJEFT01 utility for executing cobol db2 program.
Sample JCL to execute IKJEFT01 utility to run COBOL DB2
program.
//** COBOL DB2 RUN JCL
//STEP01 EXEC PGM=IKJEFT01,
// DYNAMNBR=20
//*
//STEPLIB DD DISP=SHR,
// DSN=SYSL.DB2.DEV.XXXXLOAD
// DD DISP=SHR,
// DSN=SYSL.DB2.DEV.XXXXYYYY
//*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(DEVDB)
RUN PROGRAM(DB2PROG) -
PLAN(PLAN11111) -
LIBRARY('DEV.SURESH.LOADLIB')
END
/*
//SYSOUT DD SYSOUT=*
//SYSIN DD *
//*
//* COBOL DB2 RUN JCL ENDS
DB2
COBOL DB2 PROGRAMMING - 1
Writing a COBOL DB2 Program.
Let us assume we are writing a cobol program to
read EMPLOYEE
table and get the details of employee with the name
XXXXXXX.
Let us go in step wise..
create the following table in db2 or assume it is
there in db2 database.
EMPLYEE
EMPID EMPNAME DEPARTMENT SALARY
DESIGNATION
1000 XXXXXXX XX 10000 SE
1001 YYYYYYY YY 9000 SE
1002 ZZZZZZZ ZZ 20000 MA
STEP 1. We need to declare the table structure in
the
WORKING-STORAGE SECTION or LINKAGE
SECTION.
EXEC SQL
DECLARE DSNXXX.EMPLOYEE
( EMPID CHAR(10)
NOT NULL,
EMPNAME CHAR(30)
NOT NULL,
DEPARTMENT CHAR(2)
NOT NULL,
SALARY
DECIMAL(10,2) NOT NULL,
DESIGNATION CHAR(4)
NOT NULL )
END-EXEC.
we can use DB2 tool called DCLGEN to
generate this declaration
for us and can include that copy book
here.
if you create a copybook using DCLGEN. Use
following sntax to include
EXEC SQL
INCLUDE < copybookname >
END-EXEC.
STEP 2. Declare host variables in WORKING-STORAGE
SECTION.
HOST VARIABLES - A host variable is a
data item declared in cobol to use
it in embedded SQL.
For EMPLOYEE table, host variable
declaration is look like as follows...
01 EMPOYEE-RECORD.
05 HV-EMPID PIC X(10).
05 HV-EMPNAME PIC X(30).
05 HV-DEPARTMENT PIC X(2).
05 HV-SALARY PIC
S9(8)V99 COMP-3.
05 HV-DESIGNATION PIC
CHAR(4).
If you use db2 tool DCLGEN, it will
automatically creates this structure also
along with table declaration specified in
step1.
STEP 3. Include SQLCA as follows in WORKING-
STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
What is SQLCA?
SQLCA - SQL communication area.
When a SQL statement executes,
DB2 places a value in SQLCODE AND
SQLSTATE host variables or any
other fields of SQLCA. based on
the values in these variables we
can know whether sql ran
sucessfully or not.
SQLCA contains a declartion of
fields like SQLCODE,SQLSTATE and
SQLERRD etc....
STEP 4. Add a sql statement in procdure division
to get the details of employee
with the name XXXXXXX.
DISPLAY ' PROGRAM STARTED .... '
.........
EXEC SQL
SELECT SALARY
INTO :HV-SALARY
FROM EMPLOYEE
WHERE EMPNAME = 'XXXXXXX'
END-EXEC.
IF SQLCODE = 0
DISPLAY ' SQL EXECUTED SUCESSFULLY '
DISPLAY ' EMPLOYEE SALARY IS '
HV-SALARY
ELSE
DISPLAY ' SQL FAILED '
DIAPLY ' SQL CODE ' SQLCODE
END-IF.
....
....
DISPLAY ' PROGRAM ENDED'.
Here SQLCODE = 0 means, sql ran sucessfully without
any issues. Hence
we are displaying the HV-SALARY into the spool.
If SQLCODE NOT = 0 , there is issue in executing
the sql statement.
Now we have compeleted coding a cobol-db2 program.
our next step is to
compile the program.
SAMPLE COMPILE JCL
Click here to see the compile JCL. Use this compile
jcl to compile the program.
SAMPLE RUN JCL
Click here to see the sample run jcl. Use this run
jcl to run the program.