PL/Iの世界へようこそ!「変換エラー」をスマートにさばく魔法の呪文
こんにちは。長年メインフレームの深淵を見つめ続けてきたシステムアーキテクトです。
JavaやCOBOLの経験がある皆さん、今日からPL/Iという、少しレトロで、でも非常に強力な「万能選手」の世界へ足を踏み入れてみましょう。
「PL/I?名前は聞いたことあるけど、古臭そう…」なんて思っていませんか?確かに歴史は長いですが、その設計思想は現代の高級言語に勝るとも劣らない柔軟性を持っています。今日は、皆さんがメインフレームのバッチ処理で最初にぶつかるであろう「壁」、データ変換エラーのハンドリングについて紐解いていきますね。
—
1. PL/Iプログラムの「お作法」:まずはここから
PL/Iのプログラム構造は、非常に規律正しいものです。家を建てる時に基礎が大切なように、まずはこの骨格を覚えてしまいましょう。
/i
/ プログラムの始まりを宣言 /
MY_PROGRAM: PACKAGE;
/ メイン処理の入り口。OPTIONS(MAIN)が「ここから動かせ」という合図です /
MAIN_PROC: PROCEDURE OPTIONS(MAIN);
/ ここにメインのロジックを書きます /
PUT SKIP LIST(‘こんにちは、PL/Iの世界へ!’);
END MAIN_PROC;
END MY_PROGRAM;
Javaの`public static void main`にあたるのが、`PROCEDURE OPTIONS(MAIN)`です。`PACKAGE`で全体を囲うのは、大規模システムで名前の衝突を防ぐための「防波堤」のようなものですね。
—
2. 「なぜ落ちる?」数値変換の恐怖
PL/IがCOBOLと大きく違うのは、数値型と文字型の間の「暗黙的な変換」が非常に強力である点です。
たとえば、数字が入っているはずの文字変数(`CHAR`)を、計算用の数値変数(`FIXED DECIMAL`)に代入したとき。もしそこに「スペース」や「ゴミデータ」が混ざっていたら、プログラムは即座に停止(ABEND)しようとします。
「予期せぬ入力一つでシステムを止めない」
これが、実務におけるPL/Iプログラマの腕の見せ所です。そこで登場するのが、`ON CONVERSION`という強力な武器です。
—
3. ON CONVERSION:エラーを未然に防ぐ「防衛ライン」
`ON CONVERSION`は、いわば「変換に失敗した時の駆け込み寺」です。これを使って、エラーが起きてもプログラムを止めず、安全に切り抜けるコードを見てみましょう。
/i
MAIN_PROC: PROCEDURE OPTIONS(MAIN);
DCL INPUT_STR CHAR(5) INIT(’12A45′); / ここに数字じゃないデータが混入! /
DCL NUM_VAL FIXED DEC(5);
/ 変換エラーが発生した時の「逃げ道」を定義 /
ON CONVERSION BEGIN;
PUT SKIP LIST(‘エラー検知:数値以外のデータが混ざっています!’);
/ ここでフラグを立てたり、ログを出して処理を継続させる /
GO TO SKIP_CALC;
END;
/ 文字列を数値に代入(ここで変換エラーが発生!) /
NUM_VAL = INPUT_STR;
PUT SKIP LIST(‘計算結果は:’, NUM_VAL);
SKIP_CALC:
PUT SKIP LIST(‘処理を続行します。’);
END MAIN_PROC;
ここがポイント!
- ON CONVERSION: この記述があるだけで、変換エラーが発生した瞬間に制御がこのブロックへ飛びます。「プログラムを異常終了させない」という点で、Javaでいう`try-catch`に近い感覚ですが、PL/Iの方がずっと「泥臭く」て、メインフレームらしい制御が可能です。
- GO TOの活用: レガシー言語では`GO TO`は悪者扱いされがちですが、PL/Iのようなイベント駆動のハンドリングでは、エラー発生時の離脱フローとして非常に理にかなった動きをします。
—
4. 初学者の皆さんへ:怖がる必要はありません
PL/Iのデータ宣言(`DCL`)は、最初こそ独特の記法に見えるかもしれません。`FIXED DECIMAL`はCOBOLの`PIC 9(5)`に近いものだと考えてください。
初めてのシステム改修で、もし「データ変換エラー」に出くわしても、どうか焦らないでくださいね。
1. どこで変換しているかを探す(代入文の右辺と左辺の型を確認!)
2. `ON CONVERSION`で処理を包む(まずは安全地帯を作る)
3. エラーの原因データを特定する(ログに出して突き止める)
この手順さえ踏めば、メインフレームのどんな巨大なバッチ処理も、必ず御することができます。
PL/Iは、厳格なようでいて、実はプログラマが「こう動いてほしい」と願うことを一番に考えてくれる、非常に人間味のある言語です。一つずつ紐解けば、きっとその奥深さに魅了されるはずですよ。
それでは、次回のメインフレーム・アドベンチャーでお会いしましょう!何か詰まったら、いつでも聞きに来てくださいね。
