Information

This site will undergo a brief period of maintenance on Friday, 18 December at 12:30 AM Central/12:00 PM IST. During a 30 minute window, site availability may be intermittent.

Information
Limited support BMC provides limited support for this version of the product. As a result, BMC no longer accepts comments in this space. If you encounter problems with the product version or the space, contact BMC Support.BMC recommends upgrading to the latest version of the product. To see documentation for that version, see REORG PLUS for DB2 13.1.

Sample MAPTEXIT REXX exit


The following figure shows the sample MAPTEXIT REXX exit provided with REORG PLUS:

/* REXX  */
/* ******************************************************************
 SAMPLE REXX EXIT FOR THE 'MAPTEXIT' EXIT-POINT.

 THE SAMPLE EXIT PERFORMS THE FOLLOWING FUNCTIONS:
  1. DISPLAYS ALL VALUES BUT MAKES NO CHANGES.
  2. CONNECTS TO DB2 SUBSYSTEM USING DSNREXX.
  3. CREATES MAPPING TABLE FOR IBM SHRLEVEL CHANGE REORG BEFORE
     ARUUMAIN CALL TO DSNUTILB OR...
     DROPS MAPPING TABLE FOR IBM SHRLEVEL CHANGE REORG AFTER
     ARUUMAIN CALL TO DSNUTILB.
  4. DISCONNECTS FROM DB2 SUBSYSTEM
  5. RETURNS BMC_MAPT_CREATOR AND BMC_MAPT_TABLE TO REORG PLUS TO BE
     USED IN BUILDING DSNUTILB COMMAND STATEMENT.

 NOTE: 1. ERRORS IN THIS EXIT MAY CAUSE REORG PLUS OR CALL TO DSNUTILB
          TO FAIL.
       2. INVALID VALUES RETURNED ARE NOT VALIDATED BY REORG PLUS.

 THERE ARE THREE WAYS THIS REXX CAN BE PASSED TO A REORG PLUS JOB:
  1. AS A COMPILED REXX LOAD MODULE BY COMPILING THIS SOURCE USING
     THE REXX COMPILER WITH THE 'NOCEXEC' OPTION AND LINKING THE
     MODULE INTO AN UNFORMATTED PDS. SPECIFY THAT DATASET ON THE
     STEPLIB DD OF THE REORG PLUS JOB AND ENSURE THE DATASET IS
     APF AUTHORIZED.

  2. AS INTERPRETED REXX BY COPYING THIS EXAMPLE INTO A FORMATTED
     SEQUENTIAL DATASET OR PDS. SPECIFY THAT DATASET ON THE SYSEXEC
     DD OF THE REORG PLUS JOB.

  3. AS 'COMPILED EXEC' REXX BY COMPILING THIS SOURCE USING THE
     REXX COMPILER WITH THE 'CEXEC' OPTION AND LINKING THE MODULE
     INTO A FORMATTED SEQUENTIAL DATASET OR PDS (CAN BE THE SAME
     PDS AS INTERPRETED REXX).  SPECIFY THAT DATASET ON THE SYSEXEC
     DD OF THE REORG PLUS JOB.
 ******************************************************************* */
ARG PARM
IF PARM == '' THEN DO
   BMC_MAPT_NOCEXEC = 'N'
   END
ELSE DO
   BMC_MAPT_NOCEXEC = 'Y'
   PARSE UPPER VAR PARM BMC_EXIT_POINT,
                        BMC_UTIL_ID,
                        BMC_UTILITY_NAME,
                        BMC_DB2_RELEASE,
                        BMC_UTILITY_SHRLEVEL,
                        BMC_JOBNAME,
                        BMC_STEPNAME,
                        BMC_DBNAME,
                        BMC_TSIX,
                        BMC_USERID,
                        BMC_VCATNAME,
                        BMC_DB2_SSID,
                        BMC_DB2_GROUPNAME,
                        BMC_DATE,
                        BMC_TIME,
                        BMC_DATE8,
                        BMC_TIME4,
                        BMC_DATEJ,
                        BMC_UTILPFX,
                        BMC_UTILSFX,
                        BMC_REORG_TYPE,
                        BMC_MAPT_TYPE,
                        BMC_MAPT_AUTH,
                        BMC_MAPT_CRLN_ADDR,
                        BMC_MAPT_CRNM_ADDR,
                        BMC_MAPT_TBLN_ADDR,
                        BMC_MAPT_TBNM_ADDR
   END
