2017-07-17 15 views
1

DB2システム・テーブル - バッチ・ランタイム・ログはメインフレームにありますか? DB2 for iSeriesには、実行時にステータス(アクティブ/完了)、最も重要なことにV_SQL_STATEMENT_TEXT - 最後のSQL実行のステートメントを含むジョブ情報を返すテーブル関数QSYS2.GET_JOB_INFO()があります。最後に実行されたSQLステートメントを取得するDB2システム・ランタイム・テーブル

シナリオ: 実行時に最後に実行されたSQL文をCobol Batch Jobで取得したいとします。これの主目的は、ジョブの実行中にCOMMITまたはROLLBACKが発行されたかどうかを判別することです。その目的は、小さなプログラムを作成し、それを「コントローラ」と呼ぶこと、コミットまたはコミットの間隔が発行されたときにDB2を監視すること、またはロールバックすることです。より具体的には、この「コントローラ」はミニOSとして動作し、メインプログラムを起動する能力を有する。

たとえば、メインプログラムがROLLBACKを発行した場合、「コントローラプログラム」は特定のビジネスロジックを発行し、更新を制御できます。更新は、T1タイプとT2タイプの両方のDB2接続で実行できます。これにより、更新はバッチクライアント側またはEXCIで実行されているJava側で実行されます(EXCIはRRSリカバリを使用します)。

+0

....大丈夫、_why_これは欲しいですか?どのようなビジネス上の問題を解決しようとしていますか?あなたがしようとしている「監視と決定」は、厳しい競争条件の対象となることに注意してください。'ROLLBACK'または' COMMIT'のどちらかが発行された後に何か他のことをすると、意思決定を試みると大規模な頭痛を引き起こす可能性があります。これらの両方の文はほぼ常に即座に成功しますが、余分な行を追加するなどの作業を追加したい場合は、完全にウィンドウの外に出ます。特に、エラーのために自動呼び出しされる可能性がある 'ROLLBACK'の場合... –

+0

@ Clockwork-Muse私は全く同意するが、このアプローチは頭痛の原因となり易い。簡単にするために、メインプログラムがexec SQLコミットを発行した場合、コントローラープログラムもRRSコミット(SRRCMIT)を発行する必要があります。メインプログラムがSQLロールバックを発行した場合、コントローラーはRRSロールバックSRRBACK)。既存のメインプログラムを更新することはできないため、このアプローチを選択しました。免責事項:このアプローチはまだ設計中です。異なるアプローチをテストしており、後で最も効果的なアプローチを選択します。ありがとう! – Cee

+0

私はこの機能を一度も使ったことがないので(すべてに話すことはできません)、このアプローチが破滅していると感じています。あなたの "Main"プログラムが何らかの理由で停止している場合、あなたが望むように何もコミットされません。私が読んでいる小さなものから、あなたは 'COMMIT'か' SRRCMIT'のどちらかを呼びたいと思っているようですが、その両方を使うのではなく、コマンドを発行したときの効果がわかりません。いくつかの余分な処理 - しかしどこ?)。あなたが望むものは監視プログラムではなく、何らかの解釈/ラッパー・レイヤーだと思えますが、私はあなたがCOMMITを置き換えることができるかどうか疑問に思っています... –

答えて

0

IBM Knowledge Center for DB2のクイックルックは、「いいえ」を示すようです。

はしかし、あなたの状況について正確に一致しないが、ここで我々が行うために使用するものです...

テーブルを作成し、一意にあなたのプロセスの実行を識別するために列にAPP_RESTART_DATAそれを呼び出します。 PROC_NAMESTEP_NAMEをバッチジョブに限定して使用しました。 KEY列と、再起動時に役立つその他のメタデータもあります。実際のキー値の代わりにレコード番号を保存した人もいます。

コントローラプログラムでは、ユニークな識別子でSELECTを実行して、再起動モードになっているかどうかを判断します。 SQLCODEが0の場合、再起動モードになり、COMMITが正常に実行された最後のKEYが取得されます。このような状況では、入力データにそのキーを配置し、その後すぐに通常の処理を開始する必要があります。 SQLCODEが100の場合、再起動モードにはなりません。このような状況では、入力データの開始時に通常の処理を開始することができます。

入力データを処理してCOMMITポイントに達すると、UPDATEAPP_RESTART_DATAテーブルに新しいKEYが追加されます。その後、COMMIT。私たちのCOMMITポイントは、処理する論理作業単位の数がCOMMITsの間であることを示すパラメータによって決定されました。通常オフシフトで実行されたプライムシフト中にバッチプロセスを実行する必要が生じた場合、このパラメータを減らすことができます。

入力データの処理を完了すると、APP_RESTART_DATAテーブルのプロセスの行がDELETEになります。

キャッチROLLBACKが厄介な場合があります。あなたの行にAPP_RESTART_DATAのフラグをつけてコード内でROLLBACKを実行したとすることができますが、異常終了の状況で暗黙のうちに実行されると、言語環境CEEHDLR呼び出し可能なサービスを介して条件ハンドラを登録し、発生した。

+0

はい私はすでにDB2用のナレッジセンターを探しました。チェックポイントテーブルを既に持っているので、私はあなたのアイデアを探検するつもりです、それはメインプログラムに存在しています。私はテーブルのイメージの前後にキャプチャし、フィールド値の変更があるかどうかを判断できます。コミット間隔の変更があった場合、メインプログラムはコミットを発行しました。ロールバックの場合、初期レコードはロールバック識別子としてチェックポイントテーブルに挿入されます。レコードが見つからないと、メインプログラムは明示的なロールバックを発行しました。コールチェーンで予期しないエラーのためにLEハンドラを構築しました。 – Cee

関連する問題