メインフレームの流儀:PL/IにおけるPARM引数受け取りの「正攻法」をマスターする
若手のエンジニアから、「JCLのPARMで渡したパラメータがうまく拾えない」「文字化けする」といった相談をよく受ける。メインフレームの世界でPL/Iを扱う以上、OSとのインターフェースである`OPTIONS(MAIN)`の作法は、避けて通れない「玄関口」だ。
今日は、JCLの`EXEC PGM=… PARM=’…’`で渡される文字列を、PL/Iで安全かつ確実に受け取るための標準的な設計について語ろう。
1. PARM受け取りの基本:CHARACTER VARYINGの罠
多くの初心者は、何も考えずに`CHARACTER(100)`のような固定長で引数を受け取ろうとする。しかし、これではJCL側の長さと合致しない場合に予期せぬパディングや切り捨てが発生する。
PL/Iにおいて、JCLから渡されるPARMをスマートに受け取るには、`CHARACTER VARYING`を使うのが鉄則だ。
実践的なコード例
まずは、標準的なプログラム構造を見てほしい。
/i
/——————————————————————-/
/ プログラム名: PARMTEST /
/ 概要: JCLからのPARMを受け取り、処理を行う標準的なMAINプロシージャ /
/——————————————————————-/
PARMTEST: PROCEDURE(PARM_IN) OPTIONS(MAIN);
/ JCLのPARMは、ハーフワード長の長さ情報+文字列で渡される /
/ VARYINGを指定することで、PL/Iが自動的に長さを管理してくれる /
DCL PARM_IN CHARACTER(100) VARYING;
/ 処理用変数 /
DCL W_MSG CHARACTER(80) VARYING;
/ パラメータの長さチェック /
IF LENGTH(PARM_IN) = 0 THEN DO;
PUT SKIP LIST(‘警告: PARMが指定されていません。処理を中断します。’);
SIGNAL ERROR; / ON ERRORユニットへ制御を飛ばす /
END;
W_MSG = ‘受け取ったパラメータ: ‘ || PARM_IN;
PUT SKIP LIST(W_MSG);
/ 正常終了 /
RETURN;
/ エラー発生時の後始末 /
ON ERROR BEGIN;
PUT SKIP LIST(‘致命的なエラーが発生しました。ログを確認してください。’);
END;
END PARMTEST;
2. なぜ `VARYING` なのか?
JCLの`PARM`フィールドは、内部的には「2バイトの長さフィールド(ハーフワード)」+「実際の文字列」という形式でOSから渡される。
これを固定長の`CHARACTER(N)`で受けると、宣言した長さより短い場合に、残りの領域にゴミデータ(あるいは空白)が残ったまま処理が進んでしまうことがある。`VARYING`を使うと、PL/Iのコンパイラが裏側でこの「長さ」を正確に解釈し、プログラム内では「有効な文字列」として扱えるようにしてくれるのだ。これが、レガシー移行や保守において、不可解なバグを防ぐ最も確実な防衛策になる。
3. 実務で遭遇するトラブルと対策
現場では、単に受け取るだけでは済まないことも多い。以下のポイントは必ず押さえておいてほしい。
- 大文字・小文字の混在: JCLのPARMはデフォルトで大文字に変換される環境も多い。もし引数で小文字を扱いたい場合は、JCL側でアポストロフィで囲むなどの工夫が必要だが、プログラム側でも念のため `UPPERCASE` ビルトイン関数や、`COLLATE`の設定を確認する癖をつけておくこと。
- VSAMやファイルアクセスとの連携: PARMで受け取ったキー値を元にVSAMファイルを読み込む場合、必ず受け取った値を`TRIM`関数で整形してからキー項目にセットすること。
- 例: `KEY_VAL = TRIM(PARM_IN);`
- ONユニットによる制御: `SIGNAL ERROR`を使えば、パラメータが不正な場合に即座に終了処理(ファイルクローズやログ出力)へ分岐できる。`EXIT`ではなく`SIGNAL`を活用して、異常系をスマートに制御するのが「プロの書き方」だ。
4. 最後に:メインフレームエンジニアの矜持
「動けばいい」というコードは、数年後の自分や、保守を引き継ぐ誰かを苦しめることになる。PL/Iは非常に強力な言語であり、OSの深部まで手が届く。だからこそ、こうしたパラメータ受け取りのような「入り口」の部分で手を抜かないことが、大規模な基幹システムを10年、20年と支え続けるための礎となる。
もし、デバッグ中にPARMの中身が怪しいと感じたら、まずは `PUT DATA(PARM_IN);` を挿入して、シグナルやダンプを見る前に標準出力で内容を確定させること。これだけで、原因究明のスピードが劇的に変わるはずだ。
次は、このPARMを元にしたVSAMアクセスの最適化について解説しようと思う。また現場で会おう。
