索引付きファイルの処理

索引付きファイルは、デフォルト・アクセス・パスがキー値に基づいて構築されているファイルです。 索引付きファイルのキー順アクセス・パスを作成する 1 つの方法は、DDS を使う方法です。

索引付きファイルは、SELECT ステートメントの ORGANIZATION IS INDEXED 文節によって識別されます。

索引付きファイル中のレコードは、キー・フィールドによって識別されます。 ユーザーは、SELECT ステートメントの RECORD KEY 文節で、キー・フィールドを指定します。 索引付きファイルのレコード記述内で、RECORD KEY データ項目が定義されている必要があります。 ファイルに対して複数のレコード記述がある場合、その 1 つにだけ RECORD KEY データ名が含まれていれば十分です。 しかし、そのファイルの他のレコード記述を参照した場合、RECORD KEY データ項目を含むレコード記述内の同じ位置が、 他のレコード記述の中で KEY としてアクセスされます。

ALTERNATE RECORD KEY 文節で代替キーを指定することもできます。 代替キーを使用すると、索引付きファイルにアクセスし、 基本キーの順序とは違う順序でレコードを読み取ることができます。

索引付きファイルでは、順次アクセス、キーによるランダム・アクセス、または動的アクセスが可能です。

索引付きファイルにアクセスする標準的な COBOL プログラムを作成するには、特定の特性のファイルを作成する必要があります。表 27 に、それらの特性とそれを制御する方法を示します。

表 27. 標準的な COBOL プログラムからアクセス可能な索引付きファイルの特性
特性 制御
ファイルは物理ファイルでなければならない。 CRTPF コマンドを使用してファイルを作成する。
ファイルは共用ファイルにはできない。 CRTPF CL コマンドに SHARE(*NO) を指定する。
ファイルにはキーを定義しなければならない。 ファイルのデータ記述仕様 (DDS) に、位置 17 に K を使用して、少なくとも 1 つのキー・フィールドを定義する。
レコード内での複数のキーは連続していなければならない。 ファイル DDS に単一のキー・フィールドを指定するか、またはキー・フィールドをキーの重要度の降順で連続して指定する。
キー・フィールドは英数字でなければならない。 数値にすることはできない。 DDS キー・フィールドとして使用するフィールドを定義する際に、位置 35 に A または H を指定する。
順序付けに使うキーの値には、各バイトの 8 ビットすべてが含まれている必要がある。 英数字キー・フィールドを指定する。
ファイルにキー値の重複したレコードを含めることはできない。 ファイル DDS の中で UNIQUE キーワードを指定する。
キーは昇順でなければならない。 ファイル DDS に DESCEND キーワードを指定しないようにする。
レコード検索の開始位置を指定することはできない。 POSITION パラメーターを指定した OVRDBF CL コマンドを出さないようにする。
ファイルに対して選択 / 除外レベル・キーワードを使用できない。 ファイル DDS の中に、位置 17 が S または O である行を含めないようにする。 COMP、RANGE、VALUES、または ALL のキーワードは指定しないようにする。
ファイル中のレコードに NULL フィールドを含めることができない。 ファイル DDS に ALWNULL キーワードを指定しないようにする。

索引付きファイルに保管されているデータにアクセスするには、OPEN、READ、 WRITE、START、REWRITE、DELETE、および CLOSE ステートメントを使用します。 それらのステートメントのそれぞれについては、「WebSphere Development Studio: ILE COBOL 解説書」を参照してください。 索引付きファイルにアクセスする場合、DATABASE ファイルでは FORMAT 句の指定はオプションであり、DISK ファイルでは FORMAT 句を使用できません。 FORMAT 句が指定されていない場合には、ファイルのデフォルトの様式名が使用されます。 ファイルのデフォルトの様式名は、そのファイル中で定義されている最初の様式名です。 特殊レジスター DB-FORMAT-NAME を使用することによって、成功した最後の入出力操作で使用された様式名を検索することができます。

