メインフレームの世界へようこそ。JavaやCOBOLというモダンな荒波を乗り越えてきた皆さんにとって、PL/I(ピーエル・アイ)という言語は、まるで古びた書庫の奥深くに眠る「万能魔術書」のように見えるかもしれません。
今日は、その中でも「なぜか数値項目に半角スペースが入っている!」といった、レガシーシステムの現場で必ずと言っていいほど遭遇する「データ変換エラー」を、いかに優雅に、そして安全にいなすかというお話をしましょう。
—
1. PL/Iの「おおらかな性格」と「CONVERSION条件」
PL/Iという言語は、非常に賢いのですが、同時に「言われれば何でもやってのける」という、お人好しな一面があります。例えば、文字列 `’ 123 ‘` を数値型に代入しようとしたとき、COBOLならエラーで止まるかもしれませんが、PL/Iは「あ、これ数字にしたいのね? じゃあ、いい感じに変換しておくよ!」と頑張って変換を試みます。
しかし、もしその文字列が `’12A3’` だったらどうでしょう? コンパイラは「……いや、これは無理だ」と判断し、CONVERSION条件というエラー信号を投げつけます。これを放置すると、プログラムは即座に異常終了(ABEND)し、夜中のバッチ実行を止めてしまう……なんていうのは、私たちアーキテクトからすれば一番避けたい悲劇です。
2. 魔法の盾「ONユニット」を張る
PL/Iには、このエラーを「なかったこと」にする、あるいは「適切に処理する」ための強力な魔法、ONユニットがあります。
具体的には `ON CONVERSION` というキーワードを使います。これは、「もしデータ変換で躓いたら、この処理を代わりにやってね」という予約注文のようなものです。
実践:変換エラーをキャッチして「0」に置き換える
まずは、基本的なプログラム構造を見てみましょう。
/i
TEST_PGM: PROCEDURE OPTIONS(MAIN);
/ データ宣言:少し奇妙に見えるかもしれませんが、これがPL/I流です /
DCL INPUT_VAL CHAR(5) INIT(’12A3′); / 不正な文字を含む文字列 /
DCL NUM_VAL FIXED BIN(15); / 2バイトの整数型 /
/ 【ここが重要!】CONVERSION発生時のリカバリ処理を定義 /
ON CONVERSION
BEGIN;
/ 不正なデータが来たときは、とりあえず0を代入して続行 /
PUT SKIP LIST(‘警告:数値変換エラーが発生しました。0で補完します。’);
NUM_VAL = 0;
/ 処理を戻る(これが無いと無限ループや異常終了の恐れがあるので注意!) /
GOTO CONTINUE_LABEL;
END;
/ 変換の実行 /
NUM_VAL = INPUT_VAL;
CONTINUE_LABEL:
PUT SKIP LIST(‘結果の値は:’, NUM_VAL);
END TEST_PGM;
コードのポイント解説
- `ON CONVERSION`: これを宣言するだけで、変換エラーが起きた瞬間にプログラムの制御がこのブロックの中に飛び込みます。
- `GOTO`の利用: ONユニット内では、エラーが発生した地点からどこへ戻るかを明示的に指示する必要があります。これがPL/Iらしい「制御の細かさ」です。
- `DCL`(宣言): `FIXED BIN(15)` など、馴染みのない型があるかもしれません。これは「2バイト(16ビット)の整数」と覚えておけばOKです。メインフレームでは、このメモリの効率的な使い方が、何十年もシステムを支えてきた秘訣なんです。
3. なぜ「怖がらなくて大丈夫」なのか
皆さんがこれまで触れてきたJavaの `try-catch` ブロックと少し似ていると思いませんか?
PL/IのONユニットは、プログラムのメインフローから「エラー処理」を切り離して記述できるため、ロジックが非常にスッキリします。古い言語だからと敬遠されがちですが、実は「エラーが発生したときにどう振る舞うか」というポリシーをコードの冒頭で宣言できる、非常に設計思想がしっかりした言語なのです。
4. アーキテクトからのアドバイス
実務の現場では、単に「0で置き換える」だけではなく、エラーが起きたレコードのキー情報をログに書き出すといった処理が求められます。
/i
ON CONVERSION
BEGIN;
/ どのデータが原因か特定するために、ログを吐き出す /
PUT SKIP LIST(‘エラー発生!不正な値: ‘ || INPUT_VAL);
NUM_VAL = 0;
GOTO CONTINUE_LABEL;
END;
このように、`||`(連結演算子)を使ってエラー内容を詳細に記録しておけば、翌朝の保守担当者から感謝されること間違いなしです。
—
まとめ:PL/Iは対話型の言語
PL/Iを扱う際は、「プログラムが今、どんな状態にあるか」を常に意識してみてください。データ変換エラーは、システムが「これ、どう扱えばいいの?」と皆さんに助けを求めているサインです。
怖がらずに `ON CONVERSION` で優しく受け止めてあげれば、どんなに汚れたデータであっても、システムは止まることなく走り続けてくれます。さあ、次はどんなエラーを料理してやりましょうか? 何か困ったことがあれば、いつでもまた聞きに来てくださいね。
