任意のホスト変数をオプションのインジケータ変数に関連付けることができます。インディケータ変数に関連付けたホスト変数をSQL文内で使用するたびに、結果コードが対応するインディケータ変数内に格納されます。したがって、インジケータ変数により、ホスト変数を監視できます。
インジケータ変数は、VALUES
句またはSET
句ではNULLを入力ホスト変数に割り当てるために、INTO
句では出力ホスト変数でNULLまたは切り捨てられた値を検出するために使用します。
出力ホスト変数の場合、Oracleでインジケータ変数に割り当てられる値には、次の意味があります。
-2: Oracleでは切り捨てられた列値をホスト変数に割り当てましたが、数値が大きすぎるため、元の長さの列値をインジケータ変数に割り当てることができませんでした。
-1: 列値はNULLであるため、ホスト変数の値は不確定です。
0: Oracleでは列値をそのままの形でホスト変数に割り当てました。
> 0: Oracleでは切り捨てられた列値をホスト変数に割り当て、元の列の長さ(マルチバイトのグローバリゼーション・サポート・ホスト変数の場合、バイト単位ではなく文字単位で表される)をインジケータ変数に割り当て、SQLCAのSQLCODEをゼロに設定しました。
インジケータ変数は、宣言部では2バイト整数として定義する必要があり、SQL文では(キーワードINDICATORを使用しない場合)前にコロンを付け、関連付けられたホスト変数に追加する必要があります。
インジケータ変数を使用して、NULLを挿入できます。挿入の前に、NULLにする列ごとに、該当するインジケータ変数を次の例に示すように-1に設定します。
set ind_comm = -1; EXEC SQL INSERT INTO EMP (EMPNO, COMM) VALUES (:emp_number, :commission:ind_comm);
インジケータ変数ind_commは、NULLがCOMM
列に格納されるように指定します。
かわりに、次のようにNULLをハードコードすることもできます。
EXEC SQL INSERT INTO EMP (EMPNO, COMM) VALUES (:emp_number, NULL);
これは柔軟性が少なくなりますが、読みやすくなります。
通常、NULLは、次の例のように条件付きで挿入します。
display 'Enter employee number or 0 if not available: '; read emp_number; IF emp_number = 0 THEN set ind_empnum = -1; ELSE set ind_empnum = 0; ENDIF; EXEC SQL INSERT INTO EMP (EMPNO, SAL) VALUES (:emp_number:ind_empnum, :salary);
WHERE
句のインジケータ変数を使用して、次のようにNULLがないか検査できます。
EXEC SQL SELECT ENAME, SAL INTO :emp_name, :salary FROM EMP WHERE :commission:ind_comm IS NULL ...
ただし、NULLを互いに、あるいは他の値と比較するために比較演算子を使用することはできません。たとえば、次のSELECT
文は、COMM
列に1つ以上のNULLが含まれていれば失敗します。
EXEC SQL SELECT ENAME, SAL INTO :emp_name, :salary FROM EMP WHERE COMM = :commission:ind_comm;
次の例は、値のいくつかがNULLの可能性がある場合に、値を比較して等しいかどうかを調べる方法を示しています。
EXEC SQL SELECT ENAME, SAL INTO :emp_name, :salary FROM EMP WHERE (COMM = :commission) OR ((COMM IS NULL) AND (:commission:ind_comm IS NULL));