1. 導入:なぜONSOURCEが重要なのか
メインフレーム開発において、データ変換エラー(CONVERSION条件)は避けて通れない問題です。特にファイルからの読み込みやバッチ処理で、期待した形式ではないデータが混入した際、プログラムが異常終了してしまい、夜間バッチの停止を招くことがあります。今回紹介する「ONSOURCE」は、エラーとなった不正データをその場で修正し、プログラムをクラッシュさせずに処理を続行させるための極めて強力な技術です。
2. 基礎知識:ONSOURCEと例外処理(ON-Units)
PL/I等のメインフレーム言語には「ON-Units」という例外処理機構があります。これは、ある特定の条件(エラー)が発生した際に、あらかじめ定義しておいたコードブロック(ハンドラ)を呼び出す仕組みです。
「ONSOURCE」は、この例外処理中に使用できる「疑似変数」です。変換エラーが発生した際、システムは「どの値が変換に失敗したのか」をこのONSOURCE変数に保持します。開発者はこの値を読み取るだけでなく、別の値で上書きすることで、エラーの原因となったデータを「治療」することができるのです。
3. 実装/解決策:不正データを0に置き換えて続行する
実装手順はシンプルです。
1. ON CONVERSION文でエラー発生時の動作を定義する。
2. そのブロック内でONSOURCE疑似変数に正しい値(例:’0’)を代入する。
3. RESUME文を使用して、エラーが発生した箇所から処理を再開させる。
これにより、不正な文字列が含まれていても、プログラムはそれを「0」と認識して処理を正常に終えることができます。
4. サンプルプログラム
以下は、数値変換エラーを回避するための実用的な実装例です。
/ 数値変換エラーが発生した時の処理を定義 /
ON CONVERSION BEGIN;
/ 不正なデータが入った箇所を’0’に書き換えて修復する /
ONSOURCE() = ‘0’;
/ 修正した値を使って処理を続行させる /
RESUME;
END;
/ 変換対象の変数 /
DCL WRK_NUM FIXED DEC(5);
DCL INPUT_STR CHAR(5) INIT(’12A45′); / ‘A’が含まれており変換エラーを引き起こす /
/ 数値変換処理 /
WRK_NUM = INPUT_STR;
PUT SKIP LIST(‘変換後の値は: ‘ || WRK_NUM); / 正常に実行され、0として処理される /
5. 応用・注意点:現場での活用と移行時の留意事項
この手法は非常に強力ですが、乱用には注意が必要です。
注意点1:ログ出力の徹底
自動的に’0’に置き換える処理は便利ですが、原因となった不正データが消えてしまうため、必ずエラーハンドラ内で「どの項目が変換失敗したか」をログに出力するようにしてください。さもないと、データソース側の不備が放置されるリスクがあります。
注意点2:現代言語への移行
最近のJavaやC#などの言語では、変数の値は不変であることが多く、このような「値のすり替え」は再現できません。メインフレームからオープン系へのマイグレーションを行う際は、このONSOURCE処理を、読み込み直後の「バリデーションチェック・サニタイズ処理」として独立したロジックに書き換える設計が必要です。
この「ONSOURCE」という技術は、まさに当時の限られたリソースでいかに止まらないシステムを作るかという、メインフレーム技術者の知恵の結晶です。現場のコードを解析する際、この疑似変数を見つけたら、それは「このデータは汚れやすい」というシステムからのサインだと捉えてください。

コメント