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

前
次

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

PL/SQLではNULLを操作できるため、インジケータ変数は必要ありません。たとえば、PL/SQL内では、次のようにIS NULL演算子を使用してNULLがないか検査できます。

IF variable IS NULL THEN ...

次のように、代入演算子(:=)を使用してNULLを割り当てることができます。

variable := NULL;

しかし、ホスト言語ではNULLを操作できないため、インジケータ変数が必要です。埋込みPL/SQLでは、次の目的でインジケータ変数を使用できるため、この要件を満たします。

PL/SQLブロックでインジケータ変数を使用するときは、次の規則に従ってください。

次の例では、SELECT文でインジケータ変数ind_commがホスト変数commissionとともに指定されているため、IF文でも同様に指定する必要があります。

EXEC SQL EXECUTE
 BEGIN
 SELECT ename, comm
 INTO :emp_name, :commission:ind_comm FROM emp
 WHERE empno = :emp_number;
 IF :commission:ind_comm IS NULL THEN ...
 ...
 END;
END-EXEC;

PL/SQLでは、:commission:ind_commが他の単純な変数と同じように扱われることに注意してください。PL/SQLブロック内のインディケータ変数は直接参照できませんが、PL/SQLでは、ブロックに入るときにインディケータ変数の値がチェックされ、ブロックから出るときにその値が正しく設定されます。

NULLの処理

ブロックに入るとき、インジケータ変数の値が-1であれば、PL/SQLでは自動的にNULLがホスト変数に割り当てられます。ブロックから出るとき、ホスト変数がNULLであれば、PL/SQLにより自動的に-1の値がインジケータ変数に割り当てられます。次の例では、PL/SQLブロックに入る前にind_salの値が-1になっていると、salary_missing例外が発生します。例外とは、名前が指定されたエラー状態のことです。

EXEC SQL EXECUTE
 BEGIN
 IF :salary:ind_sal IS NULL THEN
 RAISE salary_missing;
 END IF;
 ...
 END;
END-EXEC;

切り捨てられた値の処理

PL/SQLでは、切り捨てられた文字列の値がホスト変数に割り当てられても、例外とはみなされません。ただし、インディケータ変数を指定している場合には、PL/SQLによってそのインディケータ変数が文字列の元の長さに設定されます。次の例では、ホスト・プログラムは、ind_nameの値をチェックして、切り捨てられた値がemp_nameに割り当てられたかどうかを判別できます。

EXEC SQL EXECUTE
 DECLARE
 ...
 new_name CHAR(10);
 BEGIN
 ...
 :emp_name:ind_name := new_name;
 ...
 END;
END-EXEC;