インジケーター変数

インジケーター変数は次の目的で使用します。
  • NULL 値の割り当て
  • NULL 値の検出
  • データの切り捨ての検出

COBOL とは異なり、SQL では NULL 値を格納できる変数をサポートしています。NULL 値はエントリが存在しないことを意味し、通常は値が不明または未定義です。NULL 値を使用することにより、数字列のゼロや文字列の空白文字などの意図的なエントリを、不明なエントリや適用不能なエントリと区別できます。たとえば、価格列から取り込んだ値が NULL の場合でも、対応する品目は無料ではありません。価格は無効または未設定です。

重要: ホスト変数が NULL の場合は、対応するインジケーター変数の値は -1 になります。ホスト変数が NULL 以外の値であれば、インジケーター変数は -1 以外の値になります。

データがデータベースからホスト変数に取り込まれたときに、切り捨てが実行される場合は、インジケーター変数を別の用途で使用できます。ホスト変数がデータベースから返されるデータを保持できるほど大きくない場合には、SQLCA データ構造体に警告フラグ (sqlwarn1) が設定され、インジケーター変数がデータベース内のデータのサイズに設定されます。

インジケーター変数の宣言

インジケーター変数は、常に次のように定義されます。

pic S9(4) comp-5.

インジケーター変数の使用

ホスト変数と対応するインジケーター変数は、両方で 1 つの SQL 値を示します。以下は、コンパニオン インジケーター変数使用したホスト変数のコーディングに適用されます。
  • これらの変数は、どちらも先頭にコロン (:) を付けて記述します。
  • それに対応するホスト変数の直後にインジケーター変数を配置します。
  • 次のように、FETCH INTO 文または SELECT ...INTO 文で、INDICATOR 句を使用して、または使用しないでホスト変数およびインジケーター変数を参照します。
    :hostvar:indicvar

    または

    :hostvar INDICATOR :indicvar 
  • 検索条件にはインジケーター変数を使用できません。NULL 値を検索するには、代わりに is null 構造体を使用します。

この例は、INTO... FETCH 文で使用されるインジケーター変数の宣言を示しています。

 EXEC SQL
     BEGIN DECLARE SECTION
 END-EXEC
 01 host-var       pic x(4).
 01 indicator-var  pic S9(4) comp-5.
 EXEC SQL
    END DECLARE SECTION
 END-EXEC
    . . .

     EXEC SQL
         FETCH myCursor INTO :host-var:indicator-var
     END-EXEC

次の例は、saleprice ホスト変数とコンパニオン インジケーター変数 saleprice-null を使用する UPDATE 文を示しています。

     EXEC SQL
        UPDATE closeoutsale
           SET temp_price = :saleprice:saleprice-null, 
                listprice = :oldprice   
     END-EXEC

この例では、saleprice-null の値が -1 の場合に UPDATE 文が実行されると、文は次のように読み取られます。

     EXEC SQL
        UPDATE closeoutsale
           SET temp_price = null, listprice = :oldprice   
     END-EXEC

この例は、is null 構造体を使用した検索を示しています。

     if saleprice-null equal -1
         EXEC SQL
             DELETE FROM closeoutsale 
                    WHERE temp_price is null
         END-EXEC
     else
         EXEC SQL
             DELETE FROM closeoutsale 
                    WHERE temp_price = :saleprice
         END-EXEC
     end-if