PL/Iの世界へようこそ!JCLのPARMをスマートに料理するコツ
こんにちは!メインフレームの世界へ足を踏み入れた皆さん、ようこそ。COBOLやJavaといった他言語の世界から来ると、PL/Iの独特な書き方に最初は戸惑うかもしれませんね。「なんだか古めかしいな」なんて感じるかもしれませんが、実はこの言語、非常に合理的で懐が深いんです。
今日は、バッチ処理の入り口である「JCLのPARMパラメータ」をPL/Iでどう受け取るか、そして「CHARACTER VARYING」という魔法の杖を使って、文字列をいかにスマートに扱うかを一緒に紐解いていきましょう。
—
1. JCLからの贈り物:PARMはどこへ行く?
JCL(Job Control Language)で `EXEC PGM=MYPROG,PARM=’HELLO’` と書いたとき、この `’HELLO’` という文字列は、PL/Iのプログラムのメインプロシージャに引数として渡されます。
PL/Iでは、以下のように記述するのが定石です。
/i
MYPROG: PROCEDURE(PARM_IN) OPTIONS(MAIN);
/ JCLのPARMを受け取るための宣言 /
DCL PARM_IN CHAR(100) VARYING;
PUT SKIP LIST(‘受け取った値は: ‘ || PARM_IN);
END MYPROG;
ここで注目してほしいのは、`DCL PARM_IN CHAR(100) VARYING;` です。
2. 「VARYING」って一体なに?
COBOL経験者の方だと、「なんでわざわざVARYINGなんてつけるの?固定長でいいじゃない」と思うかもしれません。実はここに、PL/Iの優しさが隠されています。
- 固定長 (CHAR(100)) の場合:
常に100バイトの箱を確保します。たとえPARMが「A」一文字であっても、後ろに99個のスペースがくっついてきます。これを処理するとき、いちいち「右側の空白をトリム(削除)する」という面倒な作業が発生します。
- VARYING の場合:
「中身の長さ」を管理する2バイトの領域を先頭に持ちます。これにより、プログラムは「今、実際に何文字入っているか」を自動的に認識してくれます。
つまり、`VARYING` を使うことで、`TRIM`関数を使ったり、長さ計算のためにゴリゴリとロジックを書いたりする必要がなくなるんです。「データの長さ管理はプログラム任せにせず、言語仕様に肩代わりさせる」、これがPL/I流の効率化です。
3. 注意点:なぜ「CHAR(100)」なのか?
「じゃあ、VARYINGなら最大サイズは適当でいいの?」と思うかもしれませんが、ここにはメインフレーム特有の「メモリ配置」の考え方が関わっています。
`CHAR(100) VARYING` と宣言すると、実際には「長さ情報(2バイト) + 最大100バイトの領域」が確保されます。JCLのPARMの最大長はシステムによって制限がありますが、受け取り側でそれ以上のサイズを指定しておけば、バッファオーバーフローを心配する必要はありません。
実践的なコード例:現場でよく見る形
現場のバッチ処理では、受け取った引数をさらに解析して使うことが多いですね。そんな時のテンプレートを置いておきます。
/i
/
- メインプロシージャの定義
- OPTIONS(MAIN)は、ここがプログラムの開始点であることをコンパイラに伝えます
/
BATCH_PROCESS: PROCEDURE(PARM_IN) OPTIONS(MAIN);
/
- JCLから渡される最大長を想定して宣言
- VARYINGを指定することで、文字列操作が劇的に楽になります
/
DCL PARM_IN CHAR(255) VARYING;
/
- 受け取った値の長さをチェックする例
- LENGTH関数で現在の有効長が即座にわかります
/
IF LENGTH(PARM_IN) = 0 THEN DO;
PUT SKIP LIST(‘パラメータが空です。デフォルト値で実行します。’);
END;
ELSE DO;
PUT SKIP LIST(‘処理対象データ: ‘ || PARM_IN);
END;
/ ここに業務ロジックが続きます… /
END BATCH_PROCESS;
まとめ:怖がる必要はありません
PL/Iの宣言は一見独特ですが、「メモリをどう使うか」「中身の長さはどう管理するか」を明示的に記述するスタイルは、Javaのオブジェクト指向に慣れた方にとっても、意外と「裏側で何が起きているかが見える」という安心感に繋がるはずです。
- `OPTIONS(MAIN)` はプログラムの玄関口!
- `VARYING` は文字列の長さを自動で管理してくれるお助け属性!
- 迷ったらまずは `VARYING` を使っておけば、後の文字列結合や比較で苦労しません。
最初は呪文のように見えるかもしれませんが、一つずつ紐解けば非常に論理的で美しい言語です。もしコンパイルエラーが出ても、それはPL/Iが「あなたの意図を正確に教えて!」と言っているだけ。怖がらずに、ぜひ楽しんでコーディングしてみてくださいね!
次回の記事では、このPARMをさらに構造体(STRUCTURE)を使って分解・解析する方法について解説したいと思います。それでは、良いメインフレーム・ライフを!