索引付きファイルからレコードを順次に読み込む場合、ILE COBOL プログラムの中でそのファイルがどのように記述されているかに応じて、 レコードは到着順またはキー順で戻されます。 レコードを到着順に取り出すには、次の

     ORGANIZATION IS SEQUENTIAL
     ACCESS IS SEQUENTIAL

を、索引付きファイルに対する SELECT ステートメントで使用します。 レコードをキー・シーケンス (通常は昇順) で取り出すには、次の

     ORGANIZATION IS INDEXED
     ACCESS IS SEQUENTIAL

を、索引付きファイルに対する SELECT ステートメントで指定してください。

順次アクセスされる索引付きファイルの場合、START ステートメント以外では SELECT 文節の KEY 句は無視されます。 START ステートメントに KEY 句が指定されていない場合、SELECT 文節の RECORD KEY 句が使用され、KEY IS EQUAL であると見なされます。

ランダム・アクセスまたは動的アクセスされる索引付きファイルの場合、START ステートメント以外では SELECT 文節の KEY 句が使用されます。 START ステートメントに KEY 句が指定されていない場合、SELECT 文節の RECORD KEY 句が使用され、KEY IS EQUAL であると見なされます。

DYNAMIC アクセスの DATABASE ファイルの READ ステートメントには、NEXT、PRIOR、FIRST、または LAST を指定することができます。 SEQUENTIAL アクセスの DATABASE ファイルの READ ステートメントには、NEXT も指定することができます。 NEXT、PRIOR、FIRST、または LAST が指定されている場合、SELECT 文節の KEY 句は無視されます。

INDEXED 編成の物理データベース・ファイルを OUTPUT 用にオープンすると、それはすべてクリアされます。

有効な RECORD KEY

ファイルの DDS は、キー・フィールドとして使われるフィールドを指定します。 ファイルに複数のキー・フィールドがある場合、RECORD KEY IS EXTERNALLY-DESCRIBED-KEY が指定されているのでない限り、各レコードのキー・フィールドは連続している必要があります。

DDS の中でファイルに対して 1 つのキー・フィールドしか指定されていない場合、RECORD KEY は、DDS で定義されているキー・フィールドと同じ長さの単一フィールドでなければなりません。

形式 2 の COPY ステートメントがファイルに対して指定されている場合、RECORD KEY 文節は次のどれかを指定している必要があります。

DDS で複数の連続したキー・フィールドが指定されている場合、RECORD KEY データ名は、DDS 中の複数のキー・フィールドの長さの合計と等しい長さの単一のフィールドでなければなりません。 ファイルに対して形式 2 の COPY ステートメントが指定されている場合、 そのファイルについて、レコード中での適切な長さと位置によって RECORD KEY データ名を定義しているプログラム記述のレコード記述もなければなりません。

連続項目は、DATA DIVISION の中の連続した基本項目またはグループ項目で、単一のデータ階層に含まれているものです。

部分キーの参照

START ステートメントを使うと、部分キーを使用することができます。 KEY IS 句は必要です。

部分キーを参照する検索引き数の指定に関する規則については、「WebSphere Development Studio: ILE COBOL 解説書」の『START ステートメント』を参照してください。

図 117 に、プログラム記述ファイルを使用する START ステートメントの例を示します。

