2008/07/24

REXX,ZOS] DSN CHECK

***************************** Top of Data ******************************
//LGCJDBQC JOB (WVCF3E,BP1A),'LGCJDBQ',
// CLASS=M,SCHENV=DV0A,
// MSGCLASS=Y,NOTIFY=&SYSUID
//* TLCH.MIGUF.KBSLIB(RXCHKDSN)
//REXXRUN EXEC PGM=IKJEFT01,PARM='RXCHKDSN LCE-LOAD'
//SYSEXEC DD DISP=SHR,DSN=TLCH.MIGUF.KBSLIB
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD DUMMY
**************************** Bottom of Data ****************************


***************************** Top of Data ******************************
/* REXX */
/* INPUT ARG PARM = LCB-UNLD */
ARG WORK_GB

DSN_CHK_HEAD = SUBSTR(WORK_GB,1,3)
DSN_CHK_MIDL = SUBSTR(WORK_GB,5,4)

IF SUBSTR(WORK_GB,3,1)="B" THEN S_COND="L.DBNAME LIKE 'LCB%'"
ELSE IF SUBSTR(WORK_GB,3,1)="E" THEN S_COND="L.DBNAME LIKE 'LCE%'"
ELSE IF SUBSTR(WORK_GB,3,1)="F" THEN S_COND="L.DBNAME LIKE 'LCF%'"
ELSE IF SUBSTR(WORK_GB,3,1)="H" THEN S_COND="L.DBNAME LIKE 'LCH%'"
ELSE DO
SAY "INVALID INPUT VALUE !!! CHECK YOUR INPUT PARAMETER~ "
EXIT(8)
END

CALL GET_OBJ_LIST

EXIT
/* ------------------------------------------------------------- */
GET_OBJ_LIST:

IDX = 0
DROP IDBNAME.
DROP ITBNAME.
DROP IPARTCNT.
DROP ILOADTYPE.

"SUBCOM DSNREXX"
IF RC THEN S_RC = RXSUBCOM('ADD','DSNREXX','DSNREXX')
ADDRESS DSNREXX "CONNECT" DV0A

SEL_STMT = "SELECT L.DBNAME,L.TBNAME,TS.PARTITIONS ",
" ,L.LOAD_TYPE ",
" FROM SYSIBM.SYSTABLESPACE TS,CDBD2D20.TD2L0 L ",
" WHERE (L.NUM_CONV=6 AND ",
S_COND || ")",
" AND (TS.DBNAME=L.DBNAME AND TS.NAME=L.TBNAME) ",
" ORDER BY 1,2 ",
" WITH UR "

ADDRESS DSNREXX "EXECSQL DECLARE C1 CURSOR WITH HOLD FOR S1"
IF SQLCODE = 0 THEN
ADDRESS DSNREXX "EXECSQL PREPARE S1 FROM :SEL_STMT"
IF SQLCODE = 0 THEN
ADDRESS DSNREXX "EXECSQL OPEN C1"
IF SQLCODE = 100 THEN DO
ADDRESS DSNREXX "EXECSQL CLOSE C1"
'THERE IS NO TABLES USING ' || S_BP || ' BPOOL. '
EXIT(4)
END
ELSE
DO FOREVER
ADDRESS DSNREXX "EXECSQL FETCH C1 INTO :DB_NAME ",
" ,:TB_NAME ",
" ,:PART_CNT ",
" ,:LOAD_TYPE "
IF SQLCODE = 0 THEN DO
/*
IDX = IDX + 1
IDBNAME.IDX = DB_NAME
ITBNAME.IDX = TB_NAME
IPARTCNT.IDX = PART_CNT
ILOADTYPE.IDX = LOAD_TYPE
*/
CALL DSN_CHECK
END
ELSE IF SQLCODE = 100 THEN DO
/*
IDBNAME.0 = IDX
ITBNAME.0 = IDX
IPARTCNT.0 = IDX
ILOADTYPE.0 = IDX
*/
ADDRESS DSNREXX "EXECSQL CLOSE C1"
LEAVE
END
ELSE DO
SAY " FETCH SQLCODE : " SQLCODE
SAY " FETCH SQLERRMC : " SQLERRMC
EXIT(8)
END
END
RETURN
/* -------------- */
DSN_CHECK:

I = 1

IF DSN_CHK_MIDL = "UNLD" & PART_CNT = 0 THEN DO
CHK_DSN = "'S"||DSN_CHK_HEAD||".MIGUF."||TB_NAME||"."||,
DSN_CHK_MIDL||".P000'"
SAY SUBSTR(CHK_DSN,2,26) LISTDSI(CHK_DSN)
END

ELSE IF DSN_CHK_MIDL = "UNLD" & PART_CNT > 0 THEN
DO I=1 TO PART_CNT BY 1
PART_NUM = TRANSLATE(FORMAT(I,3),'0',' ')
CHK_DSN = "'S"||DSN_CHK_HEAD||".MIGUF."||TB_NAME||"."||,
DSN_CHK_MIDL||".P"||PART_NUM||"'"
SAY SUBSTR(CHK_DSN,2,26) LISTDSI(CHK_DSN)
END

ELSE IF DSN_CHK_MIDL = "LOAD" & PART_CNT = 0 THEN DO
SELECT
WHEN LOAD_TYPE = "Y" | LOAD_TYPE = "E" THEN DO
CHK_DSN = "'Q"||DSN_CHK_HEAD||".MIGUF."||TB_NAME||"."||,
DSN_CHK_MIDL||".P000'"
SAY SUBSTR(CHK_DSN,2,26) LISTDSI(CHK_DSN)
END
WHEN LOAD_TYPE = "S" THEN DO
CHK_DSN = "'S"||DSN_CHK_HEAD||".MIGUF."||TB_NAME||"."||,
"UNLD.P000'"
SAY SUBSTR(CHK_DSN,2,26) LISTDSI(CHK_DSN)
END
OTHERWISE NOP
END
END

