ヌル可能フィールドとは、ヌル値を保持できるフィールドです。ヌル値とは、すべての非ヌル値と区別される特殊値のことで、情報がないことを意味します。 たとえば、ヌル値とは、ゼロの値、すべてのブランク、または 16 進数のゼロと同じではありません。 また、どの値とも、他のヌル値とさえも等しくはなりません。
データベース・レコードのフィールドごとに、フィールドがヌル値かどうかを示す 1 バイトの値があります。 フィールドが、ヌル値ならば 中に値 1 が含まれ、ヌル値でなければ 値 0 が含まれます。 この値のストリングをヌル・マップと呼び、ヌル可能データベース・ファイルのレコードごとに 1 つのヌル・マップがあります。 ヌル可能データベース・ファイルのレコード様式ごとに、独自のヌル・マップを持ちます。
ファイルにはキーも付けられ、キーには、ヌル・キー・マップが入っています。 ヌル・キー・マップとは、同じように定義した値の個別のストリングで、キーの各フィールドに 1 つあります。 キー付きヌル可能データベース・ファイルのレコードごとに、1 つのヌル・キー・マップがあります。 キー付きヌル可能データベース・ファイルのレコード様式ごとに、独自のヌル・キー・マップを持ちます。
ヌル・マップの中の値は、WORKING-STORAGE SECTION でのヌル・マップの定義方法によって、ブールの場合もあれば、英数字の場合もあります。 外部記述ファイルを使用していて、COPY-DDS ステートメント WITH NULL-MAP を指定すると、ブール値を指定した 1 つまたは複数のヌル・マップがセットアップされます。 COPY-DDS ステートメント WITH NULL-MAP-ALPHANUM を指定すると、英数字値を指定した 1 つまたは複数のヌル・マップがセットアップされます。 COPY-DDS ステートメント WITH NULL-KEY-MAP では、ブール値を指定した 1 つまたは複数のヌル・キー・マップが生成されます。 プログラム記述ファイルを使用すると、WORKING-STORAGE SECTION で、ヌル・マップをブールまたは英数字のいずれかに定義することができます。
NULL-MAP-ALPHANUM は、ヌル文字マップへ受け入れられる、あるいはヌル文字マップから送ることができる値の範囲を拡大して、0 または 1 以外の値を組み入れます。 ヌル文字マップ・フィールド内で、このフィールドがヌルであることを示す値は 1 だけです。 ヌル・マップで送ることができるまたは受け入れることができる 0 または 1 以外の値についての詳細は、 Web サイト http://www.ibm.com/eserver/iseries/infocenter にある iSeries Information Center の 「データベース」カテゴリーを参照してください。
入出力ステートメントに NULL-MAP (NULL-KEY-MAP) 句を指定すると、ヌル可能フィールドを含むデータベース・レコードが ILE COBOL プログラムによってアクセスされる際、 そのレコードのヌル・キー・マップ (存在する場合) とヌル・マップが、プログラムのヌル・マップ (ヌル・キー・マップ) のコピーとの間でコピーされます。 入出力ステートメントでの NULL-MAP および NULL-KEY-MAP 句の使用に関する詳細については、「WebSphere Development Studio: ILE COBOL 解説書」を参照してください。
ヌル可能ファイルの入出力、レコードの位置指定、およびヌル可能キー付きファイルでのレコードの削除については、以下の部分で説明します。
ヌル可能フィールドのエラー状態の処理に関する詳細については ヌル可能フィールドを使用した操作中のエラーの処理を参照してください。 ヌル可能フィールドの定義、および COPY DDS ステートメントでのヌル可能フィールドの使用に関する詳細については、「WebSphere Development Studio: ILE COBOL 解説書」を参照してください。
ヌル可能フィールドでの入出力操作は、以下の入出力ステートメントで NULL-MAP IS または NULL-KEY MAP IS 句を使用して行うことができます。
これらの句は、レコードとそのキーを定義するヌル・マップとヌル・キー・マップに関する、システムのデータ管理の設定値を処理します。 これらの句で指定された設定値は、添え字を付けるか、参照変更することができます。
ASSIGN 文節に ALWNULL 属性が指定されていて、WRITE または REWRITE ステートメントで NULL-MAP IS 句を指定しないと、B'0' のストリングが渡されます。 このレコード内のフィールドはすべて、ヌル値ではない と見なされます。 ファイルが索引ファイルで、かつ NULL-MAP IS 句を指定している場合は、NULL-KEY-MAP IS 句も指定しなければなりません。 キー・フィールドの場合は、ヌル・キー・マップの値がヌル・マップの対応する値と必ず同じになるようにしなければなりません。
ASSIGN 文節に ALWNULL 属性が指定されていて、READ ステートメントで NULL-MAP IS 句を指定しないと、 ヌル・マップには READ の前に入っていた同じ値が入ります。 ヌル可能キーの場合も、NULL-KEY-MAP IS 句を指定しなかった場合は、同じことが起こります。 ファイルが索引ファイルで、かつ NULL-MAP IS 句を指定している場合は、NULL-KEY-MAP IS 句も指定しなければなりません。
ヌル可能フィールドを処理できる入出力ステートメントの詳細については、「WebSphere Development Studio: ILE COBOL 解説書」を参照してください。
データベース・ファイルのヌル可能レコードの位置を決めるには、START ステートメントで NULL-KEY-MAP IS 句を使用します。 この句のオブジェクトは、添え字を付けるか、参照変更することができます。 START ステートメントで参照されるキー・フィールドのいずれかがヌル可能で、かつ NULL-KEY-MAP IS 句が使用されない場合は、 代わりにすべてゼロのヌル・マップが使用されます。
NULL-KEY-MAP IS 句を用いてデータベースのヌル可能レコードの位置を決める際の詳細については、「WebSphere Development Studio: ILE COBOL 解説書」を参照してください。
データベース・ファイルのヌル可能レコードを削除するには、DELETE ステートメントで NULL-KEY-MAP IS 句を使用します。 この句のオブジェクトは、添え字を付けるか、参照変更することができます。 DELETE ステートメントで参照されるキー・フィールドのいずれかがヌル可能で、かつ NULL-KEY-MAP IS 句が使用されない場合は、代わりにすべてゼロのヌル・マップが使用されます。
NULL-KEY-MAP IS 句を用いてデータベースのヌル可能レコードを削除する際の詳細については、「WebSphere Development Studio: ILE COBOL 解説書」を参照してください。
*...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8 A* THIS IS THE STUDENT INFORMATION FILE - NULLSTDT A A R PERSON A FNAME 20 A LNAME 30 A MARK 3P ALWNULL
*...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8 A* THIS IS THE CAR INFORMATION FILE - NULLCAR A A UNIQUE A R CARS A CARMODEL 25A ALWNULL A YEAR 4P A OPTIONS 2P A PRICE 7P 2 A K CARMODEL
5722WDS V5R4M0 060210 LN IBM ILE COBOL CBLGUIDE/NULLMAP ISERIES1 06/02/15 14:20:55 ページ 2 ソ ー ス STMT PL SEQNO -A 1 B..+....2....+....3....+....4....+....5....+....6....+....7..IDENTFCN S コピー名 変更日付 1 000100 IDENTIFICATION DIVISION. 2 000200 PROGRAM-ID. NULLMAP. 3 000300 ENVIRONMENT DIVISION. 4 000400 CONFIGURATION SECTION. 5 000500 SOURCE-COMPUTER. IBM-ISERIES. 6 000600 OBJECT-COMPUTER. IBM-ISERIES. 7 000700 INPUT-OUTPUT SECTION. 8 000800 FILE-CONTROL. 9 000900 SELECT NULLSTDT 10 001000 ASSIGN TO DATABASE-NULLSTDT-ALWNULL 1 11 001100 ORGANIZATION IS SEQUENTIAL 12 001200 ACCESS IS SEQUENTIAL 13 001300 FILE STATUS IS NULLSTDT-STATUS. 14 001400 SELECT NULLCAR 15 001500 ASSIGN TO DATABASE-NULLCAR-ALWNULL 16 001600 ORGANIZATION IS INDEXED 17 001700 ACCESS IS DYNAMIC 18 001800 RECORD KEY IS EXTERNALLY-DESCRIBED-KEY 19 001900 FILE STATUS IS NULLCAR-STATUS. 20 002000 DATA DIVISION. 21 002100 FILE SECTION. 22 002200 FD NULLSTDT. 23 002300 01 NULLSTDT-REC. 002400 COPY DDS-ALL-FORMATS OF NULLSTDT. 24 +000001 05 NULLSTDT-RECORD PIC X(52). <-ALL-FMTS +000002* I-O FORMAT:PERSON FROM FILE NULLSTDT OF LIBRARY CBLGUIDE <-ALL-FMTS +000003* <-ALL-FMTS 25 +000004 05 PERSON REDEFINES NULLSTDT-RECORD. <-ALL-FMTS 26 +000005 06 FNAME PIC X(20). <-ALL-FMTS 27 +000006 06 LNAME PIC X(30). <-ALL-FMTS 28 +000007 06 MARK PIC S9(3) COMP-3. 2 <-ALL-FMTS +000008* (ヌル可能フィールド) <-ALL-FMTS 29 002500 FD NULLCAR. 30 002600 01 NULLCAR-REC. 002700 COPY DDS-ALL-FORMATS OF NULLCAR. 31 +000001 05 NULLCAR-RECORD PIC X(34). <-ALL-FMTS +000002* I-O FORMAT:CARS FROM FILE NULLCAR OF LIBRARY CBLGUIDE <-ALL-FMTS +000003* <-ALL-FMTS +000004*THE KEY DEFINITIONS FOR RECORD FORMAT CARS <-ALL-FMTS +000005* NUMBER NAME RETRIEVAL ALTSEQ <-ALL-FMTS +000006* 0001 CARMODEL ASCENDING NO <-ALL-FMTS 32 +000007 05 CARS REDEFINES NULLCAR-RECORD. <-ALL-FMTS 33 +000008 06 CARMODEL PIC X(25). <-ALL-FMTS +000009* (ヌル可能フィールド) <-ALL-FMTS 34 +000010 06 YEAR PIC S9(4) COMP-3. <-ALL-FMTS 35 +000011 06 OPTIONS PIC S9(2) COMP-3. <-ALL-FMTS 36 +000012 06 PRICE PIC S9(5)V9(2) COMP-3. <-ALL-FMTS 002800 37 002900 WORKING-STORAGE SECTION. 38 003000 01 NULLSTDT-STATUS PIC XX VALUE " ". 39 003100 01 NULLCAR-STATUS PIC XX VALUE " ". 40 003200 01 NULLSTDT-NM. 003300 COPY DDS-ALL-FORMATS OF NULLSTDT
5722WDS V5R4M0 060210 LN IBM ILE COBOL CBLGUIDE/NULLMAP ISERIES1 06/02/15 14:20:55 ページ 3 STMT PL SEQNO -A 1 B..+....2....+....3....+....4....+....5....+....6....+....7..IDENTFCN S コピー名 変更日付 003400 WITH NULL-MAP. 3 +000001* NULL MAP: PERSON FROM FILE NULLSTDT OF LIBRARY CBLGUIDE <-ALL-FMTS +000002* <-ALL-FMTS 41 +000003 05 PERSON-NM. 4 <-ALL-FMTS 42 +000004 06 FILLER PIC X(2) VALUE ZEROS. <-ALL-FMTS 43 +000005 06 MARK-NF PIC 1 VALUE B"0". 5 <-ALL-FMTS 44 003500 01 NULLCAR-NKM. 003600 COPY DDS-ALL-FORMATS OF NULLCAR 003700 WITH NULL-KEY-MAP 003800 WITH NULL-MAP. +000001* NULL MAP: CARS FROM FILE NULLCAR OF LIBRARY CBLGUIDE <-ALL-FMTS +000002* <-ALL-FMTS +000003* NULL KEY MAP: 6 <-ALL-FMTS 45 +000004 05 CARS-NKM. <-ALL-FMTS 46 +000005 06 CARMODEL-NF PIC 1 VALUE B"0". <-ALL-FMTS 47 +000006 05 CARS-NM. <-ALL-FMTS 48 +000007 06 CARMODEL-NF PIC 1 VALUE B"0". <-ALL-FMTS 49 +000008 06 FILLER PIC X(3) VALUE ZEROS. <-ALL-FMTS 003900 50 004000 PROCEDURE DIVISION. 004100 MAINLINE. 51 004200 OPEN OUTPUT NULLSTDT. 52 004300 MOVE "JOHN" TO FNAME OF PERSON. 53 004400 MOVE "SMITH" TO LNAME OF PERSON. 54 004500 MOVE B"1" TO MARK-NF OF PERSON-NM. 7 55 004600 WRITE NULLSTDT-REC 004700 NULL-MAP IS PERSON-NM. 56 004800 CLOSE NULLSTDT. 004900 57 005000 OPEN INPUT NULLSTDT. 58 005100 MOVE " " TO FNAME OF PERSON. 59 005200 MOVE " " TO LNAME OF PERSON. 60 005300 MOVE B"0" TO MARK-NF OF PERSON-NM. 61 005400 READ NULLSTDT NULL-MAP IS PERSON-NM. 62 005500 IF FNAME OF PERSON = "JOHN" AND 005600 LNAME OF PERSON = "SMITH" AND 005700 MARK-NF OF PERSON-NM = B"1" AND 8 005800 NULLSTDT-STATUS = "00" 63 005900 DISPLAY "NAME IS CORRECT" 006000 ELSE 64 006100 DISPLAY "NAME IS NOT CORRECT" 006200 END-IF. 65 006300 CLOSE NULLSTDT. 006400 66 006500 OPEN EXTEND NULLSTDT. 67 006600 MOVE "TOM" TO FNAME OF PERSON. 68 006700 MOVE "JONES" TO LNAME OF PERSON. 69 006800 MOVE B"1" TO MARK-NF OF PERSON-NM. 70 006900 WRITE NULLSTDT-REC NULL-MAP IS PERSON-NM. 71 007000 CLOSE NULLSTDT. 007100 72 007200 OPEN INPUT NULLSTDT. 73 007300 MOVE " " TO FNAME OF PERSON. 74 007400 MOVE " " TO LNAME OF PERSON. 75 007500 MOVE B"0" TO MARK-NF OF PERSON-NM.
5722WDS V5R4M0 060210 LN IBM ILE COBOL CBLGUIDE/NULLMAP ISERIES1 06/02/15 14:20:55 ページ 4
STMT PL SEQNO -A 1 B..+....2....+....3....+....4....+....5....+....6....+....7..IDENTFCN S コピー名 変更日付
007600
76 007700 READ NULLSTDT
007800 NULL-MAP IS PERSON-NM.
77 007900 READ NULLSTDT
008000 NULL-MAP IS PERSON-NM.
78 008100 IF FNAME OF PERSON = "TOM" AND
008200 LNAME OF PERSON = "JONES" AND
008300 MARK-NF OF PERSON-NM = B"1" AND
008400 NULLSTDT-STATUS = "00"
79 008500 DISPLAY "NAME IS CORRECT"
008600 ELSE
80 008700 DISPLAY "NAME IS NOT CORRECT"
81 008800 DISPLAY "NAME IS: " FNAME " " LNAME
008900 END-IF.
82 009000 CLOSE NULLSTDT.
009100
83 009200 OPEN EXTEND NULLSTDT.
84 009300 MOVE "PETER" TO FNAME OF PERSON.
85 009400 MOVE "STONE" TO LNAME OF PERSON.
86 009500 MOVE B"1" TO MARK-NF OF PERSON-NM.
87 009600 WRITE NULLSTDT-REC
009700 NULL-MAP IS PERSON-NM.
88 009800 CLOSE NULLSTDT.
009900
89 010000 OPEN I-O NULLSTDT.
90 010100 MOVE " " TO FNAME OF PERSON.
91 010200 MOVE " " TO LNAME OF PERSON.
92 010300 MOVE B"1" TO MARK-NF OF PERSON-NM.
93 010400 READ NULLSTDT
010500 NULL-MAP IS PERSON-NM.
94 010600 READ NULLSTDT
010700 NULL-MAP IS PERSON-NM.
95 010800 READ NULLSTDT
010900 NULL-MAP IS PERSON-NM.
96 011000 MOVE "BRICK" TO LNAME OF PERSON.
97 011100 MOVE B"0" TO MARK-NF OF PERSON-NM.
98 011200 REWRITE NULLSTDT-REC NULL-MAP IS PERSON-NM.
99 011300 CLOSE NULLSTDT.
011400
100 011500 OPEN I-O NULLSTDT.
101 011600 MOVE " " TO FNAME OF PERSON.
102 011700 MOVE " " TO LNAME OF PERSON.
103 011800 MOVE B"1" TO MARK-NF OF PERSON-NM.
104 011900 READ NULLSTDT
012000 NULL-MAP IS PERSON-NM.
105 012100 READ NULLSTDT
012200 NULL-MAP IS PERSON-NM.
106 012300 READ NULLSTDT
012400 NULL-MAP IS PERSON-NM.
107 012500 IF FNAME OF PERSON = "PETER" AND
012600 LNAME OF PERSON = "BRICK" AND
012700 MARK-NF OF PERSON-NM = B"0" AND
012800 NULLSTDT-STATUS ="00"
108 012900 DISPLAY "NAME IS CORRECT"
013000 ELSE
5722WDS V5R4M0 060210 LN IBM ILE COBOL CBLGUIDE/NULLMAP ISERIES1 06/02/15 14:20:55 ページ 5 STMT PL SEQNO -A 1 B..+....2....+....3....+....4....+....5....+....6....+....7..IDENTFCN S コピー名 変更日付 109 013100 DISPLAY "NAME IS NOT CORRECT" 110 013200 DISPLAY "NAME IS: " FNAME " " LNAME 013300 END-IF. 111 013400 CLOSE NULLSTDT. 013500*-------------------------------------------------------------* 013600* WRITE records to indexed NULLCAR. * 013700*-------------------------------------------------------------* 112 013800 OPEN OUTPUT NULLCAR. 113 013900 MOVE B"0" TO CARMODEL-NF OF CARS-NKM. 114 014000 MOVE B"0" TO CARMODEL-NF OF CARS-NM. 115 014100 MOVE "SUPERCAR" TO CARMODEL OF CARS. 116 014200 MOVE 1995 TO YEAR OF CARS. 117 014300 MOVE 2 TO OPTIONS OF CARS. 118 014400 MOVE 14799 TO PRICE OF CARS. 119 014500 WRITE NULLCAR-REC NULL-KEY-MAP IS CARS-NKM 014600 NULL-MAP IS CARS-NM. 120 014700 MOVE "FASTCAR" TO CARMODEL OF CARS. 121 014800 MOVE 1997 TO YEAR OF CARS. 122 014900 MOVE 5 TO OPTIONS OF CARS. 123 015000 MOVE 18799 TO PRICE OF CARS. 124 015100 WRITE NULLCAR-REC NULL-KEY-MAP IS CARS-NKM 015200 NULL-MAP IS CARS-NM. 9 125 015300 MOVE B"1" TO CARMODEL-NF OF CARS-NKM. 126 015400 MOVE B"1" TO CARMODEL-NF OF CARS-NM. 127 015500 MOVE 1996 TO YEAR OF CARS. 128 015600 MOVE 5 TO OPTIONS OF CARS. 129 015700 MOVE 16199 TO PRICE OF CARS. 130 015800 WRITE NULLCAR-REC NULL-KEY-MAP IS CARS-NKM 015900 NULL-MAP IS CARS-NM. 131 016000 CLOSE NULLCAR. 016100 132 016200 OPEN I-O NULLCAR. 133 016300 MOVE B"0" TO CARMODEL-NF OF CARS-NKM. 134 016400 MOVE B"0" TO CARMODEL-NF OF CARS-NM. 135 016500 MOVE "SUPERCAR" TO CARMODEL OF CARS. 136 016600 MOVE 0 TO YEAR OF CARS. 137 016700 MOVE 0 TO OPTIONS OF CARS. 138 016800 MOVE 0 TO PRICE OF CARS. 139 016900 READ NULLCAR 017000 NULL-KEY-MAP IS CARS-NKM 017100 NULL-MAP IS CARS-NM. 140 017200 READ NULLCAR NEXT 017300 NULL-KEY-MAP IS CARS-NKM 017400 NULL-MAP IS CARS-NM. 141 017500 IF CARMODEL-NF OF CARS-NKM = B"1" AND 017600 YEAR OF CARS = 1996 AND 017700 OPTIONS OF CARS = 5 AND 017800 PRICE OF CARS = 16199 AND 017900 NULLCAR-STATUS = "00" 142 018000 DISPLAY "CAR IS CORRECT" 018100 ELSE 143 018200 DISPLAY "CAR IS NOT CORRECT" 144 018300 DISPLAY "CAR IS: " CARMODEL " " YEAR " " OPTIONS " " PRICE 145 018400 DISPLAY "NULLCAR-STATUS " NULLCAR-STATUS 018500 END-IF. 146 018600 CLOSE NULLCAR. 018700 147 018800 STOP RUN. * * * * * ソ ー ス 仕 様 の 終 わ り * * * * *
図 109 のサンプル・プログラムは、 データベース・ファイルのヌル・キー・マップとヌル・マップを使用して、有効な学生とカー・モデルを追跡する方法の例です。
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.