【问题标题】:DB2 System Runtime Table to retrieve last executed SQL StatementDB2 System Runtime Table 检索最后执行的 SQL 语句
【发布时间】: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 恢复)。

【问题讨论】:

  • ....好吧,为什么你想要这个?您要解决什么业务问题?请注意,您尝试做出的任何“监控和决定”都将受到严重的竞争条件的影响。还要注意,在发出ROLLBACKCOMMIT 之后尝试做出决定并做其他事情可能会引起巨大的麻烦。这两个语句几乎总是立即成功,但如果你想做一些额外的工作(比如在某处添加额外的行),那完全是不可能的。尤其是在ROLLBACK 的情况下,可能会自动调用错误...
  • @Clockwork-Muse 我完全同意,这种方法容易引起头痛。为了简单起见,如果主程序发出 exec SQL 提交,控制器程序也必须发出 RRS Commit(SRRCMIT),反之,如果主程序发出 SQL 回滚,控制器也必须发出 RRS 回滚( SRRBACK)。我们选择了这种方法,因为我们无法更新现有的主程序。免责声明:此方法仍在设计中,因为我们正在测试不同的方法,稍后将选择最有效的方法。谢谢!
  • 我从来没有使用过这个功能(所以不能说所有的东西),但我觉得这种方法是注定的。如果您的“主要”程序因任何原因而关闭,事情就不会按照您的意愿进行。从我读到的一点点来看,您似乎想调用COMMITSRRCMIT,但不能同时调用两者,而且我不确定发出该命令会产生什么影响(使用该命令意味着您正在做一些额外的处理 - 但在哪里?)。听起来你想要的不是监控程序,而是某种解释/包装层,但我怀疑你可以替换 COMMIT...

标签: java db2 cobol db2-zos


【解决方案1】:

快速查看IBM Documentation for DB2 似乎表明“否”。

但是,虽然与您的情况不完全匹配,但我们过去常常这样做...

创建一个表,将其命名为APP_RESTART_DATA,并使用列来唯一标识您的流程的执行。我们使用了PROC_NAMESTEP_NAME,因为我们仅限于批处理作业。还有一个KEY 列和任何其他您可能会发现在重新启动情况下有用的元数据。有些人存储的是记录号而不是实际的键值。

在您的控制器程序中,首先使用您的唯一标识符执行SELECT,以确定您是否处于重新启动模式。如果你得到一个为 0 的 SQLCODE,那么你就处于重新启动模式,并且将检索到最后一个成功执行 COMMIT 的 KEY。在这些情况下,您必须在输入数据中找到该键,然后立即开始对数据进行正常处理。如果您的SQLCODE 为 100,则说明您未处于重新启动模式;在这些情况下,您可以在输入数据的开头开始正常处理。

当您处理输入数据并到达COMMIT 点时,UPDATE 您的APP_RESTART_DATA 表也带有新的KEY。然后COMMIT。我们的COMMIT 点也由一个参数决定,该参数指示在COMMITs 之间要处理多少逻辑工作单元。如果有必要在主要班次期间运行通常在班外运行的批处理过程,我们可以减小此参数。

当您完成输入数据的处理后,DELETEAPP_RESTART_DATA 表中您的进程所在的行。

捕捉ROLLBACK 可能很棘手。您可以在APP_RESTART_DATA 中将您的行标记为在代码中完成时执行了ROLLBACK,但如果在异常结束情况下隐式完成,您可能会发现自己通过语言环境CEEHDLR 可调用服务注册了条件处理程序,因此您得到控件并且可以指示发生了ROLLBACK

【讨论】:

  • 是的,我已经浏览了 IBM Knowledge Center for DB2。我计划探索您的想法,因为我们已经有检查点表并且它存在于主要程序中。我可以捕获表格的前后图像并确定是否存在字段值更改。话虽如此,如果提交间隔发生变化,则主程序发出提交。对于回滚,初始记录将作为回滚标识符插入检查点表。一旦找不到记录,主程序就会发出显式回滚,我们为调用链中的意外错误构建了 LE 处理程序。
猜你喜欢
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 2017-08-28
  • 2020-04-11
相关资源
最近更新 更多