プライマリ・コンテンツに移動
Oracle® Database Oracleプリコンパイラのためのプログラマーズ・ガイド
12c リリース1 (12.1)
B71398-03
目次へ移動
目次
索引へ移動
索引

前
次

インジケータ変数の使用について

任意のホスト変数をオプションのインジケータ変数に関連付けることができます。インディケータ変数に関連付けたホスト変数をSQL文内で使用するたびに、結果コードが対応するインディケータ変数内に格納されます。したがって、インジケータ変数により、ホスト変数を監視できます。

インジケータ変数は、VALUES句またはSET句ではNULLを入力ホスト変数に割り当てるために、INTO句では出力ホスト変数でNULLまたは切り捨てられた値を検出するために使用します。

入力変数

入力ホスト変数の場合、プログラムがインディケータ変数に割り当てる値の意味は次のとおりです。

  • -1: Oracleでは、ホスト変数の値を無視して、NULLを列に割り当てます。

  • >= 0: Oracleでは、ホスト変数の値を列に割り当てます。

出力変数

出力ホスト変数の場合、Oracleでインジケータ変数に割り当てられる値には、次の意味があります。

  • -2: Oracleでは切り捨てられた列値をホスト変数に割り当てましたが、数値が大きすぎるため、元の長さの列値をインジケータ変数に割り当てることができませんでした。

  • -1: 列値はNULLであるため、ホスト変数の値は不確定です。

  • 0: Oracleでは列値をそのままの形でホスト変数に割り当てました。

  • > 0: Oracleでは切り捨てられた列値をホスト変数に割り当て、元の列の長さ(マルチバイトのグローバリゼーション・サポート・ホスト変数の場合、バイト単位ではなく文字単位で表される)をインジケータ変数に割り当て、SQLCAのSQLCODEをゼロに設定しました。

インジケータ変数は、宣言部では2バイト整数として定義する必要があり、SQL文では(キーワードINDICATORを使用しない場合)前にコロンを付け、関連付けられたホスト変数に追加する必要があります。

NULLの挿入

インジケータ変数を使用して、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);

戻されたNULLの処理

インジケータ変数を使用して、次の例のように、戻されたNULLを操作できます。

EXEC SQL SELECT ENAME, SAL, COMM 
 INTO :emp_name, :salary, :commission:ind_comm 
 FROM EMP 
 WHERE EMPNO = :emp_number; 
IF ind_comm = -1 THEN 
 set pay = salary; -- commission is null; ignore it 
ELSE 
 set pay = salary + commission; 
ENDIF;

NULLのフェッチ

ただし、DBMSがNATIVE、V7またはV8の場合、インジケータ変数のないホスト変数にNULLを選択またはフェッチにより入れると、次のエラー・メッセージが表示されます。

ORA-01405: fetched column value is NULL

NULLの検査

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));

切り捨てられた値のフェッチ

切り捨てられた列値を、SELECT文またはFETCH文でインジケータ変数のないホスト変数に入れても、エラーは発生しません。