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

PL/Iの深淵へようこそ:ON CONVERSIONで「予期せぬデータ」を優雅に捌く

こんにちは。IBMメインフレームの世界へようこそ。
普段JavaやCOBOLに親しんでいる方にとって、PL/Iは少し「自由すぎて怖い」言語に見えるかもしれません。特に「予約語がない」という仕様は、初めて聞くと「じゃあ、変数の名前に `IF` とか `THEN` を使ったらどうなるの?」と不安になりますよね。

結論から言うと、PL/Iのコンパイラは文脈から「これはキーワードなのか、変数名なのか」を驚くほど賢く判断します。今日は、そんな懐の深いPL/Iで、最も頭を悩ませる「データ変換エラー」を、`ON CONVERSION`という魔法を使ってエレガントに解決する方法を解説します。

そもそも「型変換」でなぜ死ぬのか?

メインフレームの基幹システムでは、外部から送られてきたデータ(ファイルや画面入力)を処理する際、文字型(CHARACTER)として受け取り、計算のために数値型(FIXED DECIMAL等)へ詰め直すことが日常茶飯事です。

もし、その文字の中に「数字ではないゴミ」が混ざっていたらどうなるでしょう?
COBOLなら `INVALID KEY` や `ON SIZE ERROR` を気にしますが、PL/Iでは容赦なく「変換エラー」が発生し、バッチジョブが異常終了(ABEND)してしまいます。これを防ぐのが `ON CONVERSION` です。

`ON CONVERSION`:エラーの「事後処理」を任せる

`ON` ユニットは、いわば「例外が発生した瞬間に発動する緊急避難プロトコル」です。変換に失敗した瞬間、プログラムは止まらずにこのユニットへ飛んできます。

ここで活躍するのが、IBMのメインフレームが教えてくれる二つの宝物です。

  • ONSOURCE: 変換しようとして失敗した「問題の文字列」そのもの。
  • ONCHAR: 文字列の中で、具体的にどの文字が「お前、数字じゃないぞ!」と怒られた原因なのか。

実践的なハンドリング例

以下のコードを見てください。現場でよくある「文字から数値への変換ミス」を捕捉する典型的なパターンです。

/i
/ 文字列から数値への変換テスト /
TEST_PROC: PROCEDURE OPTIONS(MAIN);

DCL MY_NUM FIXED DEC(5,0);
DCL RAW_DATA CHAR(5) INIT(’12A45′); / ‘A’が含まれていて変換できない! /

/ 変換エラーが発生した時の「後始末」を定義 /
ON CONVERSION BEGIN;
PUT SKIP LIST(‘警告: 数値変換エラーを検知しました’);
PUT SKIP LIST(‘問題の文字列(ONSOURCE): ‘ || ONSOURCE);
PUT SKIP LIST(‘原因となった文字(ONCHAR): ‘ || ONCHAR);

/ ここでデフォルト値を設定したり、ログを吐いて処理を続行させる /
MY_NUM = 0;
GOTO END_OF_CONVERSION; / 正常な処理フローへ戻すための回避策 /
END;

/ 変換処理を実行 /
MY_NUM = RAW_DATA;
PUT SKIP LIST(‘変換後の値: ‘ || MY_NUM);

END_OF_CONVERSION:
PUT SKIP LIST(‘処理を正常に終了します’);

END TEST_PROC;

なぜこの仕組みが「現場」で愛されるのか

このコードのポイントは、「プログラムを落とさずに、悪いデータを特定して記録できる」という点です。

1. ONSOURCEで全容把握: どの項目でコケたのかがすぐわかります。
2. ONCHARでピンポイント特定: 「12A45」のどこが悪いか(この場合 ‘A’)を瞬時に特定できるため、調査の工数が劇的に減ります。
3. レガシーの知恵: 昔のシステムはデータが汚れていることが多々あります。`ON CONVERSION` を使えば、汚れたデータに遭遇しても「おっと、君は数字じゃないね。じゃあ今回は0として扱うよ」というような、人間味のある(あるいはシステムとして堅牢な)対応が可能になるのです。

最後に:PL/Iを恐れないで

「予約語がない」というPL/Iの自由さは、最初は戸惑うかもしれません。しかし、それは「あなたの記述意図を最大限に尊重する」という言語設計者のメッセージでもあります。

`ON CONVERSION` は、まさにその「現場での予期せぬトラブル」に対し、開発者がどのように振る舞うべきかを定義する、非常に強力なツールです。メインフレームという巨大なシステムの中で、自分の書いたコードが予期せぬデータに対して「優しく対応」している姿を想像してみてください。

この記事が、あなたのPL/Iライフの第一歩になれば幸いです。もし行き詰まったら、またいつでもここへ戻ってきてくださいね。一緒に紐解いていきましょう。

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