はじめに
夜間バッチのデータ更新等では、入力テーブルが0件などのデータの状態によってSQLを継続実行せず、エラー終了したいケースがあります。
出力テーブルが0件で作成されると、後続の参照処理大きな障害を引き起こしかねないケースで、中断することで前日状態を維持したい場合です。
例えば、全件洗いがえのマスター系データが障害により0件で連携されたなど、夜間バッチの障害では時々出会う事象です。
前提
SQLの実行エラーは呼び出し元で検出し、エラー通知と必要な後処理(リトライ、中断、無視して継続)が組み込まれている必要があります。
バッチ処理はシンプルに複数SQLの連続実行で成り立たせて、1文ずつの実行結果判定は行わず、一気に一群のSQLを実行するバッチ形式が対象です。
1文ずつ呼び出し元で結果判定する仕組みの場合は呼び出し元で判定できるので、このお話はお役に立ちません。
どうしたいのか
本当はベタの複数SQL文の途中に「この状態ならエラー終了」が書きたいのです。
そして、プロシージャは(色々条件があるので)使いたくないのです。
どうすれば好きなとことでエラーにできるでしょう
条件を指定してSQL文の実行エラーを発生させます。
SQL実行エラーは0割り算を使うと簡単に発生させることが出来ます。
あとは、特定条件で0の値になる式を書くだけです。
select 1 / case when 条件 then 0 else 1 end
簡単ですね。
条件に入力テーブルの件数を入れても良いし、データの中身で許容できないものを式にするなど、結構好きな条件でSQLエラーを発生させることが出来ます。
終わりに
今回は特定条件でエラーを発生させて処理を中断するお話でしたが、場合によっては条件により処理内容を変えたいケースがあります。
条件が真の場合はAのテーブルからデータを取得、偽の場合はBのテーブルからデータを取得などは時々やりたくなります。
次はこのあたりの実装方法について書きたいと思います。
Comments