ELSE IF DSN_CHK_MIDL = "LOAD" & PART_CNT > 0 THEN DO
SELECT
WHEN LOAD_TYPE = "Y" | LOAD_TYPE = "E" THEN
DO I=1 TO PART_CNT BY 1
PART_NUM = TRANSLATE(FORMAT(I,3),'0',' ')
CHK_DSN = "'Q"||DSN_CHK_HEAD||".MIGUF."||TB_NAME||"."||,
DSN_CHK_MIDL||".P"||PART_NUM||"'"
SAY SUBSTR(CHK_DSN,2,26) LISTDSI(CHK_DSN)
END
WHEN LOAD_TYPE = "S" THEN
DO I=1 TO PART_CNT BY 1
PART_NUM = TRANSLATE(FORMAT(I,3),'0',' ')
CHK_DSN = "'S"||DSN_CHK_HEAD||".MIGUF."||TB_NAME||"."||,
"UNLD.P"||PART_NUM||"'"
SAY SUBSTR(CHK_DSN,2,26) LISTDSI(CHK_DSN)
END
OTHERWISE NOP
END
END

ELSE DO
SAY "COULD YOU CHECK YOUR INTPUT >> "DSN_CHK_MIDL" & " PART_CNT
END

RETURN
**************************** Bottom of Data ****************************

2008/07/15

DB2,ZOS] DB2 DCLGEN JCL

//JS020 EXEC PGM=IKJEFT01,REGION=0M,DYNAMNBR=20
//STEPLIB DD DISP=SHR,DSN=DSNA.SDSNLOAD
//SYSTSIN DD *
DSN SYSTEM(DSNA)
DCLGEN TABLE(ABCD23F0.ZABCD) -
LIBRARY('DSNA.DCLLIB(ABCD23F0)') -
ACT(REP) -
NAMES(E3FM-) -
STRUCTURE(ABCD23F0) -
COLSUFFIX(YES)
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSIN DD DUMMY

REXX,ZOS] jcl의 dsn 사용 목록 출력하기

/* REXX */

MEMNM='';

EXITRC = LISTDSI("ISFEXT" "FILE")
IF EXITRC <> 0 THEN
DO
EXTDSN = "'QLCH.MIGJW.DBAWORK.DSN.PARSE'"
IF SYSDSN(EXTDSN) = 'OK' THEN "DELETE" EXTDSN
"ALLOC F(ISFEXT) DA("EXTDSN") NEW CATALOG SPACE(1 10) ",
"CYLINDERS LRECL(53) BLKSIZE(27984) RECFM(F B) UNIT(SYSDA)"
IF RC <> 0 THEN EXIT(83)
END

"ALLOC FI(MEMLIST) DA('TLCH.MIGUF.KBSLIB($MEMLIST)') SHR REU"

ADDRESS TSO "EXECIO * DISKR MEMLIST (STEM INLIST. FINIS)"

IF RC <> 0 THEN SAY "CAN'T READ INPUT MEMBER !!!"
ELSE
DO K=1 TO INLIST.0
PARSE VAR INLIST.K MEMNM .
CALL GET_DSN_LIST
"ALLOC FI(ISFEXT) DA("EXTDSN") MOD REU"
ADDRESS TSO "EXECIO * DISKW ISFEXT (FINIS"
"FREE F(ISFEXT)"
END
EXIT
/* =============================================================== */
GET_DSN_LIST:

PDSNM = "TLCH.MIGUF.JCLPDS("MEMNM")"

"ALLOC FI(GETDSNL) DA('"PDSNM"') SHR REU"

ADDRESS TSO "EXECIO * DISKR GETDSNL (STEM INMEM. FINIS)"

DO I=1 TO INMEM.0
PARSE VAR INMEM.I CONTENTS +72 .
IF INDEX(INMEM.I,"DSN=") > 0 THEN
DO
DSN_PS1 = INDEX(INMEM.I,"DSN=") + 4
DSN_CUT_LEN = 72 - DSN_PS1
DSN_CUT_NAME = SUBSTR(INMEM.I,DSN_PS1,DSN_CUT_LEN)
IF INDEX(DSN_CUT_NAME," ") > 0 THEN
DSN_LEN = INDEX(DSN_CUT_NAME," ")
IF INDEX(DSN_CUT_NAME,",") > 0 THEN
DSN_LEN = INDEX(DSN_CUT_NAME,",") - 1
DSN_NAME = LEFT(DSN_CUT_NAME,DSN_LEN)
QUEUE MEMNM","DSN_NAME
END
END
RETURN


***************************** Top of Data ******************************
//LGCJDBQS JOB (WVCF3E,BP1A),'LGCJDBQ',
// CLASS=M,SCHENV=DV0A,
// MSGCLASS=Y,NOTIFY=&SYSUID
//REXXRUN EXEC PGM=IKJEFT01,PARM='RXDSNLST'
//*EXXRUN EXEC PGM=IKJEFT01,PARM='RXDBREAD DBTM'
//STEPLIB DD DISP=SHR,DSN=DBTM.DSNLOAD
//SYSEXEC DD DISP=SHR,DSN=TLCH.MIGUF.KBSLIB
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD DUMMY
**************************** Bottom of Data ****************************