ヌル可能フィールド

ヌル可能フィールドとは、ヌル値を保持できるフィールドです。ヌル値とは、すべての非ヌル値と区別される特殊値のことで、情報がないことを意味します。 たとえば、ヌル値とは、ゼロの値、すべてのブランク、または 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 解説書」を参照してください。

ヌル・マップおよびヌル・キー・マップの使用例

図 107. ヌル・マップおよびヌル・キー・マップの使用例 - STUDENT INFORMATION FILE (学生情報ファイル) DDS
*...+....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
図 108. ヌル・マップおよびヌル・キー・マップの使用例 - CAR INFORMATION FILE (カー情報ファイル) DDS
*...+....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
図 109. ヌル・マップおよびヌル・キー・マップの使用例
 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 のサンプル・プログラムは、 データベース・ファイルのヌル・キー・マップとヌル・マップを使用して、有効な学生とカー・モデルを追跡する方法の例です。

 1 
データベース・ファイル NULLSTDT をヌル可能と定義します。
 2 
データ項目 MARK を定義します。 フィールドが DDS の ALWNULL キーワードによりヌル可能と定義されたため、メッセージ (ヌル可能フィールド) が下に表示されます。
 3 
COPY DDS ステートメントおよび WITH NULL-MAP 句を用いて、ヌル可能 DDS ファイル NULLSTDT がプログラムに入れられます。
 4 
ヌル・マップ PERSON-NM が定義されます。
 5 
B"0" の値によって、データ項目 MARK-NF は非ヌル に初期設定されます。 ヌル可能フィールドに B"1" の値を指定すると、ヌルになります。
 6 
ヌル・キー・マップ CARS-NKM が定義されます。
 7 
NULL-MAP IS PERSON-NM 句によってレコード NULLSTDT-REC が書き込まれ、書き込み操作中のヌル・マップの使い方を示します。 NULL MAP IS 句は、他のあらゆる入出力操作においても使用されます。
 8 
MARK-NF OF PERSON-NM データ項目が、ヌル値 (B"1") であるかを検査されます。
 9 
NULLCAR-REC レコードが書き込まれ、ヌル・キー・マップおよびヌル・マップはともに、NULL-KEY-MAP IS および NULL-MAP IS 句を用いて参照されなければなりません。