Search code examples
mainframejcl

How to run dymanic SQL through IKJEFT01 Utility?


How can we pass parameters in SQL query while executing IKJEFT01? Example:

//UNLOAD    EXEC PGM=IKJEFT01
//SYSTSPRT  DD SYSOUT=*
//SYSTSIN   DD *  DSN SYSTEM(DB2X) RETRY(120)
RUN PROGRAM(DSNTIAUL)
PLAN(DSNTIAUL) -
PARM('SQL')
END
//SYSPRINT  DD SYSOUT=*
//SYSUDUMP  DD SYSOUT=D
//SYSREC00  DD DSN=FCSTN.AK.XXXXXX,
//          DISP=(NEW,CATLG,DELETE),
//SYSPUNCH  DD SYSOUT=*                                           
//SYSIN     DD *
SELECT * FROM ABC.DEF WHERE XYZ='999'   
/*

Instead of giving value in sql query as '999' i want to pass the value through a variable. How this can be done? Plz help...!


Solution

  • Have a separate step, prior to your UNLOAD step, that writes the variable line(s) of SQL to a temporary file. Then concatenate that temporary file with the unchanging lines of SQL.

    Freehand...

    //SETVAR   EXEC PGM=PRM2FILE,PARM='WHERE XYZ=''&VAL'''
    //SYSPRINT DD  SYSOUT=*
    //OUTPUT01 DD  DISP=(NEW,PASS,DELETE),
    //             LRECL=80,
    //             AVGREC=U,
    //             RECFM=FB,
    //             SPACE=(80,(1,1),RLSE)
    //*
    //UNLOAD    EXEC PGM=IKJEFT01
    //SYSTSPRT  DD SYSOUT=*
    //SYSTSIN   DD *  DSN SYSTEM(DB2X) RETRY(120)
    RUN PROGRAM(DSNTIAUL)
    PLAN(DSNTIAUL) -
    PARM('SQL')
    END
    //SYSPRINT  DD SYSOUT=*
    //SYSUDUMP  DD SYSOUT=D
    //SYSREC00  DD DSN=FCSTN.AK.XXXXXX,
    //          DISP=(NEW,CATLG,DELETE),
    //SYSPUNCH  DD SYSOUT=*                                           
    //SYSIN     DD *
    SELECT * FROM ABC.DEF
    //          DD  DISP=(OLD,PASS),DSN=*.SETVAR.OUTPUT01
    //*
    

    ...where PRM2FILE is a program you write to take whatever is in the parm field and write it to the OUTPUT01 DD.

    We do this a lot to accomplish the same goal you are trying to achieve.