本文へスキップ
BecomeCoder

COBOLコース · 第8章 索引編成ファイルとランダムアクセス · レッスン41

索引編成ファイルとは ― RECORD KEYで検索する

ローカル実施

導入

前章の順編成ファイルで「特定の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-IDCUST-ID(顧客番号)を、このファイルの一意なキーとして使うと宣言する。このキー項目は FD の中の項目(この例では CUSTOMER-RECORD の子項目)でなければなりません。

順編成ファイルとの違いを整理すると、次のようになります。

順編成ファイル(第7章)索引編成ファイル(この章)
ORGANIZATIONLINE SEQUENTIALINDEXED
アクセス方法先頭から順番にしか読めないキーを指定して直接読める
向いている処理まとめて全件処理するバッチ特定の1件をすぐ取り出したい処理

索引編成ファイルには、ACCESS MODE IS SEQUENTIAL(キー順に順番に読む)や ACCESS MODE IS DYNAMIC(順次アクセスとランダムアクセスを状況に応じて切り替える)という指定も可能です。まずは最も直感的な RANDOM(キー指定で1件を直接取得)から理解していきましょう。

試すには

「顧客番号」「氏名」「残高」を持つ CUSTOMER-FILE のFD・SELECT文を、自分の手で書いてみましょう。RECORD KEY IS に指定するキー項目が、FD配下の集団項目の中に正しく含まれているか確認してください。