PL/SQLではNULLを操作できるため、インジケータ変数は必要ありません。たとえば、PL/SQL内では、次のようにIS NULL
演算子を使用してNULLがないか検査できます。
IF variable IS NULL THEN ...
次のように、代入演算子(:=
)を使用してNULLを割り当てることができます。
variable := NULL;
しかし、ホスト言語ではNULLを操作できないため、インジケータ変数が必要です。埋込みPL/SQLでは、次の目的でインジケータ変数を使用できるため、この要件を満たします。
ホスト・プログラムからのNULL入力の受入れ
NULLまたは切り捨てられた値のホスト・プログラムへの出力
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では、ブロックに入るときにインディケータ変数の値がチェックされ、ブロックから出るときにその値が正しく設定されます。
ブロックに入るとき、インジケータ変数の値が-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;