【入門編】RECORDファイルにおけるKEYED/SEQUENTIALアクセスの内部制御 – PL/Iの基本構文とデータ制御実践ガイド

こんにちは!メインフレームの世界へようこそ。
JavaやC#、あるいはCOBOLといった他の言語をバリバリ書いてきた方にとって、IBMメインフレームの「PL/I(ピーエルアイ)」という名前を聞くだけで、なんだか厳めしい古の呪文のように感じて身構えてしまうかもしれませんよね。

でも、安心してください。怖がる必要はまったくありません。
今回は、PL/Iの基本と、多くのエンジニアが最初はちょっと戸惑う「VSAMファイル(RECORDファイル)のKEYED/SEQUENTIALアクセスと内部ポインタの挙動」について、コーヒーでも飲みながらリラックスした気持ちで紐解いていきましょう。

1. 他言語とはここが違う?PL/Iのちょっとユニークな「識別子」の話

まず、JavaやCOBOLから来た人が最初に出会うカルチャーショックが「予約語の少なさ」です。

一般的な言語には、「`if`や`while`、`class`などは変数名に使ってはいけない」というガチガチの「予約語(Keywords)」のルールがありますよね。しかし、PL/Iの歴史的背景とコンパイラの懐の深さは一味違います。

PL/Iには「文脈依存の予約語」が多い!

PL/Iには、いわゆる「完全な予約語」が非常に少ないのが特徴です。例えば、`READ`や`WRITE`といった命令であっても、文脈上「あ、これは変数名だな」とコンパイラが判断できれば、変数として使えてしまうことさえあります。(もちろん、コードの可読性を考えると真似しない方が無難ですが!)

これはどういうことかというと、PL/Iは「その言葉がどこで、どう使われているか」というコンテキスト(文脈)をコンパイラが非常に賢く汲み取っているからなんです。
他の言語のルールに縛られている頭からすると、「えっ、それってエラーにならないの?」と驚くかもしれませんが、PL/Iのコンパイラは実はとっても柔軟な相棒なんですよ。

2. RECORDファイルってなに?VSAMとの出会い

さて、本題のRECORDファイルにおけるKEYED/SEQUENTIALアクセスについて見ていきましょう。

Javaでファイルを読み込むときは、`BufferedReader`などで一行ずつ、あるいはバイト配列でガリガリ読み込みますよね。メインフレームの世界、特にVSAM(KSDS:Key-Sequenced Data Setなど)を相手にする場合、PL/Iでは「RECORD I/O」という強力な仕組みを使います。

ここで、イメージしやすいように「巨大な図書館の書庫」を想像してみてください。

  • SEQUENTIAL(順次)アクセス: 書庫の入口から、棚の順番に一冊ずつ本を順番に棚から取り出して検品していくイメージです。
  • KEYED(索引)アクセス: 「384番の棚にある、〇〇というタイトルの本を取ってきて!」と、インデックス(索引)を使ってピンポイントで一冊の本を直接引き抜くイメージです。

PL/Iでは、この両方のアクセスをひとつのファイル定義の中で切り替えたり、組み合わせて使ったりすることができます。

3. 内部ポインタの管理はどうなっているの?

ここで一番気になるのが、「今、ファイル全体のどこを読んでいるの?」という内部のレコードポインタの管理ですよね。

初心者の方が一番ハマりやすいポイントがここです。
例えば、KEYEDアクセス(キー指定)で特定のレコードを読み込んだ直後に、何の気なしにSEQUENTIALアクセス(NEXT指定など)で次のレコードを読もうとしたとき、内部ポインタがどう動くか知っていますか?

ポインタの迷子に注意!

  • KEYEDアクセス時: コンパイラ(およびVSAMのアクセス法であるAccess Method Services)は、指定されたキーを求めてインデックスをたどり、目的のレコードにダイレクトにジャンプします。この瞬間、内部ポインタは「そのレコードの位置」に強制移動します。
  • SEQUENTIALに切り替える時: キー指定でジャンプした「その場所」から、次は物理的な次のレコードへとポインタが進みます。

言葉だけだと少し抽象的なので、実際のPL/Iコード例を見てみましょう。実務のバッチ処理やマイグレーション調査でよく見かけるパターンの記述です。

4. 実践!PL/IによるRECORDファイルの制御コード例

以下のサンプルコードは、VSAM(KSDS)ファイルに対して、キー指定(KEYED)で特定のレコードを読み込んだあと、そこから順番に(SEQUENTIAL)後続のレコードを読み進める典型的な処理の流れです。