図 117. プログラム記述ファイルを使用する START ステートメント
 5722WDS V5R4M0  060210 LN  IBM ILE COBOL                CBLGUIDE/STRTPGMD        ISERIES1   06/02/15 14:41:49        ページ    2
                                     ソ ー ス
  STMT PL SEQNO  -A 1 B..+....2....+....3....+....4....+....5....+....6....+....7..IDENTFCN  S コピー名   変更日付
     1     000100 IDENTIFICATION DIVISION.
     2     000200 PROGRAM-ID. STRTPGMD.
           000300
     3     000400 ENVIRONMENT DIVISION.
     4     000500 CONFIGURATION SECTION.
     5     000600   SOURCE-COMPUTER. IBM-ISERIES.
     6     000700 OBJECT-COMPUTER. IBM-ISERIES.
     7     000800 INPUT-OUTPUT SECTION.
     8     000900 FILE-CONTROL.
     9     001000     SELECT FILE-1 ASSIGN TO DISK-NAMES                                                  00/08/15
    11     001100     ACCESS IS DYNAMIC RECORD KEY IS FULL-NAME IN FILE-1
    13     001200     ORGANIZATION IS INDEXED.
           001300
    14     001400 DATA DIVISION.
    15     001500 FILE SECTION.
    16     001600 FD  FILE-1.
    17     001700 01  RECORD-DESCRIPTION.
    18     001800     03 FULL-NAME.
    19     001900        05 LAST-AND-FIRST-NAMES.
    20     002000           07 LAST-NAME             PIC X(20).
    21     002100           07 FIRST-NAME            PIC X(20).
    22     002200        05 MIDDLE-NAME              PIC X(20).
    23     002300     03 LAST-FIRST-MIDDLE-INITIAL-NAME REDEFINES FULL-NAME
           002400                                    PIC X(41).
    24     002500     03 REST-OF-RECORD              PIC X(50).
           002600
    25     002700 PROCEDURE DIVISION.
           002800 MAIN-PROGRAM SECTION.
           002900 MAINLINE.
    26     003000     OPEN INPUT FILE-1.
           003100*
           003200* POSITION THE FILE STARTING WITH RECORDS THAT HAVE A LAST NAME OF
           003300* "SMITH"
    27     003400     MOVE "SMITH" TO LAST-NAME.
    28     003500     START FILE-1 KEY IS EQUAL TO LAST-NAME
    29     003600           INVALID KEY DISPLAY "NO DATA IN SYSTEM FOR " LAST-NAME
    30     003700                       GO TO ERROR-ROUTINE
           003800     END-START.
           003900*          .
           004000*          .
           004100*          .
           004200*
           004300* POSITION THE FILE STARTING WITH RECORDS THAT HAVE A LAST NAME OF
           004400* "SMITH" AND A FIRST NAME OF "ROBERT"
    31     004500     MOVE "SMITH" TO LAST-NAME.
    32     004600     MOVE "ROBERT" TO FIRST-NAME.
    33     004700     START FILE-1 KEY IS EQUAL TO LAST-AND-FIRST-NAMES
    34     004800           INVALID KEY DISPLAY "NO DATA IN SYSTEM FOR "
           004900                               LAST-AND-FIRST-NAMES
    35     005000                       GO TO ERROR-ROUTINE
           005100     END-START.
           005200*          .
           005300*          .
 5722WDS V5R4M0  060210 LN  IBM ILE COBOL                CBLGUIDE/STRTPGMD        ISERIES1   06/02/15 14:41:49        ページ    3
  STMT PL SEQNO  -A 1 B..+....2....+....3....+....4....+....5....+....6....+....7..IDENTFCN  S コピー名   変更日付
           005400*          .
           005500*
           005600* POSITION THE FILE STARTING WITH RECORDS THAT HAVE A LAST NAME OF
           005700* "SMITH", A FIRST NAME OF "ROBERT", AND A MIDDLE INITIAL OF "M"
           005800
    36     005900     MOVE "SMITH" TO LAST-NAME.
    37     006000     MOVE "ROBERT" TO FIRST-NAME.
    38     006100     MOVE "M" TO MIDDLE-NAME.
    39     006200     START FILE-1 KEY IS EQUAL TO LAST-FIRST-MIDDLE-INITIAL-NAME
    40     006300           INVALID KEY DISPLAY "NO DATA IN SYSTEM FOR "
           006400                               LAST-FIRST-MIDDLE-INITIAL-NAME
    41     006500                       GO TO ERROR-ROUTINE
           006600     END-START.
           006700
           006800
           006900 ERROR-ROUTINE.
    42     007000     STOP RUN.
                           * * * * *   ソ ー ス 仕 様 の 終 わ り   * * * * *

