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
/* ******************************************************************
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
Related topic
Tip: For faster searching, add an asterisk to the end of your partial query. Example: cert*