PL/Iの世界へようこそ!ON ENDFILEでファイル処理をスマートに制御しよう
メインフレームの世界に足を踏み入れた皆さん、ようこそ!JavaやCOBOLを経験されてきた方にとって、PL/Iは少し「独特なクセ」がある言語に見えるかもしれません。でも安心してください。PL/Iは、非常に柔軟で、かつ堅牢なプログラムを書くための強力な武器です。
今回は、基幹システムのバッチ処理で避けては通れない「ファイルの読み込み」と、その終了条件である「EOF(End Of File)」のハンドリングについて解説します。
—
1. PL/Iの基本構造:まずは枠組みを理解する
PL/Iのプログラムは、大きく分けて `PACKAGE`(プログラムの入れ物)と `PROCEDURE`(実際の処理内容)で構成されます。特にメインとなるプログラムには `OPTIONS(MAIN)` というおまじないをつけます。
1
/ プログラムの始まり /
MY_BATCH_PROG: PACKAGE;
/ メイン処理の手続き /
MAIN_PROC: PROCEDURE OPTIONS(MAIN);
/ ここに処理を書いていきます /
END MAIN_PROC;
END MY_BATCH_PROG;
COBOLでいうところの `PROGRAM-ID` や、Javaの `public static void main` のようなものだと捉えていただければOKです。
—
2. 「ONユニット」はPL/Iの魔法の引き出し
PL/Iが他の言語と大きく違う面白い点、それが「ONユニット」という概念です。
通常、ファイル読み込みのループ処理では「読み込み失敗=EOF」をその都度 `IF` 文で判定しますよね。しかしPL/Iでは、「ファイルが終わったら、勝手にこの処理を呼び出してね」という予約を事前に入れておくことができます。これが `ON ENDFILE` です。
なぜONユニットを使うのか?
メインの処理ロジックの中に、「もしファイルが終わったら…」という判定を何度も書くと、コードが複雑で見づらくなってしまいますよね。ONユニットを使えば、読み込みの正常ルートと、終了時の例外処理を完全に分離できるため、非常にスッキリとしたコードが書けるんです。
—
3. 実践コード:EOF検知の書き方
では、実際にファイルからレコードを読み込み、終了時に処理を抜けるコードを見てみましょう。ここでは `GOTO` を使った制御が一般的です。
1
READ_FILE_PROC: PROCEDURE OPTIONS(MAIN);
/ ファイルの定義(入力用) /
DCL IN_FILE FILE RECORD INPUT;
DCL EOF_FLAG BIT(1) INIT(‘0’B); / 終了フラグの初期化 /
/ ON ENDFILEユニットの定義:ファイルが終わったらここを実行 /
ON ENDFILE(IN_FILE) BEGIN;
EOF_FLAG = ‘1’B; / 終了フラグを立てる /
PUT SKIP LIST(‘ファイル読み込み完了!’);
END;
OPEN FILE(IN_FILE);
/ 読み込みループ /
DO WHILE (EOF_FLAG = ‘0’B);
READ FILE(IN_FILE) INTO(MY_RECORD);
IF (EOF_FLAG = ‘0’B) THEN DO;
/ ここにレコードごとの処理を書く /
PUT SKIP LIST(MY_RECORD);
END;
END;
CLOSE FILE(IN_FILE);
END READ_FILE_PROC;
—
4. 現場で役立つ「怖くない」ポイント
GOTOを恐れないで
Javaなどでは忌み嫌われる `GOTO` 文ですが、PL/IのONユニットにおいては「制御をメインループから安全に離脱させるため」の正当なツールです。`SIGNAL` を使ってあえて終了条件を発生させるテクニックも存在しますが、まずは上記の `FLAG` 管理か、特定のラベルへの `GOTO` から慣れていくのが一番の近道です。
データ宣言の不思議
`DCL`(DECLARE)で変数を宣言する際、`BIT(1)` や `CHAR(80)` といった属性が出てきます。これらはメモリ上の「定規」のようなものです。特に `BIT` 型は `1` か `0` しか入らないスイッチとして非常に優秀なので、フラグ管理には積極的に使ってみてください。
最後に一つだけアドバイス
メインフレームの現場では、「このONユニットはどこまで有効なのか?」というスコープ(有効範囲)がとても重要です。PROCEDUREを抜けるとONユニットの効力も消えます。もし処理中に予期せぬエラーでプログラムが止まってしまったら、まず「どこでONユニットが定義され、どこで上書きされているか」を追ってみてください。
PL/Iは歴史が長い分、多くの先人が残した「枯れた知恵」が詰まっています。一つずつ紐解いていけば、必ずあなたの強力な相棒になってくれますよ。応援しています!