図 118図 119 に、外部記述ファイルを使用する START ステートメントの例を示します。

図 118. 外部記述ファイルを使用する START ステートメント -- DDS
 ....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
      A                                      UNIQUE
      A          R RDE                       TEXT('RECORD DESCRIPTION')
      A            FNAME         20          TEXT('FIRST NAME')
      A            MINAME         1          TEXT('MIDDLE INITIAL NAME')
      A            MNAME         19          TEXT('REST OF MIDDLE NAME')
      A            LNAME         20          TEXT('LAST NAME')
      A            PHONE         10  0       TEXT('PHONE NUMBER')
      A            DATA          40          TEXT('REST OF DATA')
      A          K LNAME
      A          K FNAME
      A          K MINAME
      A          K MNAME
図 119. 外部記述ファイルを使用する START ステートメント
 5722WDS V5R4M0  060210 LN  IBM ILE COBOL                 CBLGUIDE/STRTEXTD        ISERIES1   06/02/15 14:43:17        ページ    2
                                     ソ ー ス
  STMT PL SEQNO  -A 1 B..+....2....+....3....+....4....+....5....+....6....+....7..IDENTFCN  S コピー名   変更日付
     1     000100 IDENTIFICATION DIVISION.
     2     000200 PROGRAM-ID. STRTEXTD.
           000300
     3     000400 ENVIRONMENT DIVISION.
     4     000500 CONFIGURATION SECTION.
     5     000600   SOURCE-COMPUTER. IBM-ISERIES
     6     000700   OBJECT-COMPUTER. IBM-ISERIES.
     7     000800 INPUT-OUTPUT SECTION.
     8     000900 FILE-CONTROL.
     9     001000     SELECT FILE-1 ASSIGN TO DATABASE-NAMES
    11     001100     ACCESS IS DYNAMIC RECORD KEY IS EXTERNALLY-DESCRIBED-KEY
    13     001200     ORGANIZATION IS INDEXED.
           001300
    14     001400 DATA DIVISION.
    14     001400 DATA DIVISION.
    15     001500 FILE SECTION.
    16     001600 FD  FILE-1.
    17     001700 01  RECORD-DESCRIPTION.
           001800     COPY DDS-RDE OF NAMES.
          +000001*    I-O FORMAT:RDE        FROM FILE NAMES      OF LIBRARY CBLGUIDE           RDE
          +000003*THE KEY DEFINITIONS FOR RECORD FORMAT  RDE                                   RDE
          +000004*  NUMBER               NAME                RETRIEVAL       ALTSEQ            RDE
          +000005*   0001   LNAME                            ASCENDING         NO              RDE
          +000006*   0002   FNAME                            ASCENDING         NO              RDE
          +000007*   0003   MINAME                           ASCENDING         NO              RDE
          +000008*   0004   MNAME                            ASCENDING         NO              RDE
    18    +000009       05  RDE.                                                               RDE
    19    +000010           06 FNAME                 PIC X(20).                                RDE
          +000011*                  FIRST NAME                                                 RDE
    20    +000012           06 MINAME                PIC X(1).                                 RDE
          +000013*                  MIDDLE INITIAL NAME                                        RDE
    21    +000014           06 MNAME                 PIC X(19).                                RDE
          +000015*                  REST OF MIDDLE NAME                                        RDE
    22    +000016           06 LNAME                 PIC X(20).                                RDE
          +000017*                  LAST NAME                                                  RDE
    23    +000018           06 PHONE                 PIC S9(10)        COMP-3.                 RDE
          +000019*                  PHONE NUMBER                                               RDE
    24    +000020           06 DATA-DDS              PIC X(40).                                RDE
          +000021*                  REST OF DATA                                               RDE
    25     001900 66  MIDDLE-NAME RENAMES MINAME THRU MNAME.
           002000
    26     002100 PROCEDURE DIVISION.
           002200 MAIN-PROGRAM SECTION.
           002300 MAINLINE.
    27     002400     OPEN INPUT FILE-1.
           002500*
           002600* POSITION THE FILE STARTING WITH RECORDS THAT HAVE A LAST NAME
           002700* OF "SMITH"
    28     002800     MOVE "SMITH" TO LNAME.
    29     002900     START FILE-1 KEY IS EQUAL TO LNAME
    30     003000           INVALID KEY DISPLAY "NO DATA IN SYSTEM FOR " LNAME
    31     003100                       GO TO ERROR-ROUTINE
           003200     END-START.
 5722WDS V5R4M0  060210 LN  IBM ILE COBOL                CBLGUIDE/STRTEXTD        ISERIES1   06/02/15 14:43:17        ページ    3
  STMT PL SEQNO  -A 1 B..+....2....+....3....+....4....+....5....+....6....+....7..IDENTFCN  S コピー名   変更日付
           003300*          .
           003400*          .
           003500*          .
           003600*
           003700* POSITION THE FILE STARTING WITH RECORDS THAT HAVE A LAST NAME
           003800* OF "SMITH" AND A FIRST NAME OF "ROBERT"
    32     003900     MOVE "SMITH" TO LNAME.
    33     004000     MOVE "ROBERT" TO FNAME.
    34     004100     START FILE-1 KEY IS EQUAL TO LNAME, FNAME
    35     004200           INVALID KEY DISPLAY "NO DATA IN SYSTEM FOR "
           004300                               LNAME " " FNAME
    36     004400                       GO TO ERROR-ROUTINE
           004500     END-START.
           004600*    .
           004700*    .
           004800*          .
           004900*
           005000* POSITION THE FILE STARTING WITH RECORDS THAT HAVE A LAST NAME OF
           005100* "SMITH", A FIRST NAME OF "ROBERT", AND A MIDDLE INITIAL OF "M"
    37     005200     MOVE "SMITH" TO LNAME.
    38     005300     MOVE "ROBERT" TO FNAME.
    39     005400     MOVE "M" TO MINAME.
    40     005500     START FILE-1 KEY IS EQUAL TO LNAME, FNAME, MINAME
    41     005600           INVALID KEY DISPLAY "NO DATA IN SYSTEM FOR "
           005700                               LNAME SPACE FNAME SPACE MINAME
    42     005800                       GO TO ERROR-ROUTINE
           005900     END-START.
           006000
           006100
           006200 ERROR-ROUTINE.
    43     006300     STOP RUN.
                           * * * * *   ソ ー ス 仕 様 の 終 わ り   * * * * *

