【入門編】ON CONVERSIONによるデータ変換エラーの捕捉 – PL/Iの基本構文とデータ制御実践ガイド

PL/Iの「転ばぬ先の杖」:ON CONVERSIONでデータ変換エラーを華麗にいなす技術

こんにちは!メインフレームの世界へようこそ。
JavaやCOBOLの経験がある方にとって、PL/I(ピーエル・アイ)という言語は、まるで「自由すぎて逆に怖い」という独特のオーラを放っているかもしれません。

特にデータ変換。例えば「数字が入っているはずの文字列に、なぜかゴミデータ(スペースや記号)が混じっている」。COBOLなら `NUMERIC` チェックで事前に弾くのが鉄則ですが、PL/Iには、もっとスマートで、かつ少しだけ「魔法」じみたエラーハンドリングの仕組みがあります。

それが、今回解説する `ON CONVERSION` です。

1. なぜPL/Iは「データ変換」で止まるのか?

PL/Iのデータ宣言は、非常に柔軟です。しかし、その柔軟さゆえに、コンピュータは「あれ?これ数字として扱えって言われたけど、中身が『A』なんだけど!どうすればいいの?」とパニックを起こしてしまいます。

これをそのまま放置すると、プログラムは異常終了(ABEND)という名の「強制終了」をくらってしまいます。夜間バッチでこれが起きると、オペレーターさんから深夜の呼び出しコールがかかってくる……なんていうのは、メインフレーム現場の「あるある」ですよね。

そこで登場するのが、ONユニット(ON CONVERSION) です。これは、「もし変換に失敗したら、その時はこの処理を実行してね」と、あらかじめコンピュータに伝えておく「予約ルール」のようなものです。

2. 実践!ON CONVERSIONの実装例

まずは、実際のコードを見てみましょう。百聞は一見に如かず、です。

1
/ メインプログラムの始まり /
TEST_CONV: PROCEDURE OPTIONS(MAIN);

/ 文字列から数値へ変換する変数たち /
DCL INPUT_DATA CHAR(5) INIT(’12A45′); / わざと無効な文字を混入 /
DCL NUM_VAL FIXED DEC(5); / 数値を入れる変数 /

/ コンバージョンエラーが発生した時の「お守り」をセット /
ON CONVERSION BEGIN;
/ 変換に失敗した時の処理をここに書く /
PUT SKIP LIST(‘警告: データ変換失敗を検知。デフォルト値0で補完します。’);

/ エラー箇所を強制的に0に置き換えて処理を続行させる魔法 /
NUM_VAL = 0;

/ 処理を戻る(ここがポイント!) /
GO TO RECOVER;
END;

/ 変換を試みる /
NUM_VAL = INPUT_DATA;

RECOVER:
/ 結果の出力 /
PUT SKIP LIST(‘結果の値は: ‘ || NUM_VAL);

END TEST_CONV;

このコードのポイント

  • `ON CONVERSION BEGIN … END;`: これが「エラー監視のバリア」です。この記述がある間、プログラムは変換エラーに対して「パニック」ではなく「このブロックの実行」を選択するようになります。
  • `GO TO RECOVER`: これが少しレガシーな書き方ですが、エラー発生地点から「正気を取り戻した地点(ラベル)」へ強制的にジャンプさせる制御です。PL/Iらしい、非常に直接的な解決策ですね。

3. 初心者の方に知っておいてほしい「心構え」

PL/Iを扱う上で、皆さんに一つだけ覚えておいてほしいことがあります。それは、「ONユニットはプログラムのどこに書いてもいいが、スコープ(有効範囲)がある」ということです。

  • プログラム全体で有効にしたいなら: `MAIN` プロシージャの冒頭に書くのが定石です。
  • 特定の処理だけ監視したいなら: そのブロック内だけに書くことも可能です。

この「エラーを隠蔽する」というやり方は、乱用しすぎると「どのデータがどこで壊れていたのか」が見えなくなってしまうというリスクもあります。そのため、必ず `PUT SKIP LIST` などでログを出し、「何が起きたか」を証拠として残すことが、プロとしての現場の作法になります。

最後に:怖がらなくて大丈夫です!

「PL/Iは難しい」と言われがちですが、実はこのように「エラーが起きたらこうする」という道筋をプログラマが明示的に書ける、非常に親切な言語でもあります。

COBOLのようにガチガチにルールで縛るのではなく、PL/Iは「失敗した時のリカバリさえしっかり書けば、あとは任せるよ」と言ってくれる、懐の深い言語なんです。

もし皆さんの現場で、「この変換、たまにゴミデータが来て落ちるんだよね……」というプログラムを見かけたら、ぜひこの `ON CONVERSION` を思い出してみてください。きっと、皆さんのバッチ運用がぐっと楽になるはずです。

それでは、また次回のレガシー探訪でお会いしましょう!質問があれば、いつでもコメント欄に投げてくださいね。

タイトルとURLをコピーしました