索引付きファイルは、デフォルト・アクセス・パスがキー値に基づいて構築されているファイルです。 索引付きファイルのキー順アクセス・パスを作成する 1 つの方法は、DDS を使う方法です。
索引付きファイルは、SELECT ステートメントの ORGANIZATION IS INDEXED 文節によって識別されます。
索引付きファイル中のレコードは、キー・フィールドによって識別されます。 ユーザーは、SELECT ステートメントの RECORD KEY 文節で、キー・フィールドを指定します。 索引付きファイルのレコード記述内で、RECORD KEY データ項目が定義されている必要があります。 ファイルに対して複数のレコード記述がある場合、その 1 つにだけ RECORD KEY データ名が含まれていれば十分です。 しかし、そのファイルの他のレコード記述を参照した場合、RECORD KEY データ項目を含むレコード記述内の同じ位置が、 他のレコード記述の中で KEY としてアクセスされます。
ALTERNATE RECORD KEY 文節で代替キーを指定することもできます。 代替キーを使用すると、索引付きファイルにアクセスし、 基本キーの順序とは違う順序でレコードを読み取ることができます。
索引付きファイルでは、順次アクセス、キーによるランダム・アクセス、または動的アクセスが可能です。
索引付きファイルにアクセスする標準的な COBOL プログラムを作成するには、特定の特性のファイルを作成する必要があります。表 27 に、それらの特性とそれを制御する方法を示します。
特性 | 制御 |
---|---|
ファイルは物理ファイルでなければならない。 | 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 用にオープンすると、それはすべてクリアされます。
ファイルの 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 ステートメントの例を示します。
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 ステートメントの例を示します。
....+....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
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 で索引付きファイルとして処理する場合には、次の制約事項および考慮事項が適用されます。
どちらの場合でも、RECORD KEY データ項目の値は無視されます。
図 120 と図 121 に、索引付きファイルのアクセス・パスを DDS を使用して記述する方法の例を示します。
....+....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 桁の整数として定義されている必要があります。
....+....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 の 「データベース」カテゴリーを参照してください。
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.