代替レコード・キー

代替キーは、代替索引と関連しており、代替索引は一時的な場合と永続的な場合があります。

一時的な代替索引は、ファイルが開かれたときに ILE COBOL が作成するものです。 ファイルが閉じられると、その一時的な索引は消滅します。 デフォルトでは、ILE COBOL は一時的な索引を作成しません。一時的な代替索引を使用するには、 CRTARKIDX オプションを指定する必要があります。

ただし、ILE COBOL は、永続的な索引を検出することができれば、 一時的な索引を作成する代わりにその永続的な索引をまだ使用します。 永続的代替索引とは、ILE COBOL プログラムが終了しても、消えずに残るもののことです。 永続的な索引は論理ファイルと関連するので、 COBOL プログラムで永続的な索引を使用するには、その前にまず論理ファイルを作成する必要があります。

論理ファイルの DDS 指定は、キー・フィールド (複数可) を除いて、物理ファイルの指定と同じである必要があります。 論理ファイルのキー・フィールドは、対応する、代替キーのデータ項目 と一致するように定義する必要があります。 ILE COBOL プログラムは、このような論理ファイルは、一切参照しないことを注意してください。

永続的な索引を使用すると、一時的なものを使用した場合よりもパフォーマンスが向上します。 レコード域内の代替キー・データ項目の長さと開始位置は、対応する DDS フィールドの長さと開始位置に 一致しなければなりません。 また DDS キー・フィールドは基本キーと関連しているため、 この DDS フィールドは、キー参照されるフィールドであってはなりません。 代替キー・データ項目が複数の DDS フィールドにマップする場合、 代替キー・データ項目の開始位置は最初の DDS フィールドと一致し、代替キー・データ項目の長さはこのキーを構成するすべての DDS フィールドの長さの合計と等しくなければなりません。

