導入
メインフレームのPL/I開発において、ファイルからのデータ読み込みは避けて通れない基本処理です。しかし、レコードを読み込む際に単に変数へ格納するだけでなく、「なぜINTO句を使うべきか」を意識しているでしょうか。この技術Tipsでは、READ INTOを使用してデータをメモリ内の構造体へ物理コピーする手法の重要性と、そのパフォーマンス上のメリットについて解説します。この手法を用いることで、ファイルI/Oに伴うデータ変換コストを抑え、安定したデータ処理が可能になります。
基礎知識
PL/Iにおけるファイル読み込みには、大きく分けて「バッファアドレスを直接参照する」方法と、「データを指定領域にコピーする(READ INTO)」方法の2通りがあります。
INTO句は、ファイルから読み込んだ1レコードを、プログラム内の特定メモリ領域(主にDECLAREで定義した構造体)へ「物理コピー」する命令です。この際、メモリ内の構造体は、レコードのレイアウト(レコード構造)と一致している必要があります。一度メモリ上にコピーしてしまえば、元のファイル上のデータに影響を与えることなく、プログラム内で自由に値を加工・評価できるため、データの独立性が保たれます。
実装/解決策
実装のポイントは、レコードレイアウトと合致する構造体をあらかじめ定義しておくことです。
1. 構造体を定義する(DECLARE構文を使用)。
2. READ文でINTO句を指定し、読み込み先として構造体を指定する。
3. 読み込み後の処理を行い、必要に応じてREWRITE文でファイルを更新する。
この際、PL/IはハードウェアレベルのMVC(Move Character)命令を駆使して一括転記を行うため、個々の項目を個別に変換するよりも非常に低コストで処理が完了します。
サンプルプログラム
以下は、ファイルから読み込んだレコードを構造体に格納し、内容を確認するサンプルコードです。そのままコピーして開発環境での動作確認にご活用ください。
/ ファイル定義と構造体の宣言 /
DECLARE IN_FILE FILE RECORD INPUT;
DECLARE 1 REC_BUF,
5 ID CHAR(5), / 社員番号 /
5 NAME CHAR(20), / 氏名 /
5 DEPT CHAR(3); / 部門コード /
/ ファイルの読み込み処理 /
READ FILE(IN_FILE) INTO(REC_BUF);
/ 読み込み成功時の処理例 /
IF ID = ‘A0001’ THEN DO;
/ 構造体にコピーされているため、項目単位で参照可能 /
PUT SKIP LIST(‘対象者発見:’ || NAME);
END;
応用・注意点
現場で陥りやすいバグとして、構造体の定義と実際のレコード長が不一致であるケースが挙げられます。特に可変長ファイル(VBS等)を扱う場合、構造体のサイズが最大レコード長をカバーしているか確認が必要です。
また、INTO句を使用した場合はメモリ上にデータがコピーされるため、非常に大きなレコードを頻繁に読み込む際には、メモリ使用量を意識してください。データの更新を行う場合は、処理後に必ずREWRITEを実行することを忘れないでください。READ INTOでメモリに展開したデータを変更しても、REWRITEを実行しない限り、物理ファイルには反映されないという「データの独立性」を逆手に取り、計算用ワークエリアとして活用するのもテクニックの一つです。

コメント