DB2/400:无日志条目时如何让DBUJRN命令正常执行?
解决DBUJRN无匹配日志条目时中断存储过程的问题
问题场景
在AS/400环境中,通过存储过程调用DBUJRN工具定期提取日志条目到文件时,若指定的时间窗口内没有匹配的日志条目,DBUJRN会报错并中断存储过程,且返回的错误信息无法直接判定是"无匹配条目"导致:
未转换任何日志条目
命令未运行。有效性检查器检测到错误。
示例DBUJRN命令:
DBU11/DBUJRN JRN(JRNLIB/JOURNAL) FILE(LIBA/FILEA) OUTFILE(LIBB/FILEA) RCVRNG(*CURCHAIN) FROMTIME(05032024 152100) TOTIME(05032024 172100) JRNCDE((R))
解决方法
方法1:捕获特定错误码,跳过中断
在调用DBUJRN的CL程序或存储过程中,使用MONMSG命令捕获无日志条目对应的错误消息ID,让程序跳过该错误继续执行。
首先需要确认无条目时的具体消息ID(可通过查看作业日志获取,比如常见的对应消息可能是CPF3204或DBU工具自定义的DBUxxxx类消息),然后在命令前添加错误捕获逻辑:
MONMSG MSGID(CPF3204 DBUxxxx) EXEC(DO /* 可选:记录无条目日志,比如调用SNDPGMMSG写日志 */ SNDPGMMSG MSG('时间窗口内无匹配日志条目,跳过DBUJRN执行') TOPGMQ(*EXT) MSGTYPE(*INFO) ENDDO) DBU11/DBUJRN JRN(JRNLIB/JOURNAL) FILE(LIBA/FILEA) OUTFILE(LIBB/FILEA) RCVRNG(*CURCHAIN) FROMTIME(05032024 152100) TOTIME(05032024 172100) JRNCDE((R))
注:需替换DBUxxxx为实际环境中DBUJRN抛出的无条目错误消息ID,可通过查看作业的详细日志获取准确ID。
方法2:先检查日志条目,再执行DBUJRN
在调用DBUJRN前,先通过SQL查询或DSPJRN命令确认指定时间窗口内是否存在符合条件的日志条目,仅当存在时才执行DBUJRN。
比如用SQL查询SYSTOOLS库的JOURNAL_ENTRIES视图:
SELECT COUNT(*) FROM SYSTOOLS.JOURNAL_ENTRIES WHERE JOURNAL_LIBRARY = 'JRNLIB' AND JOURNAL_NAME = 'JOURNAL' AND OBJECT_LIBRARY = 'LIBA' AND OBJECT_NAME = 'FILEA' AND JOURNAL_CODE = 'R' AND ENTRY_TIMESTAMP BETWEEN TIMESTAMP('2024-03-05 15:21:00') AND TIMESTAMP('2024-03-05 17:21:00');
如果查询结果大于0,再执行DBUJRN命令;否则直接跳过,避免触发错误。
内容的提问来源于stack exchange,提问作者cam55407
相关产品推荐
相关产品推荐