EXTERNALLY-DESCRIBED-KEY 文節は、代替キーも持つファイルに関しては 指定できません。

ある特定の入出力要求に使用するキーは、参照キーと呼びます。 参照キーは、READ または START ステートメントで変更することができます。

論理ファイルを索引付きファイルとして処理する

1 つの論理ファイルに対して複数のレコード様式があり、 そのおのおのにキー・フィールドが関連付けられていて、それを ILE COBOL で索引付きファイルとして処理する場合には、次の制約事項および考慮事項が適用されます。

図 120図 121 に、索引付きファイルのアクセス・パスを DDS を使用して記述する方法の例を示します。

図 120. データ記述仕様を用いた索引付きファイルのアクセス・パスの定義
 ....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
      A          R FORMATA                   PFILE(ORDDTLP)
      A                                      TEXT('ACCESS PATH FOR INDEXED FILE')
      A            FLDA          14
      A            ORDERN         5S 0
      A            FLDB         101
      A          K ORDERN

データ記述仕様を使用することにより、プログラムによって記述された索引付きファイルのアクセス・パスを作成することができます。

図 120 に示されている DDS は、論理ファイル ORDDTLL の FORMATA レコード様式のためのものであり、ORDERN という 5 桁の長さのフィールドがキー・フィールドとして定義されています。 ORDERN をキー・フィールドとして定義したことによって、このファイルのキー順アクセス・パスが確立されます。 その他の 2 つのフィールド FLDA と FLDB は、このレコード中の残りの位置が文字フィールドであることを記述しています。

プログラムによって記述された入力ファイル ORDDTLL は、SELECT 文節の FILE-CONTROL セクションで、索引付きファイルとして記述されています。

FD 項目の各フィールドの ILE COBOL 記述は、DDS ファイル中の対応する記述と合致していなければなりません。 RECORD KEY データ項目は、レコードの位置 15 から始まる 5 桁の整数として定義されている必要があります。

図 121. 索引付きファイルのアクセス・パス (複合キー) を定義するためのデータ記述仕様
 ....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
      A          R FORMATA                   PFILE(ORDDTLP)
      A                                      TEXT('ACCESS PATH FOR INDEXED FILE')
      A            FLDA          14
      A            ORDERN         5S 0
      A            ITEM           5
      A            FLDB          96
      A          K ORDERN
      A          K ITEM

この例では、図 121 に示されている DDS が、論理ファイル ORDDTLL のレコード様式 FORMAT に対して 2 つのキー・フィールドを定義しています。 プログラムによって記述されている索引付きファイルにおいて 2 つのフィールドを 1 つの複合キーとして使うためには、 キー・フィールドがレコード中で連続している必要があります。

各フィールドの ILE COBOL 記述は、DDS ファイル中の対応する記述と合致していなければなりません。 ファイル制御項目の RECORD KEY 文節で、レコードの位置 15 から始まる 10 文字の項目が定義されている必要があります。 DDS フィールド ORDERN および ITEM の ILE COBOL 記述は、RECORD KEY 文節で定義されている 10 文字の項目に従属するものとなります。

様式選択プログラムの使用法および論理ファイル処理の詳細については、Web サイト http://www.ibm.com/eserver/iseries/infocenter にある iSeries Information Center の 「データベース」カテゴリーを参照してください。