SAY '**** START *********** ' BMC_EXIT_POINT ' ************'
SAY ' '

IF BMC_MAPT_NOCEXEC = 'N' THEN DO
   SAY '*   EXECUTING REXX VIA SYSEXEC DD'
   END
ELSE DO
   SAY '*   EXECUTING COMPILED REXX VIA STEPLIB DD'
   END

/* ****************************************************************
   IF DESIRED, MODIFY VALUES FOR BMC_MAPT_AUTH, BMC_MAPT_CREATOR,
   BMC_MAPT_SUFX, BMC_MAPT_TABLE, OR BMC_MAPT_INDEX AFTER THIS
   COMMENT. OTHERWISE, DEFAULT VALUES WILL BE USED.

   DO NOT MODIFY THE VALUE OF ANY OTHER VARIABLE.
******************************************************************* */
BMC_MAPT_CREATOR = BMC_USERID
BMC_MAPT_SUFX = BMC_JOBNAME

BMC_MAPT_TABLE = 'MAP_TBL_'||STRIP(BMC_MAPT_SUFX)
BMC_MAPT_INDEX = 'XMAP_TBL_'||STRIP(BMC_MAPT_SUFX)

/* ****************************************************************
   MODIFICATIONS AFTER THIS COMMENT ARE NOT RECOMMENDED.
******************************************************************* */

SAY '*   BMC_DB2_SSID               = ' BMC_DB2_SSID
SAY '*   BMC_DB2_RELEASE            = ' BMC_DB2_RELEASE
SAY '*   BMC_MAPT_TYPE              = ' BMC_MAPT_TYPE
SAY '*   BMC_MAPT_AUTH              = ' BMC_MAPT_AUTH
SAY '*   BMC_MAPT_CREATOR           = ' BMC_MAPT_CREATOR
SAY '*   BMC_MAPT_SUFX              = ' BMC_MAPT_SUFX
SAY '*   BMC_MAPT_TABLE             = ' BMC_MAPT_TABLE
SAY '*   BMC_MAPT_INDEX             = ' BMC_MAPT_INDEX

SAY ' '

/* ****************************************************************
   ENSURE DSNREXX COMMAND ENVIRONMENT AVAILABLE - ADD IT IF NOT
******************************************************************* */

'SUBCOM DSNREXX'                     /*  HOST CMD ENV AVAILABLE?  */
IF RC THEN S_RC = RXSUBCOM('ADD','DSNREXX','DSNREXX')

/* ****************************************************************
   CONNECT TO DB2 USING VARIABLE PASSED FROM REORG
******************************************************************* */

CURR_FUNC = 'CONNECT TO DB2'
ADDRESS DSNREXX 'CONNECT' BMC_DB2_SSID

IF SQLCODE = 0 THEN DO
   SAY '*** CONNECTED TO SUBSYSTEM = ' BMC_DB2_SSID
   SAY ' '
   END
ELSE DO
   SAY '*** CONNECT TO SUBSYSTEM = ' BMC_DB2_SSID ' *** FAILED ***'
   SAY ' '
   SIGNAL BAD_SQLCODE
   END

CURR_FUNC = 'SET SQLID TO AUTHID'
SQLAUTH = 'SET CURRENT SQLID = ' BMC_MAPT_AUTH

   SQLCALL = 'EXECSQL ' SQLAUTH
   ADDRESS DSNREXX SQLCALL

IF BMC_MAPT_TYPE = 'CREATE' THEN DO
   SIGNAL CREATE_TABLE
   END
ELSE DO
   SIGNAL DROP_TABLE
   END

/* ****************************************************************
   CREATE MAPPING TABLE
******************************************************************* */
CREATE_TABLE:

CURR_FUNC = 'CREATE TABLE'

IF BMC_DB2_RELEASE < 1100 THEN DO
   SQLCRTTB = 'CREATE TABLE ',
      STRIP(BMC_MAPT_CREATOR)||'.'||BMC_MAPT_TABLE,
      ' (TYPE         CHAR( 01 ) NOT NULL, ',
      '  SOURCE_RID   CHAR( 05 ) NOT NULL, ',
      '  TARGET_XRID  CHAR( 09 ) NOT NULL, ',
      '  LRSN         CHAR( 06 ) NOT NULL) '
   END
