COBOLのINDEXED BY句を使ったインデックス管理の基本をやさしく解説!
生徒
「COBOLで配列を使うときに、どうやってどのデータを取り出すか指定するんですか?」
先生
「いい質問ですね。COBOLでは、配列(テーブル)を扱うときに『INDEXED BY句』という仕組みでインデックス管理ができますよ。」
生徒
「インデックスって何ですか? 難しそう……」
先生
「インデックスは、配列の中のどこを見ているかを記憶してくれる『しおり』のようなものです。イメージしやすいように、やさしく説明していきますね!」
1. INDEXED BY句とは?初心者でも安心の基礎知識
COBOLでは、同じ種類のデータをまとめて扱いたいときに「配列(テーブル)」を使います。たとえば、生徒の点数が10人分あるとき、それぞれ別々の変数を用意するのではなく、ひとつの配列にまとめて保存できます。
その配列の中から、どの位置のデータを見ているかを指定するのが「インデックス」です。そしてこのインデックスを使うために使われるのが、INDEXED BY
句です。
簡単に言うと、「インデックス変数に名前をつけて、この名前を使って配列を操作できるようにするよ」というのがINDEXED BY
句です。
2. INDEXED BY句の書き方と構文
INDEXED BY句は、OCCURS句
(配列を定義するための句)と一緒に使います。構文は以下のようになります。
01 STUDENT-TABLE.
05 STUDENT-NAME PIC X(20) OCCURS 10 TIMES
INDEXED BY STU-IDX.
この例では、STUDENT-NAME
という20文字の名前を10人分格納できる配列を定義しています。そしてINDEXED BY STU-IDX
によって、インデックス変数STU-IDX
が使えるようになっています。
POINT:このSTU-IDX
というインデックスは、通常の数字(1, 2, 3...)ではなく、「配列の位置を記憶する特別なポインタ」と考えてください。
3. INDEXED BYのしくみを日常でたとえてみよう
本を読んでいて「いま読んでいるページ」を覚えておくとき、しおりを挟みますよね? INDEXED BY句は、この「しおり」とそっくり。
配列(テーブル)は「本」のようなもので、各ページがデータのひとつひとつに相当します。そしてインデックスは「今どのページを見ているか」を教えてくれる道具です。
「5番目の生徒の名前を見よう」と思ったときに、インデックスを使ってそこへ一気にジャンプできます。
4. インデックスと添字(SUBSCRIPT)の違い
COBOLでは、配列の位置を指定する方法として、「添字(サブスクリプト)」と「インデックス」の2種類があります。
- 添字(subscript):普通の数字を使って、1番目、2番目…と指定
- インデックス(index):内部的にアドレスを使って高速にアクセスできる
つまり、INDEXED BY
で定義したインデックスを使うと、高速で効率のよい検索や処理が可能になります。特に大量のデータを扱うときに便利です。
5. インデックスを使った検索例(SEARCH文との連携)
インデックスは、COBOLのSEARCH
文という文とセットで使うことがよくあります。SEARCH文を使えば、配列の中から条件に合うデータを探し出すことができます。
以下は、「生徒の名前が 'YUI' のデータを探す」という処理の例です。
WORKING-STORAGE SECTION.
01 STUDENT-TABLE.
05 STUDENT-NAME PIC X(20) OCCURS 10 TIMES
INDEXED BY STU-IDX.
01 SEARCH-NAME PIC X(20) VALUE "YUI".
PROCEDURE DIVISION.
SEARCH STUDENT-NAME
AT END
DISPLAY "該当の名前は見つかりませんでした。"
WHEN STUDENT-NAME(STU-IDX) = SEARCH-NAME
DISPLAY "見つかりました! 名前:" STUDENT-NAME(STU-IDX)
END-SEARCH.
このプログラムでは、SEARCH
文で配列を順に調べて、条件に一致するデータを表示します。STU-IDX
が配列の「位置」を指してくれるので、1つずつ確認していくことができます。
実行結果のイメージ:
見つかりました! 名前:YUI
6. INDEXED BY句の注意点
初心者が気をつけるポイントは以下のとおりです。
- インデックス変数(例:
STU-IDX
)は、定義だけで値を直接代入することはできません。 SET STU-IDX TO 1
のように値を設定するには、SET
文を使います。- インデックスは、
PERFORM VARYING
やSEARCH
などの文とセットで使うと効果的です。
7. まとめて覚えよう!INDEXED BY句のポイント
- 配列(テーブル)を使うときに、どこを見ているかを指定するのがインデックス
INDEXED BY
句は、インデックス変数を定義するために必要SEARCH
文などと組み合わせることで、効率的なデータ検索ができる- 初心者にもやさしい「しおり」のイメージで覚えると理解しやすい