【実務・中級編】SYSIN/SYSPRINTの制御とファイル属性の動的割り当て – PL/Iの基本構文とデータ制御実践ガイド

【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` ユニットで例外を捕捉できるか、という基本を徹底的に叩き込んでください。それが、大規模システムを動かすエンジニアとしての「確かな一歩」になります。

何か具体的なエラーコードや、マイグレーション時のハマりどころがあれば、いつでも聞いてください。我々の知識は、こうして次代へ引き継いでいくべきものですから。

タイトルとURLをコピーしました