ELSE DO
   SQLCRTTB = 'CREATE TABLE ',
      STRIP(BMC_MAPT_CREATOR)||'.'||BMC_MAPT_TABLE,
      ' (TYPE         CHAR( 01 ) NOT NULL, ',
      '  SOURCE_RID   CHAR( 05 ) NOT NULL, ',
      '  TARGET_XRID  CHAR( 09 ) NOT NULL, ',
      '  LRSN         CHAR( 10 ) NOT NULL) '
   END

SAY '*** CREATING MAPPING TABLE ***'
SAY ' '

SQLCALL = 'EXECSQL ' SQLCRTTB
ADDRESS DSNREXX SQLCALL

SELECT
   WHEN (SQLCODE = -601) | (SQLCODE = 0) THEN DO
      IF SQLCODE = 0 THEN DO
         SAY '*   TABLE ' STRIP(BMC_MAPT_CREATOR)||'.',
         ||BMC_MAPT_TABLE ' CREATED'
         SAY ' '
         END
      ELSE DO
         SIGNAL RESTART_PROCESS
         END
      END
   OTHERWISE SIGNAL BAD_SQLCODE
END

CURR_FUNC = 'COMMIT TABLE CREATE'
ADDRESS DSNREXX  'EXECSQL  COMMIT'

IF SQLCODE = 0 THEN DO
   SIGNAL CREATE_INDEX
   END
ELSE DO
   SAY '*   COMMIT FAILED'
   SAY ' '
   SIGNAL BAD_SQLCODE
   END

/* ****************************************************************
   RESTART PROCESSING, DROP TABLE/INDEX UNLESS -666
******************************************************************* */
RESTART_PROCESS:

SAY '*   TABLE ' STRIP(BMC_MAPT_CREATOR)||'.'||BMC_MAPT_TABLE,
    ' EXISTS FROM PREVIOUS EXECUTION, DETERMINE DROP OR REUSE...'
SAY ' '
CURR_FUNC = 'RESTART DROP MAPPING TABLE AND INDEX'
SQLDRPTB = 'DROP TABLE ' STRIP(BMC_MAPT_CREATOR)||'.'BMC_MAPT_TABLE
SQLCALL = 'EXECSQL ' SQLDRPTB
ADDRESS DSNREXX SQLCALL
SELECT
   WHEN (SQLCODE = -666) | (SQLCODE = 0) THEN DO
      IF SQLCODE = 0 THEN DO
         SAY '*   TABLE ' STRIP(BMC_MAPT_CREATOR)||'.'||BMC_MAPT_TABLE,
             ' EXPLICITLY DROPPED.'
         SAY ' '
         SAY '*   INDEX ' STRIP(BMC_MAPT_CREATOR)||'.'||BMC_MAPT_INDEX,
             ' IMPLICITLY DROPPED.'
         SAY ' '
         END
      ELSE DO
         SAY '*   TABLE ' STRIP(BMC_MAPT_CREATOR)||'.'||BMC_MAPT_TABLE,
             ' WILL BE REUSED.'
         SAY ' '
         SAY '*   INDEX ' STRIP(BMC_MAPT_CREATOR)||'.'||BMC_MAPT_INDEX,
             ' WILL BE REUSED.'
         SAY ' '
         CURR_FUNC = 'RESTART COMMIT TABLE DROP/REUSE'
         ADDRESS DSNREXX  'EXECSQL  COMMIT'
         IF SQLCODE = 0 THEN DO
            SIGNAL DISCONNECT_FROM_DB2
            END
         ELSE DO
            SAY '*   COMMIT FAILED'
            SAY ' '
            SIGNAL BAD_SQLCODE
            END
         END
      END
   OTHERWISE SIGNAL BAD_SQLCODE
END

CURR_FUNC = 'RESTART TABLE CREATE'
SQLCALL = 'EXECSQL ' SQLCRTTB
ADDRESS DSNREXX SQLCALL
IF SQLCODE = 0 THEN DO
   SAY '*   TABLE ' STRIP(BMC_MAPT_CREATOR)||'.',
   ||BMC_MAPT_TABLE ' RECREATED FOR CURRENT EXECUTION'
   SAY ' '
   END
ELSE DO
   SIGNAL BAD_SQLCODE
   END

