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

【現場の鉄則】PL/Iの「予約語なき世界」とON CONVERSIONが救うバッチの命

メインフレームの世界に足を踏み入れて日が浅いエンジニア諸君、ようこそ。PL/Iという言語は、一見すると「何でもあり」の自由奔放な言語に見えるだろう。実際、PL/IにはCやJavaのような厳格な「予約語(Reserved Words)」が存在しない。

君たちが書いているその変数名が、実はコンパイラにとってはキーワードの一部として解釈される可能性すらある。この「自由度」こそが、長年メインフレームを支えてきたPL/Iの最大の強みであり、同時に未熟な実装者を泥沼に引きずり込む罠でもあるんだ。

今日は、そんなPL/Iの特性を踏まえた上で、実務で遭遇すると絶望的な気分になる「数値変換エラー」をスマートに制御する手法を伝授する。

1. 予約語なきPL/Iと識別子の「危うい」正体

PL/Iには予約語がない。これは、`IF`や`THEN`といった命令語を、そのまま変数名として使えてしまうことを意味する。

/1
/ こんな記述はコンパイルは通るが、コードレビューで確実に怒られる /
DCL IF FIXED DEC(5);
IF = 10;

なぜこれが許されるのか。それはコンパイラが「文脈(Context)」で判断しているからだ。しかし、この設計は大規模改修時、特にレガシーなソースコードをいじるときに牙を剥く。既存のライブラリやIncludeメンバーと名前が衝突した際、エラーにならずに「意図しない挙動」を引き起こすことがある。

現場の知恵: 変数名の頭には必ずプレフィックス(例:`WK_`, `TBL_`など)を付与し、言語仕様と衝突するリスクを物理的に排除する。これが、保守性の高いコードを書くための最初の関門だ。

2. ON CONVERSION:数値変換エラーを「握りつぶす」な

バッチ処理で最も頭を抱えるのが、VSAMのファイル読込や外部入力データに紛れ込んだ「空白」や「ゴミ文字」による異常終了(ABEND S0C7など)だ。特に、`PIC ‘999’`で定義した変数に、誤って英字データが混入すると即座に変換エラーが発生する。

ここで活躍するのが `ON CONVERSION` ユニットだ。これを使えば、システムを落とさずにエラーを検出し、代替値をセットして処理を続行できる。

実践的なコーディング例

/1
/ ON CONVERSIONによるエラー捕捉のサンプル /
CONV_BLOCK: PROC OPTIONS(MAIN);

DCL WK_INPUT_VAL PIC ‘999’;
DCL WK_CONV_ERR BIT(1) INIT(‘0’B);

/ 変換エラーが発生した時の割り込み処理を定義 /
ON CONVERSION BEGIN;
WK_CONV_ERR = ‘1’B; / エラーフラグを立てる /
WK_INPUT_VAL = 0; / 安全な代替値をセット /
REVERT CONVERSION; / 割り込みを解除して通常処理へ戻す /
END;

/ ダミーデータ(本来はファイル読込や外部I/Fから渡る) /
WK_INPUT_VAL = ’12A’; / ここで変換エラーが発火する /

IF WK_CONV_ERR THEN DO;
PUT SKIP LIST(‘警告:数値変換エラーが発生しました。不正値が混入しています。’);
END;

END CONV_BLOCK;

3. ダンプ解析の現場スキル:なぜその値になったのか?

`ON CONVERSION`で防げないような深刻な問題が起きたとき、我々は「ダンプ」と向き合うことになる。特にPL/Iの場合、ダンプを見る際に以下のポイントを必ず確認してほしい。

1. ONCODEの確認:
`ONCODE`組み込み関数を使うと、エラーの具体的な原因コードが取得できる。例えば変換エラーなら`303`などが返る。これが分かれば、IBMの『PL/I メッセージ・コード』マニュアルを引く指先も迷わないはずだ。
2. ストレージのダンプ解析:
数値変換失敗時、対象領域が `X’404040’`(空白)なのか、それとも `X’00’` なのか。あるいはメインフレーム特有のゾーン10進数(ZONED DECIMAL)の符号部分(FやC)が壊れているのか。

  • コツ: 16進数ダンプを読むときは、必ずその変数の「属性(固定長か可変長か、PackedかZonedか)」と、コンパイルリストの「オフセット」を照らし合わせること。

最後に:プロの矜持

「動けばいい」というコードは、数年後に必ず誰かを苦しめる。PL/Iは歴史が長く、仕様も広大だ。しかし、`ON`ユニットのような強力な例外処理を正しく使いこなし、予約語の罠を理解して命名ルールを徹底するだけで、君の書くコードの「信頼性」は飛躍的に向上する。

大規模なマイグレーション現場でも、こうした一つひとつの積み重ねが、プロジェクト全体の安定稼働を左右するんだ。何かわからないことがあれば、またいつでも聞きに来なさい。現場の最前線で戦う君たちを、私はいつでも応援しているよ。

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