PL/SQLでは、NULLを操作できるため、標識変数は必要ありません。たとえば、PL/SQL内では、次のようにIS NULL演算子を使用してNULLをテストできます。
IF variable IS NULL THEN ...
その後、次のように代入演算子(:=)を使用して、NULL値を指定できます。
variable := NULL;
ただし、C言語のようなホスト言語はNULL値を操作できないため、標識変数を必要とします。埋込みPL/SQLでは、次の目的でインジケータ変数を使用できるため、この要件を満たします。
ホスト・プログラムからのNULL入力値の受入れ
NULLまたは切り捨てられた値のホスト・プログラムへの出力
PL/SQLブロックでインジケータ変数を使用するときは、次の規則に従ってください。
インジケータ変数は単独では参照できません。関連付けられたホスト変数に追加する必要があります。
インジケータ変数を指定してホスト変数を参照する場合、同じブロックでは常に同じ方法で参照する必要があります。
次の例では、標識変数ind_commがSELECT文でそのホスト変数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; ...