CURR_FUNC = 'RESTART COMMIT TABLE CREATE'
ADDRESS DSNREXX  'EXECSQL  COMMIT'

IF SQLCODE = 0 THEN DO
   SIGNAL CREATE_INDEX
   END
ELSE DO
   SAY '*   COMMIT FAILED'
   SAY ' '
   SIGNAL BAD_SQLCODE
   END

/* ****************************************************************
   CREATE MAPPING TABLE INDEX
******************************************************************* */
CREATE_INDEX:

CURR_FUNC = 'CREATE INDEX'
SQLCRTIX = 'CREATE UNIQUE INDEX ',
    STRIP(BMC_MAPT_CREATOR)||'.'||BMC_MAPT_INDEX,
    ' ON ' STRIP(BMC_MAPT_CREATOR)||'.'||BMC_MAPT_TABLE,
    ' (SOURCE_RID ASC, TYPE, TARGET_XRID, LRSN)',
    ' USING STOGROUP SYSDEFLT PRIQTY -1 SECQTY -1'

SAY '*** CREATING MAPPING INDEX ***'
SAY ' '

SQLCALL = 'EXECSQL ' SQLCRTIX
ADDRESS DSNREXX SQLCALL

SELECT
   WHEN (SQLCODE = -601) | (SQLCODE = 0) THEN DO
      IF SQLCODE = 0 THEN DO
         SAY '*   INDEX ' STRIP(BMC_MAPT_CREATOR)||'.',
         ||BMC_MAPT_INDEX ' CREATED'
         SAY ' '
         END
      ELSE DO
         SAY '*   INDEX ' STRIP(BMC_MAPT_CREATOR)||'.',
         ||BMC_MAPT_INDEX ' EXISTS FROM PREVIOUS EXECUTION, DROPPING...'
         SAY ' '
         CURR_FUNC = 'DROP   INDEX'
         SQLDRPIX = 'DROP INDEX ',
             STRIP(BMC_MAPT_CREATOR)||'.'||BMC_MAPT_INDEX
         SQLCALL = 'EXECSQL ' SQLDRPIX
         ADDRESS DSNREXX SQLCALL
         IF SQLCODE = 0 THEN DO
            SAY '*   INDEX ' STRIP(BMC_MAPT_CREATOR)||'.'||BMC_MAPT_INDEX,
                ' EXPLICITLY DROPPED.'
            SAY ' '
            END
         ELSE DO
            SIGNAL BAD_SQLCODE
            END
         SQLCALL = 'EXECSQL ' SQLCRTIX
         ADDRESS DSNREXX SQLCALL
         IF SQLCODE = 0 THEN DO
            SAY '*   INDEX ' STRIP(BMC_MAPT_CREATOR)||'.',
            ||BMC_MAPT_INDEX ' RECREATED FOR CURRENT EXECUTION'
            SAY ' '
            END
         ELSE DO
            SIGNAL BAD_SQLCODE
            END
         END
      END
   OTHERWISE SIGNAL BAD_SQLCODE
END

CURR_FUNC = 'COMMIT INDEX CREATE'
ADDRESS DSNREXX  'EXECSQL  COMMIT'
IF SQLCODE = 0 THEN DO
   SIGNAL DISCONNECT_FROM_DB2
   END
ELSE DO
   SAY '*   COMMIT FAILED'
   SAY ' '
   SIGNAL BAD_SQLCODE
   END

/* ****************************************************************
   DROP MAPPING TABLE AND INDEX
******************************************************************* */
DROP_TABLE:

CURR_FUNC = 'DROP MAPPING TABLE AND INDEX'
SQLDRPTB = 'DROP TABLE ' STRIP(BMC_MAPT_CREATOR)||'.'BMC_MAPT_TABLE

SAY '*** DROPPING MAPPING TABLE AND INDEX ***'
SAY ' '

SQLCALL = 'EXECSQL ' SQLDRPTB
ADDRESS DSNREXX SQLCALL

