終わりの合図を見逃さない!PL/Iにおけるファイル読み込みと「ON ENDFILE」の流儀
こんにちは!メインフレームの世界へようこそ。
JavaやCOBOLでバリバリ開発してきた皆さんにとって、PL/I(ピーエルワン)という言語は、まるで「少しクセのある超巨大な多機能ツール」のように見えるかもしれません。
今日は、そんなPL/Iの登竜門であり、基幹システムのバッチ処理で避けては通れない「ファイルの読み込み(EOF検知)」についてお話しします。特に、「ENDFILE条件」を使ったスマートな制御は、PL/Iの美学が詰まった場所でもあります。
—
1. なぜPL/IのEOF検知は「ONユニット」なのか?
Javaの`while((line = reader.readLine()) != null)`や、COBOLの`READ … AT END`に慣れていると、PL/Iのやり方は少し奇妙に映るはずです。
PL/Iでは、ファイルの終わり(EOF)を「エラーの一種(条件)」として捉えます。「読み込もうとしたらデータがなかった!」という事態を、プログラムが「あ、今EOF条件が発生したな」と検知して、専用の処理(ONユニット)へジャンプするという仕組みです。
これを、割り込み(Interrupt)のようなイメージで捉えてください。メインのループ処理を書きながら、「もし終わりが来たら、このフラグを立ててね」と裏側で予約しておくような感覚です。
—
2. 実践!EOF制御の定石コード
まずは、百聞は一見にしかず。実際のコードを見てみましょう。
1
/ プログラムの開始点 /
MY_BATCH_JOB: PACKAGE;
/ メイン処理の手続き /
MAIN_PROC: PROCEDURE OPTIONS(MAIN);
/ ファイル定義:SYSINという名前の入力順次ファイル /
DCL SYSIN FILE RECORD INPUT;
/ 終了フラグ:ビット型(’0’B は偽、’1’B は真) /
DCL EOF_FLAG BIT(1) INIT(‘0’B);
/ EOFが検知されたらこのブロックを実行するよう予約 /
ON ENDFILE(SYSIN) BEGIN;
EOF_FLAG = ‘1’B; / フラグを立ててループを抜ける準備をする /
END;
/ ファイルを開く /
OPEN FILE(SYSIN);
/ 読み込み開始! /
READ FILE(SYSIN) INTO(MY_RECORD);
/ フラグが立つまで回し続ける /
DO WHILE(EOF_FLAG = ‘0’B);
/ ここにデータの処理を記述 /
CALL PROCESS_DATA(MY_RECORD);
/ 次のレコードを読み込む /
READ FILE(SYSIN) INTO(MY_RECORD);
END;
CLOSE FILE(SYSIN);
PUT SKIP LIST(‘バッチ処理が正常に終了しました。’);
END MAIN_PROC;
END MY_BATCH_JOB;
—
3. このコードの「ここがポイント!」
なぜ `ON ENDFILE` を使うのか?
COBOLなどのようにREAD文の中に`AT END`を書くのではなく、あえて「ONユニット」という別枠で定義するのは、「例外処理をメインロジックから分離する」というPL/Iの設計思想によるものです。コードが読みやすくなり、どこでファイルが終わっても同じ作法で対応できるというメリットがあります。
`BIT(1)` って何?
Javaの`boolean`だと思ってください。PL/Iでは`’0’B`(ビットの0)が偽、`’1’B`(ビットの1)が真です。この「B」を忘れるとコンパイラが怒り出すので注意してくださいね。
`PACKAGE` と `PROCEDURE` の関係
PL/Iのプログラムは、`PACKAGE`の中に`PROCEDURE`を包むのが現代的な構成です。`OPTIONS(MAIN)`は、「ここがOSから呼ばれるスタート地点ですよ」という目印です。これがないと、どれがメイン処理か分からなくなってしまいます。
—
4. 最後に:怖がらずに、一歩ずつ
初めてこのコードを見たとき、「えっ、ファイルを読み込むだけでこんなに宣言がいるの?」と驚くかもしれません。しかし、PL/Iは一度慣れてしまうと、その「記述の厳密さ」が、大規模な基幹システムでのバグを防ぐ大きな盾になってくれることに気づくはずです。
もし現場で動いている古いコードを改修していて、「ONユニット」の中で変な挙動をしていたら、まずはそのONユニットがどこで宣言されているか(スコープ)を確認してみてください。PL/Iは、宣言した場所によってその効力が及ぶ範囲が細かく決まっている、とても礼儀正しい言語なんですよ。
「EOF検知」という小さな一歩ですが、これが理解できればPL/Iのバッチ処理の8割はマスターしたようなものです。自信を持って、メインフレームの世界を楽しんでいきましょう!
何か分からないことがあれば、いつでも聞いてくださいね。一緒に紐解いていきましょう。
