メインフレームの守護神PL/I:CONVERSION条件で「データ型の迷子」を救い出そう!
こんにちは。IBMメインフレームの世界へようこそ。
普段JavaやCOBOLに親しんでいる皆さんからすると、PL/I(ピーエル・ワン)は少し「古風で威厳のある言語」に見えるかもしれませんね。でも安心してください。PL/Iは非常に懐が深く、現代の言語にはないような「おせっかいな機能」で、私たちのプログラムを崖っぷちから救ってくれる頼もしい相棒なんです。
今回は、基幹システムの現場で誰もが一度は冷や汗をかく「データ変換エラー」を、PL/Iの強力な武器である`ON CONVERSION`で華麗にさばく方法を解説します。
—
1. PL/Iの基本構造:まずは玄関を開けよう
PL/Iのプログラムは、いわば「壮大な物語」です。COBOLのDIVISIONのような厳格な区切りではなく、もっと自由な構成をしています。
1
/ プログラムの始まりはPACKAGEまたはPROCEDUREから /
MY_PROGRAM: PROCEDURE OPTIONS(MAIN);
/ ここに処理を書きます /
PUT SKIP LIST(‘こんにちは、PL/Iの世界へ!’);
END MY_PROGRAM;
`OPTIONS(MAIN)`は、「ここがプログラムの入り口ですよ」という重要な合図。Javaの`public static void main`のようなものだと思ってください。
—
2. なぜ「CONVERSION条件」が重要なのか?
メインフレームの世界では、外部から読み込むデータに「ゴミ」が混ざることは日常茶飯事です。例えば、数値が入るべき場所に空白(スペース)や、全角文字のような不正な値が紛れ込んでいた場合、多くの言語ではプログラムが突然死(異常終了)してしまいます。
ここで登場するのが`ON CONVERSION`です。
これは、「もし数値変換に失敗したら、止まる前に私(エラー処理ルーチン)を呼んでくれ!」という、いわばプログラムの「転ばぬ先の杖」です。
—
3. 実践:不正データを捕まえるコード例
実際に、文字データを数値に変換しようとして失敗した際、プログラムを落とさずにエラー箇所を特定するコードを見てみましょう。
1
/ エラーハンドリングの定義 /
ON CONVERSION
BEGIN;
/ 変換に失敗した場所や内容をログに出力 /
PUT SKIP LIST(‘【警告】不正なデータを見つけました!’);
PUT SKIP LIST(‘エラー発生箇所はここです:’, ONCHAR);
/ ここでログを吐いて、必要なら修正値をセットして続行も可能 /
GO TO RECOVERY_POINT;
END;
TEST_PROC: PROCEDURE OPTIONS(MAIN);
DCL STR_DATA CHAR(5) INIT(’12A45′); / 数字の中にAが混じっている! /
DCL NUM_VAL FIXED DEC(5);
/ 変換処理の開始 /
NUM_VAL = STR_DATA;
PUT SKIP LIST(‘変換成功!値は:’, NUM_VAL);
RECOVERY_POINT:
PUT SKIP LIST(‘処理を続行します。’);
END TEST_PROC;
このコードのポイント
- `ON CONVERSION`: 変換エラーが起きた瞬間、このブロックが自動的に発動します。
- `ONCHAR`: 組み込み関数です。どの文字が変換を邪魔したのか、その犯人を特定してくれます。
- `GO TO`: 普段はあまり使わない制御構文ですが、エラーからの復旧(リカバリー)には非常に有効です。
—
4. 現場でのデバッグ手法:ここを押さえれば怖くない
もし皆さんが保守担当として「なぜかこのバッチ、たまに異常終了するんだよな…」という現場に立ち会ったなら、以下の手順で調査してみてください。
1. まずは`ON CONVERSION`を仕込む: 該当する`PROCEDURE`内にこの定義を追加し、エラー時に`DISPLAY`文で変数の内容を吐き出すようにします。
2. `ONSOURCE`をチェックする: 先ほどの`ONCHAR`と同じく、エラーの原因となった文字列全体を取得できる関数です。「ああ、やっぱりスペースが紛れ込んでいたのか!」と一目で分かります。
3. データストレージ属性を疑う: PL/Iは`FIXED DECIMAL`(計算向き)と`FIXED BINARY`(高速処理向き)で扱いが異なります。定義ミスが変換エラーを誘発していないか、`DCL`(宣言)文を再確認しましょう。
—
最後に:PL/Iは皆さんの味方です
PL/Iが「怖い」と感じるのは、その自由度の高さゆえです。でも、今回紹介した`ON`条件のように、プログラム自身に「異常が起きたらこう対処してね」と教え込んでおけば、メインフレームは非常に安定したシステムになります。
「変換エラー?ああ、またか。`ON CONVERSION`で捕まえておこう」――そんな余裕が持てるようになれば、あなたも立派なメインフレーム・アーキテクトです。
次回は、PL/Iのメモリ管理の深淵、「ポインタ」と「基底付き変数(Based Variable)」について紐解いていきましょう。またお会いしましょう!