SELECT
   WHEN (SQLCODE = -204) | (SQLCODE = 0) THEN DO
      IF SQLCODE = 0 THEN DO
         SAY '*   TABLE ' STRIP(BMC_MAPT_CREATOR)||'.'||BMC_MAPT_TABLE,
             ' EXPLICITLY DROPPED.'
         SAY ' '
         SAY '*   INDEX ' STRIP(BMC_MAPT_CREATOR)||'.'||BMC_MAPT_INDEX,
             ' IMPLICITLY DROPPED.'
         SAY ' '
         END
      ELSE DO
         SAY '*   TABLE ' STRIP(BMC_MAPT_CREATOR)||'.'||BMC_MAPT_TABLE,
             ' DOES NOT EXIST.'
         SAY ' '
         END
      END
   OTHERWISE SIGNAL BAD_SQLCODE
END

CURR_FUNC = 'COMMIT TABLE AND INDEX DROP'
ADDRESS DSNREXX  'EXECSQL  COMMIT'

IF SQLCODE /= 0 THEN DO
   SAY '*   COMMIT FAILED'
   SAY ' '
   SIGNAL BAD_SQLCODE
   END

/* ****************************************************************
   DISCONNECT DB2 THREAD
******************************************************************* */
DISCONNECT_FROM_DB2:

  ADDRESS DSNREXX DISCONNECT            /*  DISCONNECT INTERFACES */

/* ****************************************************************
   FOR NOCEXEC COMPILED REXX, USE STORAGE FUNCTION TO PASS
   BMC_MAPT_CREATOR AND BMC_MAPT_TABLE BACK TO ARUUMAIN.

   FOR INTERPRETED AND CEXEC COMPILED REXX, ARUUMAIN MAKES A CALL
   TO IRXEXCOM TO RETRIEVE BMC_MAPT_CREATOR AND BMC_MAPT_TABLE
******************************************************************* */
IF BMC_MAPT_NOCEXEC = 'Y' THEN DO
   /* STORE TABLE CREATOR  */
   BMC_MAPT_CREATOR = STRIP(BMC_MAPT_CREATOR)
   BMC_MAPT_CRLEN = LENGTH(BMC_MAPT_CREATOR)
   STCRLN = STORAGE(BMC_MAPT_CRLN_ADDR,,D2C(BMC_MAPT_CRLEN,2))
   STCRNM = STORAGE(BMC_MAPT_CRNM_ADDR,BMC_MAPT_CRLEN,BMC_MAPT_CREATOR)

   /* STORE TABLE NAME     */
   BMC_MAPT_TABLE = STRIP(BMC_MAPT_TABLE)
   BMC_MAPT_TBLEN = LENGTH(BMC_MAPT_TABLE)
   STTBLN = STORAGE(BMC_MAPT_TBLN_ADDR,,D2C(BMC_MAPT_TBLEN,2))
   STTBNM = STORAGE(BMC_MAPT_TBNM_ADDR,BMC_MAPT_TBLEN,BMC_MAPT_TABLE)
   END

SAY
SAY '**** END   *********** ' BMC_EXIT_POINT ' ************'
SAY

RETURN     /*  NORMAL EXIT FOR THIS PROGRAM */
/* ****************************************************************
   SQL ERROR - IF YOU GET HERE SOMETHING BAD HAPPENED
******************************************************************* */
BAD_SQLCODE:
   SAY
   SAY '*** ERROR DURING DB2 '''CURR_FUNC''' SQLCODE ' SQLCODE

SAY
SAY '********************  SQLCA CONTENTS ********************'

SAY 'SQLCODE     = ' SQLCODE
SAY 'SQLERRMC    = ' SQLERRMC
SAY 'SQLERRP     = ' SQLERRP

T_INDEX = 1
DO WHILE T_INDEX <= 6               /* LOOP THROUGH SQLERRD 1-6 */
   SAY 'SQLERRD.'T_INDEX'   = ' SQLERRD.T_INDEX
   T_INDEX = T_INDEX + 1
END

T_INDEX = 1
DO WHILE T_INDEX <= 9               /* LOOP THROUGH SQLWARN 1-9 */
   SAY 'SQLWARN.'T_INDEX'   = ' SQLWARN.T_INDEX
   T_INDEX = T_INDEX + 1
END

SAY 'SQLWARN.10  = ' SQLWARN.10     /* THIS KEEPS SYSPRINT ALIGNED */
SAY 'SQLSTATE    = ' SQLSTATE

SAY
SAY '****** TERMINATING DUE TO SQL ERROR IN ' BMC_EXIT_POINT

EXIT 8



 

Tip: For faster searching, add an asterisk to the end of your partial query. Example: cert*

REORG PLUS for DB2 11.2