【実務・中級編】LOCATE文によるファイル入出力とBASED変数の連携 – PL/Iの基本構文とデータ制御実践ガイド

メインフレームの真髄:LOCATE文とBASED変数による「直叩き」の極意

若手のエンジニア諸君、今日もレガシーの海で溺れていないか?

我々が扱うPL/Iという言語は、昨今の軽量言語のような「楽」はさせてくれない。だが、一度その深淵を覗けば、なぜ半世紀以上も基幹業務の屋台骨を支え続けているのかが理解できるはずだ。今日は、バッチ処理のパフォーマンスを左右する、最も「PL/Iらしい」ファイル操作術について語ろう。

`READ`や`WRITE`に頼り切っているようでは、まだまだ駆け出しだ。今日は、バッファ領域を直接操作するLOCATE文と、その相棒であるBASED変数による効率的なレコード処理について伝授する。

1. なぜ今、LOCATE文なのか?

通常の`WRITE`文は、プログラム内の変数をシステム側のバッファへ「コピー」する。しかし、レコード長が数キロバイトにも及ぶ巨大なVSAMファイルを、毎ステップコピーしていてはCPUサイクルが泣くぞ。

`LOCATE`文は、システムが管理するバッファ領域へのポインタを我々に提供してくれる。つまり、「バッファそのものを直接書き換える」ことができるのだ。メモリのコピーを一段階減らす、これが大規模バッチにおける真の最適化だ。

2. 実践コード:BASED変数によるバッファ操作

以下のコードを見てほしい。`BASED`変数を使って、レコードの構造をバッファ上にマッピングするテクニックだ。

1
/ —————————————————————— /
/ LOCATE文による効率的なVSAM出力処理の雛形 /
/ —————————————————————— /
TEST_BATCH: PROCEDURE OPTIONS(MAIN);

/ レコード構造の定義 /
DCL 1 REC_STRUC BASED(P_REC),
2 KEY_FIELD CHAR(8),
2 DATA_FIELD CHAR(100),
2 FILLER CHAR(192);

DCL P_REC POINTER;
DCL VSAM_FILE FILE RECORD OUTPUT DIRECT ENV(VSAM);

/ ONユニットによるエラーハンドリング(基本のキ) /
ON ENDFILE(VSAM_FILE) BEGIN;
PUT SKIP LIST(‘ファイル終了処理’);
END;

OPEN FILE(VSAM_FILE);

/

  • LOCATE文の真骨頂:
  • P_RECにバッファのアドレスが格納される。
  • 以降、REC_STRUCを操作することは、即ちバッファを操作することと同義。

/
LOCATE REC_STRUC FILE(VSAM_FILE) SET(P_REC);

/ バッファ直書き /
REC_STRUC.KEY_FIELD = ‘00000001’;
REC_STRUC.DATA_FIELD = ‘OPTIMIZED DATA WRITING’;
REC_STRUC.FILLER = ”;

/

  • 次のLOCATE発行、あるいはCLOSEで書き込みが確定する。
  • 明示的なWRITE文は不要。これがLOCATEの流儀。

/
CLOSE FILE(VSAM_FILE);

END TEST_BATCH;

3. 実務でハマる「罠」とデバッグの勘所

この手法を使う際、現場でよく発生するトラブルと、その対処法を叩き込んでおけ。

① ポインタの整合性

`LOCATE`で取得したポインタは、次にそのファイルに対して`LOCATE`や`WRITE`、`CLOSE`を発行するまでの間しか有効ではない。ポインタを保持して後から書き換えようとするような愚かな真似はするな。アドレスの不整合は、原因究明が困難な「予期せぬアベンド」を招く。

② BASED変数の初期化

`BASED`変数は自動変数ではない。メモリ領域を確保した時点でゴミデータが入っている可能性がある。`LOCATE`直後に必ず必要なフィールドをクリアするか、構造体全体を`STRING`関数などで初期化する癖をつけておけ。

③ ONユニットの制御フロー

`LOCATE`中のエラーは、通常のファイルI/Oエラーとは異なる挙動を示すことがある。特に`ENV`オプションでVSAMのストリームモードを指定している場合、バッファのフラッシュタイミングを意識せよ。異常終了時に「なぜデータが書き込まれていないのか」と悩む前に、`CLOSE`が正しく呼ばれているか、`ONCODE`を確認するロジックを組んでいるかを見直すことだ。

最後に:ベテランからの助言

PL/Iのコードは、書いた人間の「思考の解像度」をそのまま反映する。`LOCATE`を使うということは、システムがメモリをどう扱い、ディスクへどう掃き出しているかという「計算機の呼吸」を理解しているということだ。

パフォーマンスチューニングは、計算機に対する敬意から始まる。単に動くコードを書くのではなく、マシンリソースを最小限に抑える美しいコードを追求してほしい。

次は「`BASED`変数と`OFFSET`を用いたリスト構造の構築」について話してもいいが、それはまた別の機会にしよう。何かあれば、いつでもコードを持って相談に来い。健闘を祈る。

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