1
/ ========================================================== /
/ VSAMファイル(KSDS)のKEYED/SEQUENTIAL混在アクセスの例 /
/ ========================================================== /
TESTPROG: PROC OPTIONS(MAIN);

/ — 1. ファイルの宣言 (DECLARE) — /
/ ENV(VSAM) により、OS側のVSAMアクセスメソッドを使用することを明示します /
DCL CUSTFILE FILE RECORD
ENV(VSAM)
KEYED; / キーアクセスを行うため KEYED を指定 /

/ — 2. レコード構造体の定義 — /
DCL 1 CUST_RECORD,
5 CUST_ID CHAR(5), / 顧客ID(キー項目) /
5 CUST_NAME CHAR(30), / 顧客名 /
5 CUST_STATUS CHAR(1); / ステータス /

DCL WS_SEARCH_KEY CHAR(5);
DCL END_OF_FILE BIT(1) INIT(‘0’B);

/ — 3. ファイルのオープン — /
/ 読み込み専用(INPUT)としてオープンします /
OPEN FILE(CUSTFILE) INPUT;

/ 探したい顧客IDをセット(例:’10050’) /
WS_SEARCH_KEY = ‘10050’;

/ — 4. KEYED(キー指定)アクセスによる読み込み — /
/ 指定したキー(WS_SEARCH_KEY)を持つレコードをダイレクトに取得 /
READ FILE(CUSTFILE) INTO(CUST_RECORD) KEY(WS_SEARCH_KEY);

/ 読み込み成功時の処理(実際にはステータスコードのチェック等が必要です) /
DISPLAY(‘【KEYED読込成功】 顧客ID: ‘ || CUST_ID || ‘ 名前: ‘ || CUST_NAME);

/ — 5. ポインタが移動したここから、SEQUENTIAL(順次)読込に切り替え — /
/ キー指定でヒットしたレコードの「次の物理レコード」を順次読み込みます /
DISPLAY(‘— ここから順次(SEQUENTIAL)読み込みを開始します —‘);

DO WHILE (^END_OF_FILE);

/ KEY句を書かずに READ を実行すると、内部ポインタの「次」が読まれます /
READ FILE(CUSTFILE) INTO(CUST_RECORD) NEXT;

/ ※注意: 実環境ではファイル終了(EOF)を捕捉する
ON ENDFILE 条件やステータスチェックの記述が必須になります /

DISPLAY(‘【SEQ読込】 顧客ID: ‘ || CUST_ID);

/ 簡易的なループ脱出条件(例として適当な条件を想定) /
if CUST_ID >= ‘10100’ then
END_OF_FILE = ‘1’B;

END;

/ — 6. ファイルのクローズ — /
CLOSE FILE(CUSTFILE);

RETURN;

END TESTPROG;

コードのポイント解説

1. `FILE RECORD` と `KEYED` 属性
ファイルの宣言時に `KEYED` をつけておくことで、「このファイルはキーを使ってランダムアクセスできるよ」とコンパイラとOSに教えてあげます。これが抜けていると、後から `KEY(xxx)` でダイレクトに引くことができません。
2. `KEY(WS_SEARCH_KEY)` によるダイレクトアクセス
書庫の例えで言えば、インデックスを引いてピンポイントで本を取り出す動作です。これによって、内部ポインタは一瞬でそのデータの場所へワープします。
3. `NEXT` による順次アクセスの継続
ワープしたその場所から、さらにその次のデータを読みたいときは、あえてキーを指定せずに `NEXT` を用いて読み進めます。この「ランダムからシーケンシャルへのスムーズなバトンタッチ」こそが、VSAMとPL/IのRECORD I/Oが持つ非常に強力な特徴です。

さいごに

いかがでしたでしょうか?
「PL/Iの構文やVSAMのRECORDアクセスなんて難しそう…」と思っていた方も、図書館の本棚の例えや、コードに添えたコメントを見ていくうちに、「なんだ、基本の考え方は他の言語のデータベース操作やファイル処理とそんなに変わらないな」と感じていただけたのではないでしょうか。

レガシーシステムの世界は、ルールや用語が独特で最初は少し威圧的に見えますが、一つひとつの仕様をひも解いていけば、先人たちが築き上げた非常に合理的で美しい仕組みに気づくことができます。

マイグレーションや保守の現場でPL/Iに出会ったときは、ぜひ「怖がらずに、内部ポインタと文脈を優しく追ってあげる」ことを思い出してくださいね。あなたのメインフレームライフが実りあるものになるよう、応援しています!

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