1. 導入:なぜCONVERSION例外対策が重要なのか
メインフレームでのバッチ処理において、最も頭を悩ませるのが「数値項目への不正データ混入」です。外部インターフェースから受け取ったファイルに、数値項目であるはずの箇所に空白(X’40’)や英字が含まれていることは珍しくありません。これらを放置するとプログラムは異常終了(ABEND)し、夜間バッチの停止という重大な事態を招きます。本稿では、ON-Unitsを活用して、不正データ発生時にプログラムを落とさず、動的に修正して処理を継続させるための実践テクニックを解説します。
2. 基礎知識:CONVERSION例外とON-Units
CONVERSION例外は、PL/Iにおいて「非数値データ」を「数値型変数」に代入しようとした際に発生する割り込みです。通常、この例外が発生するとプログラムは即座に終了しますが、ON-Units(ON条件)を定義しておくことで、エラー発生時の振る舞いを独自に制御できます。特に `ONSOURCE()` という疑似変数を使うことで、エラーを引き起こした不正なデータをプログラム実行中にその場で書き換え、処理を再開(RESUME)させることが可能です。
3. 実装/解決策:不正データの動的修正
実装のポイントは、対象のブロック内で `ON CONVERSION` を定義し、`ONSOURCE()` に安全な値(例えば ‘0’)を代入することです。これにより、システムは「不正な値が正常な値に置き換わった」と判断し、処理を続行します。この手法は、入力データのクリーニング(サニタイズ)が完全ではないレガシーなデータ環境下において、非常に強力な防波堤となります。
4. サンプルプログラム
以下は、数値変換時に空白や不正文字が含まれていた場合に、自動的に「0」へ置換して処理を継続するコード例です。
/ サンプルコード:CONVERSION例外のハンドリング /
DCL WRK_NUM FIXED DEC(5,0);
DCL INPUT_DATA CHAR(5) INIT(‘ 123’); / 空白混じりの不正データ例 /
BEGIN;
/ CONVERSION発生時の例外処理を定義 /
ON CONVERSION BEGIN;
/ 不正箇所を’0’に書き換えて再試行する /
ONSOURCE() = ‘0’;
RESUME;
END;
/ 数値型への代入:ここでCONVERSIONが発生し、ON-Unitsが起動する /
WRK_NUM = INPUT_DATA;
PUT SKIP LIST(‘変換後の数値:’ || WRK_NUM);
END;
5. 応用・注意点:現場での運用上のアドバイス
この手法は強力ですが、「原因の隠蔽」にならないよう注意が必要です。本来であれば、入力データのレイアウト定義や、データ入力前のバリデーション層で不正データを除去するのが理想的です。
本番環境でこのコードを使用する場合、`ON-Units` 内で必ず「エラーログの出力」を行ってください。どのレコードで変換エラーが発生したのかを特定できるようにしておかないと、後のデータ不整合の原因調査が極めて困難になります。また、`RESUME` を使う際は、無限ループに陥らないよう、変換のロジックが確実に終了する設計であることを必ず確認してください。

コメント