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

突然の「CONVERSION」エラーに怯えない!PL/Iの“守護神”ONユニットを使いこなそう

こんにちは!長年メインフレームの深淵でPL/Iと格闘してきたアーキテクトです。

JavaやCOBOLからメインフレームの世界に飛び込んでくると、PL/Iの独特な文法に最初は戸惑うかもしれませんね。特に、計算機が「お前、数字の場所に文字を入れようとしてるだろ!」と怒り出し、プログラムが異常終了(ABEND)してしまう現象には、誰もが一度は冷や汗をかくものです。

今日は、そんなデータ変換エラー(CONVERSION条件)を、システムを止めることなくスマートに切り抜けるためのテクニックを伝授します。

そもそも、PL/Iの「CONVERSION」って何者?

COBOLなら`NUMERIC`句でチェックしたり、Javaなら`try-catch`で例外をキャッチしたりしますよね。PL/Iには、もっとエレガントで、かつ「メインフレームらしい」強力な仕組みがあります。

PL/Iは非常に厳格な言語です。例えば、数値として定義した変数に、うっかりスペースや英字が混じったデータが紛れ込むと、コンパイラは即座に「変換不可能!」と判断し、プログラムを打ち切ろうとします。

でも、現場のバッチ処理では「不正なデータが1件混ざっていただけで、数百万件の処理を全部止めるわけにはいかない」というシチュエーションが多々ありますよね。そんな時、ONユニットという「監視役」を配置しておくのが鉄則なんです。

救世主「ON CONVERSION」の実装例

まずは、実際のコードを見てみましょう。怖がらなくて大丈夫です。考え方は非常にシンプルですよ。

1
/ メインプログラムの構造 /
MY_BATCH_PROG: PROCEDURE OPTIONS(MAIN);

/ 1. エラーを監視するONユニットを定義 /
ON CONVERSION
BEGIN;
/ 不正なデータが見つかった時の処理 /
PUT SKIP LIST(‘警告:数値変換エラーを検知しました。値を0に置換して継続します。’);

/ 変換対象の値を強制的に0に書き換えてエラーを回避 /
DATAFIELD = ‘0’;
END;

/ 2. 数値として扱いたい変数 /
DCL WORK_AMOUNT FIXED DEC(9, 0);
DCL RAW_INPUT CHAR(9);

/ テスト用:わざと数字以外の文字を入れてみる /
RAW_INPUT = ‘1234A6789’;

/ ここで変換エラーが発生するはずだが、ONユニットが守ってくれる /
WORK_AMOUNT = RAW_INPUT;

PUT SKIP LIST(‘処理完了:値は ‘ || WORK_AMOUNT || ‘ です。’);

END MY_BATCH_PROG;

このコードの「ここがポイント」

1. ON CONVERSION の宣言: プログラムの冒頭で「変換エラーが起きたらこのブロックを実行せよ」と指示を出しています。これがプログラム全体の“守護神”になります。
2. DATAFIELD キーワード: PL/Iの組み込み関数のようなもので、エラーを引き起こした「問題児のデータ(この場合は’1234A6789’)」を直接参照・修正できます。
3. REVERT との使い分け: もし特定の箇所だけで監視したいなら、ブロックを限定することも可能です。でも、バッチの入り口で定義しておくのが、メインフレーム流の「安全設計」と言えます。

初学者が躓きやすい「データ宣言」の注意点

PL/Iのデータ型は、慣れると非常に柔軟で強力です。特に`FIXED DEC`(固定小数点)と`CHAR`(文字列)の変換は、現代の言語にはない独特の挙動をします。

  • `FIXED DEC(9, 0)`: これだけで「符号付きの9桁の数値」というストレージが確保されます。メモリレイアウトが非常に明快で、デバッグ時にも「どこに何が入っているか」が一目瞭然です。
  • 暗黙の型変換: PL/Iは、型が違っても「よしなに」変換しようと頑張ります。その「頑張りすぎ」がエラーを招くこともありますが、先ほどの`ON CONVERSION`さえあれば、その「頑張り」を人間が制御下に置くことができるのです。

最後に:メインフレームを恐れないで

PL/Iという言語は、一見すると古臭く、呪文のように見えるかもしれません。しかし、その中身は「いかにしてシステムを止めず、正確に計算し続けるか」という、半世紀以上の知恵が詰まった結晶です。

エラーが出たとき、それは「プログラムが失敗した」のではなく、「安全装置が正しく働いた」と考えてみてください。そう捉え方を変えるだけで、レガシーシステムのメンテナンスは、宝探しのような少しワクワクする作業に変わるはずです。

もし現場で「またCONVERSIONエラーが出た!」と焦っているメンバーがいたら、ぜひこのONユニットの技を教えてあげてくださいね。きっと「すごい!」と感謝されるはずです。

それでは、また次回の深掘りでお会いしましょう!

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