【发布时间】:2017-07-17 04:20:08
【问题描述】:
大型机中是否有 DB2 系统表 - 批处理运行时日志?在 DB2 for i 系列中,有一个表函数 QSYS2.GET_JOB_INFO() 在运行时返回作业信息,包括状态(活动/完成),最重要的是 V_SQL_STATEMENT_TEXT - 最后一次 SQL 运行的语句。
场景: 我想在 Cobol Batch Job 运行时检索最后执行的 SQL 语句。这样做的主要目的是确定在作业运行时是否发出了 COMMIT 或 ROLLBACK。目的是创建一个小程序,我们称之为“控制器”,在发出 Commit 或 Commit interval 甚至 Rollback 时监控 DB2。更具体地说,这个“控制器”将充当迷你操作系统,并具有触发主程序的能力。
例如,如果主程序发出 ROLLBACK,“控制器程序”可以发出特定的业务逻辑并控制更新。可以在 T1 和 T2 类型的 DB2 连接中进行更新。通过这种方式,更新是在批处理客户端或在 EXCI 中运行的 Java 端完成的(EXCI 使用 RRS 恢复)。
【问题讨论】:
-
....好吧,为什么你想要这个?您要解决什么业务问题?请注意,您尝试做出的任何“监控和决定”都将受到严重的竞争条件的影响。还要注意,在发出
ROLLBACK或COMMIT之后尝试做出决定并做其他事情可能会引起巨大的麻烦。这两个语句几乎总是立即成功,但如果你想做一些额外的工作(比如在某处添加额外的行),那完全是不可能的。尤其是在ROLLBACK的情况下,可能会自动调用错误... -
@Clockwork-Muse 我完全同意,这种方法容易引起头痛。为了简单起见,如果主程序发出 exec SQL 提交,控制器程序也必须发出 RRS Commit(SRRCMIT),反之,如果主程序发出 SQL 回滚,控制器也必须发出 RRS 回滚( SRRBACK)。我们选择了这种方法,因为我们无法更新现有的主程序。免责声明:此方法仍在设计中,因为我们正在测试不同的方法,稍后将选择最有效的方法。谢谢!
-
我从来没有使用过这个功能(所以不能说所有的东西),但我觉得这种方法是注定的。如果您的“主要”程序因任何原因而关闭,事情就不会按照您的意愿进行。从我读到的一点点来看,您似乎想调用
COMMIT或SRRCMIT,但不能同时调用两者,而且我不确定发出该命令会产生什么影响(使用该命令意味着您正在做一些额外的处理 - 但在哪里?)。听起来你想要的不是监控程序,而是某种解释/包装层,但我怀疑你可以替换COMMIT...