導入
前章の順編成ファイルで「特定の1件だけ欲しい」場合、先頭から順番に読んで探すしかありませんでした。件数が多いと、これは非効率です。索引編成ファイル は、この問題を解決する仕組みです。
説明
索引編成ファイル(インデックスファイル) は、各レコードにキー(一意な識別子)を持たせ、そのキーを指定するだけで直接そのレコードにアクセスできるファイル形式です。図書館で例えるなら、「本を1冊ずつ端から探す」のではなく、「背表紙の分類番号(キー)から目的の本棚に直接向かう」ようなイメージです。
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CUSTOMER-FILE ASSIGN TO "customer.dat"
ORGANIZATION IS INDEXED
ACCESS MODE IS RANDOM
RECORD KEY IS CUST-ID
FILE STATUS IS WS-FILE-STATUS.
DATA DIVISION.
FILE SECTION.
FD CUSTOMER-FILE.
01 CUSTOMER-RECORD.
05 CUST-ID PIC 9(6).
05 CUST-NAME PIC X(20).
05 CUST-BALANCE PIC 9(8)V99.
ORGANIZATION IS INDEXED… このファイルが索引編成であることを宣言。前章のLINE SEQUENTIAL(順編成)との違いはここです。ACCESS MODE IS RANDOM… キーを指定して、狙ったレコードに直接アクセスする方式(ランダムアクセス)を使う、という宣言。RECORD KEY IS CUST-ID…CUST-ID(顧客番号)を、このファイルの一意なキーとして使うと宣言する。このキー項目はFDの中の項目(この例ではCUSTOMER-RECORDの子項目)でなければなりません。
順編成ファイルとの違いを整理すると、次のようになります。
| 順編成ファイル(第7章) | 索引編成ファイル(この章) | |
|---|---|---|
ORGANIZATION | LINE SEQUENTIAL | INDEXED |
| アクセス方法 | 先頭から順番にしか読めない | キーを指定して直接読める |
| 向いている処理 | まとめて全件処理するバッチ | 特定の1件をすぐ取り出したい処理 |
索引編成ファイルには、ACCESS MODE IS SEQUENTIAL(キー順に順番に読む)や ACCESS MODE IS DYNAMIC(順次アクセスとランダムアクセスを状況に応じて切り替える)という指定も可能です。まずは最も直感的な RANDOM(キー指定で1件を直接取得)から理解していきましょう。
試すには
「顧客番号」「氏名」「残高」を持つ CUSTOMER-FILE のFD・SELECT文を、自分の手で書いてみましょう。RECORD KEY IS に指定するキー項目が、FD配下の集団項目の中に正しく含まれているか確認してください。