【PL/I深掘り】JCLとファイル制御の「見えない絆」を紐解く:SYSIN/SYSPRINTから動的割り当てまで
メインフレームの現場でPL/Iを触っていると、たまに遭遇する「なぜか動かない」「なぜか動く」という現象。その多くは、JCLのDD名とプログラム内のFILE属性、そしてOPEN時の解釈のズレに起因しています。
今回は、我々が日々接しているPL/Iプログラムにおいて、最も基本的でありながら、実は奥が深い「ファイル制御」の極意を伝授します。
—
1. プログラムの骨格とFILE属性の「お作法」
PL/Iプログラムにおいて、`PACKAGE`や`PROCEDURE OPTIONS(MAIN)`は単なる箱ではありません。特にファイル操作においては、宣言したFILE名がJCLのDD名とどう紐づくかが重要です。
基本的には、`DECLARE FILE_NAME FILE RECORD INPUT;`のように宣言し、JCL上のDD名と一致させるのが定石です。もしDD名を動的に変えたい、あるいはプログラム内で柔軟に制御したいという場合、`ENVIRONMENT`属性や`TITLE`オプションを使いこなす必要があります。
2. SYSIN/SYSPRINTの制御と実用コード
バッチ処理の心臓部であるSYSIN(入力)とSYSPRINT(出力)。これらをいかに堅牢に制御するかが、システム全体の安定性に直結します。
以下のサンプルコードを見てください。現場でよく使われる、エラーハンドリングを含めた標準的な記述スタイルです。
/i
/===================================================================/
/ プログラム名: BATCH01 /
/ 概要: SYSINからレコードを読み込み、SYSPRINTへ書き出す標準処理 /
/===================================================================/
BATCH01: PROCEDURE OPTIONS(MAIN);
/ ファイル宣言: DD名SYSIN/SYSPRINTと内部名を関連付け /
DCL SYSIN FILE RECORD INPUT;
DCL SYSPRINT FILE RECORD OUTPUT;
/ 入出力レコード用バッファ /
DCL IN_REC CHAR(80);
DCL OUT_REC CHAR(80);
/ EOFフラグ /
DCL END_OF_FILE BIT(1) INIT(‘0’B);
/ ファイル読み込み終了時のONユニット定義 /
ON ENDFILE(SYSIN) END_OF_FILE = ‘1’B;
/ ファイルオープン: 実務では環境に合わせて属性を付与することも多い /
OPEN FILE(SYSIN);
OPEN FILE(SYSPRINT);
/ ループ処理 /
DO WHILE(¬END_OF_FILE);
READ FILE(SYSIN) INTO(IN_REC);
IF ¬END_OF_FILE THEN DO;
/ ここで何らかのビジネスロジックを挟む /
OUT_REC = ‘PROCESSED: ‘ || IN_REC;
WRITE FILE(SYSPRINT) FROM(OUT_REC);
END;
END;
CLOSE FILE(SYSIN);
CLOSE FILE(SYSPRINT);
END BATCH01;
3. VSAMアクセスと動的割り当ての極意
実務では、固定的なDD名だけでなく、プログラム実行中にファイル名を切り替えたい(動的割り当て)ケースが頻出します。ここで活躍するのが `TITLE` オプションです。
`OPEN FILE(FILE_PTR) TITLE(‘DSN(MY.DATA.SET)’);` のように指定することで、JCLで固定的にDDを指定せずとも、データセット名をプログラムから直接ハンドリングできます。
また、VSAM(KSDS等)を扱う際は、`KEYED` 属性を忘れてはなりません。
- RECORD: 物理的なレコード単位でのアクセスを定義。
- SEQUENTIAL/DIRECT: アクセスモードの指定。ランダムアクセスならDIRECTですね。
- KEYED: VSAMのキーアクセスには必須。
4. 現場のトラブルシューティング:ONユニットの落とし穴
「ファイルが開けない」「レコードが見つからない」。そんなとき、デバッグの鍵となるのが `ON` ユニットです。
特に `ON UNDEFINEDFILE(FILE_NAME)` を適切に実装していないと、システム異常終了(ABEND)時に原因の特定が困難になります。現場のシニアエンジニアとしては、以下のような防御的コーディングを強く推奨します。
/i
ON UNDEFINEDFILE(SYSIN)
BEGIN;
PUT SKIP LIST(‘エラー: SYSINファイルがオープンできませんでした。JCLのDD定義を確認してください。’);
SIGNAL ERROR; / エラーとして処理を中断し、ジョブを異常終了させる /
END;
最後に:メインフレームエンジニアの矜持
PL/Iは古くからある言語ですが、その堅牢性と複雑なデータ構造を扱う能力は、現代のどの言語にも引けを取りません。
JCLのDD文とソースコード内のFILE属性が「なぜその設定なのか」を常に意識してください。それが理解できれば、どんな難解な保守案件でも、必ず解は導き出せます。
もし、この記事を読んでいるあなたが若手なら、まずは `SYSPRINT` に期待通りのレコードが出力されるか、`ON` ユニットで例外を捕捉できるか、という基本を徹底的に叩き込んでください。それが、大規模システムを動かすエンジニアとしての「確かな一歩」になります。
何か具体的なエラーコードや、マイグレーション時のハマりどころがあれば、いつでも聞いてください。我々の知識は、こうして次代へ引き継いでいくべきものですから。
