メインフレーム PL/I 初心者でも怖くない!KEYED属性でファイルアクセスをマスターしよう!
こんにちは!メインフレームの世界へようこそ!JavaやCOBOLのご経験があるあなたなら、きっとこの新しい世界もすぐに馴染めるはずです。今日は、PL/Iのちょっとユニークなファイルアクセス方法、「KEYED属性」について、一緒に楽しく学んでいきましょう。
「KEYED属性?なんだか難しそう…」なんて思わないでくださいね。大丈夫、一つずつ紐解いていけば、きっと「なるほど!」と思っていただけるはずです。まるで、宝の地図の鍵を開けるような感覚で、データの世界を自在に操るための扉を開けていきましょう!
PL/Iプログラムの「心臓部」:PACKAGE, PROCEDURE, OPTIONS(MAIN)
まず、PL/Iプログラムの基本的な骨組みについて、ささっとおさらいしておきましょう。他の言語でいうところの「クラス」や「メソッド」に似た概念ですが、PL/Iではちょっとした個性があります。
- `PACKAGE`: これは、関連するプログラムやデータ(変数など)をひとまとめにする「箱」のようなものです。プログラムの規模が大きくなってきたときに、整理整頓しやすくしてくれます。
- `PROCEDURE`: こちらは、特定の処理を行う「手続き」や「関数」のようなものです。プログラムの最小実行単位と考えてください。
- `OPTIONS(MAIN)`: この指定がついた `PROCEDURE` が、プログラムの「開始点」となります。他の言語でいう `public static void main(String[] args)` に相当する、いわばプログラムの「顔」ですね。
例えば、こんな風に書きます。
MYPROG: PROCEDURE OPTIONS(MAIN);
/ ここにプログラムの処理を書きます /
PUT SKIP LIST(‘Hello, PL/I World!’);
STOP; / プログラムを終了 /
END MYPROG;
`MYPROG:` の部分はプログラム(または手続き)の名前で、その後の `:` は必須です。`STOP;` でプログラムの実行を終了させます。`END` で手続きの終わりを示すのも、他の言語と似ていますね。
いよいよ本題!「KEYED属性」って何?
さて、今日の主役、「KEYED属性」のお話です。これは、レコード(データのかたまり)に「鍵」(キー)をつけて、その鍵を使って目的のレコードを直接探し出すための属性なんです。
イメージとしては、図書館で本を探すとき、本のタイトル(これがキー!)を頼りに、目的の本が置いてある棚へ一直線に向かうようなものです。本棚を最初から最後まで全部めくる必要がない、効率的な探し方ですよね?
PL/Iでは、VSAM(Virtual Storage Access Method)のような「キー順ファイル」や「相対ファイル」でこの `KEYED` 属性がよく使われます。これらのファイルは、レコードに固有の「キー」が設定されていて、そのキーを使って高速にアクセスできるのが特徴です。
KEYED属性の指定方法とREAD/WRITE時の「鍵」
`KEYED` 属性を指定するには、ファイル宣言の一部として記述します。
/ ファイル宣言の例 /
MYFILE: FILE ENVIRONMENT( VSAM KEYED SHARE );
/ VSAMファイルで、KEYED属性を持ち、共有可能であることを示します /
ここで重要なのが、READやWRITEを行う際に、どの「キー」を使ってアクセスするかをPL/Iに教えてあげる必要があることです。これが、`KEY` オプションや `KEYTO` オプションの役割になります。
1. `KEY` オプション:探したいレコードの「鍵」を指定する!
`READ` 文で、特定のキーを持つレコードを読み込みたいときに使います。
/ KEYED属性を持つファイルからのREAD処理 /
DECLARE
RECORD_BUFFER CHAR(100) VARYING, / 読み込むデータを格納するバッファ /
SEARCH_KEY CHAR(10) ; / 検索したいキーを格納する変数 /
/ … 検索キーに値をセットする処理 … /
SEARCH_KEY = ‘ABC1234567’;
/ KEYED属性を持つMYFILEから、SEARCH_KEYの値に一致するレコードを読み込む /
READ FILE(MYFILE) INTO(RECORD_BUFFER) KEY(SEARCH_KEY);
このコードでは、`MYFILE` という `KEYED` 属性を持つファイルから、`SEARCH_KEY` 変数に格納されている `’ABC1234567’` というキーに一致するレコードを読み込んで、`RECORD_BUFFER` に格納しています。まさに、鍵で直接扉を開けて、中身を取り出すイメージですね!
2. `KEYTO` オプション:読み込んだレコードの「鍵」を取得する!
`READ` 文でレコードを読み込んだ際に、そのレコードのキーを別の変数に取得したいときに使います。これは、後でそのレコードのキーを使って別の処理をしたい場合などに便利です。
/ KEYED属性を持つファイルからのREAD処理(キー取得付き) /
DECLARE
RECORD_BUFFER CHAR(100) VARYING, / 読み込むデータを格納するバッファ /
RECORD_KEY CHAR(10) ; / 読み込んだレコードのキーを格納する変数 /
/ … ファイルオープンなどの準備処理 … /
/ KEYED属性を持つMYFILEからレコードを1件読み込み、
そのレコードのキーをRECORD_KEY変数に格納する /
READ FILE(MYFILE) INTO(RECORD_BUFFER) KEYTO(RECORD_KEY);
/ これで、RECORD_KEYには読み込んだレコードのキーが入っています /
この例では、`MYFILE` から1件レコードを読み込み、そのレコードのキーを `RECORD_KEY` という変数に自動的に格納しています。これで、読み込んだレコードがどんなキーを持っていたのかを、後から確認できるようになります。
3. WRITE文でのKEYオプション
`WRITE` 文でも `KEY` オプションを使うことで、どのキーで新しいレコードをファイルに書き込むかを指定できます。これは、キー順ファイルに新しいレコードを追加する際に、正しい位置に挿入するために重要になります。
/ KEYED属性を持つファイルへのWRITE処理 /
DECLARE
NEW_RECORD CHAR(100) VARYING, / 書き込む新しいデータ /
INSERT_KEY CHAR(10) ; / 挿入するレコードのキー /
/ … 新しいレコードとキーの設定処理 … /
NEW_RECORD = ‘これは新しいデータです!’;
INSERT_KEY = ‘XYZ9876543’;
/ KEYED属性を持つMYFILEに、INSERT_KEYの値で新しいレコードを書き込む /
WRITE FILE(MYFILE) FROM(NEW_RECORD) KEY(INSERT_KEY);
これで、`MYFILE` に `’XYZ9876543’` というキーを持つ新しいレコードが書き込まれます。ファイルシステムが、このキーを使って適切な位置にレコードを配置してくれます。
まとめ:KEYED属性でファイルアクセスがもっと賢くなる!
どうでしょうか? `KEYED` 属性と `KEY`/`KEYTO` オプションの使い方が、少しイメージできたでしょうか?
- `KEYED` 属性: ファイルが「キー」を使ってレコードにアクセスできることを示します。
- `KEY` オプション: 読み込みたい、または書き込みたいレコードの「鍵(キー)」を指定します。
- `KEYTO` オプション: 読み込んだレコードの「鍵(キー)」を取得します。
これらの機能を使うことで、大量のデータの中から目的のレコードを効率的に探し出したり、適切な位置にデータを追加したりできるようになります。まるで、データベースのインデックス機能のように、データへのアクセスが格段に速く、賢くなるイメージですね!
メインフレームのPL/Iは、一見すると古めかしいと感じるかもしれませんが、その仕様の奥には、大量のデータを効率的に、そして確実に処理するための工夫がたくさん詰まっています。今日の `KEYED` 属性も、その一端です。
もし、このブログを読んで「もっと知りたい!」と思っていただけたら、それは私にとって何よりの喜びです。これからも、PL/Iやメインフレームの世界を、一つずつ、丁寧に紐解いていきましょうね!
次回も、皆さんの疑問に寄り添いながら、役立つ情報をお届けできればと思います。それでは、また!
