PL/Iの「玄関口」を攻略する:JCLのPARMを安全に受け取る作法
メインフレームの世界へようこそ!JavaやCOBOLの経験がある方にとって、PL/Iは少し「古風で頑固な職人」のように見えるかもしれません。でも安心してください。一つひとつの仕組みを紐解けば、PL/Iは極めて論理的で、実は非常に柔軟な言語なんです。
今回は、バッチ処理の入り口である「JCLのEXEC PARMから渡される引数を、どうやってPL/Iプログラムに取り込むか」というテーマでお話しします。
—
1. なぜ「PARM」が必要なのか?
メインフレームのバッチ処理では、プログラムを動かす際の指示書である「JCL(Job Control Language)」の中に、`PARM=’…’`という記述を書いて実行パラメータを渡すことがよくあります。
例えば、日付を指定して日次処理を走らせたり、特定のモードを切り替えたりですね。この「外からの文字列」をプログラムの中でいかにスマートに受け取るか。これが最初の壁になります。
2. まずはコードを見てみましょう
PL/Iでパラメータを受け取るための「定石」とも言えるコードがこちらです。
1
/ プログラムの入り口:OPTIONS(MAIN)は必須です /
MYPROG: PROCEDURE(PARM_STR) OPTIONS(MAIN);
/ 文字列の長さを保持するための宣言 /
/ VARYINGを指定することで、可変長文字列として扱えます /
DECLARE PARM_STR CHARACTER(100) VARYING;
/ JCLから渡された値を確認する /
PUT SKIP LIST(‘受け取ったパラメータは: ‘ || PARM_STR);
END MYPROG;
3. ここがポイント!PL/I流の「お作法」
このコード、他言語経験者から見ると「あれ?」と思う箇所がいくつかあるはずです。ここを優しく解説しますね。
① `PROCEDURE(PARM_STR)` の不思議
Javaの`public static void main(String[] args)`を想像してください。PL/Iの`PROCEDURE`のカッコ内に書いた変数は、OS(JCL)から渡される値をそのまま受け取る「受け皿」になります。
② `CHARACTER(100) VARYING` って何?
ここがPL/Iの面白いところです。
- CHARACTER(100): 最大100文字入る箱を用意する、という意味です。
- VARYING: 「中身の長さは可変ですよ」という宣言です。これがないと、PL/Iは律儀に「100文字すべて」を使い切ろうとして、後ろに謎の空白(スペース)を埋めてしまいます。VARYINGを付けることで、`PARM=’TEST’`と書けば、長さ4の文字列として素直に扱ってくれるようになります。
③ `OPTIONS(MAIN)` の役割
これは「このプログラムがプログラムの入り口(エントリーポイント)ですよ」とコンパイラに伝えるための魔法の呪文です。これがないと、OSはどこから処理を開始していいか分からず、泣き別れになってしまいます。
—
4. 実務で遭遇する「落とし穴」
現場でよくある失敗談を一つだけ共有しますね。
JCLのPARMに指定した文字列が、実は「長さを示す2バイト」を含んでいるという仕様をご存知でしょうか?PL/Iは賢いので、`CHARACTER VARYING`と宣言しておけば、その長さ情報を自動的に除去して「純粋な文字列」として変数に格納してくれます。
逆に言えば、VARYINGを付け忘れると、先頭にゴミのような制御文字が混ざってプログラムが正しく動かないという悲劇が起こります。「パラメータが化けているな?」と思ったら、まずはこの宣言を見直すのが、ベテランの最初のチェックポイントです。
—
最後に:怖がらずに、まずは動かしてみよう
PL/Iは、メモリの管理やデータの配置を細かく指定できる、非常に強力な言語です。「データ宣言が少し厳格だな」と感じるかもしれませんが、それは「安全かつ高速に動かすための先人の知恵」でもあります。
まずはこのテンプレートをコピペして、JCLから好きな文字列を渡してみてください。画面(SYSOUT)にその文字列が表示された瞬間、メインフレームのバッチ処理と皆さんのプログラムが初めて会話できたことを実感できるはずです。
何か分からないことがあれば、いつでも聞いてくださいね。一緒にレガシーシステムの迷宮を楽しく歩いていきましょう!
