任意のホスト変数に任意指定の標識変数を関連付けることができます。標識変数に関連付けたホスト変数をSQL文内で使用するたびに、結果コードが対応する標識変数内に格納されます。つまり、標識変数によってホスト変数を監視できます。
注意:
PL/SQLブロックでは、単一のホスト変数に対して複数の標識変数を使用できません。このように使用すると、「バインドされていない変数があります。」というエラーが発生します。
標識変数をVALUESまたはSET句に使用して、入力ホスト変数にNULLを割り当てます。また、INTO句に使用すると、出力ホスト変数内のNULL値または切り捨てられた値を検出できます。
入力時
プログラムが標識変数に割り当てる値の意味は、次のとおりです。
変数 | 説明 |
---|---|
-1 |
Oracleによって、その列にNULLが割り当てられます。このホスト変数の値は無視されます。 |
>=0 |
Oracleは、このホスト変数の値を列に割り当てます。 |
出力時
Oracleが標識変数に割り当てる値の意味は、次のとおりです。
変数 | 説明 |
---|---|
-1 |
この列の値はNULLです。したがって、このホスト変数の値は予測不能です。 |
0 |
列の値がそのままこのホスト変数に割り当てられました。 |
>0 |
切り捨てられた列の値がこのホスト変数に割り当てられました。標識変数によって返される整数は、列値の元の長さです。SQLCAのSQLCODEが0(ゼロ)に設定されます。 |
-2 |
Oracleによって切り捨てられた列値がこのホスト変数に割り当てられました。ただし、元の列値は決定できませんでした(LONG列など)。 |
標識変数は2バイトの整数として定義する必要があります。また、SQL文中では、標識変数の前にコロンを付けてホスト変数の直後に置く必要があります。
標識変数を使用して、NULLをINSERTできます。INSERTの前に、次に示すように、NULLにする列に対応する標識変数をそれぞれ-1に設定します。
set ind_comm = -1; EXEC SQL INSERT INTO emp (empno, comm) VALUES (:emp_number, :commission:ind_comm);
標識変数ind_commにより、COMM列にNULLを入れるように指定されます。
EXEC SQL INSERT INTO emp (empno, comm) VALUES (:emp_number, NULL);
これは柔軟性が少なくなりますが、読みやすくなります。一般的には、次の例に示すように条件的にNULLを挿入します。
printf("Enter employee number or 0 if not available: "); scanf("%d", &emp_number); if (emp_number == 0) ind_empnum = -1; else ind_empnum = 0; EXEC SQL INSERT INTO emp (empno, sal) VALUES (:emp_number:ind_empnum, :salary);
DBMS=V7またはDBMS=V8のとき、SELECTまたはFETCHしたNULL値を標識変数と関連付けられていないホスト変数に入れると、Oracleは次のエラー・メッセージを発行します。
ORA-01405: fetched column value is NULL
関連項目:
次の例のようにWHERE句で標識変数を使用して、NULLをテストできます。
EXEC SQL SELECT ename, sal INTO :emp_name, :salary FROM emp WHERE :commission INDICATOR :ind_comm IS NULL ...
しかし、関係演算子を使用してNULLとNULL、またはNULLと他の値を比較することはできません。たとえば、COMM列に1つ以上のNULLが含まれる場合、次のSELECT文ではエラーが出力されます。
EXEC SQL SELECT ename, sal INTO :emp_name, :salary FROM emp WHERE comm = :commission;
次の例は、値のうちのいくつかがNULLである可能性がある場合の、値の等価性を比較する方法を示します。
EXEC SQL SELECT ename, sal INTO :emp_name, :salary FROM emp WHERE (comm = :commission) OR ((comm IS NULL) AND (:commission INDICATOR :ind_comm IS NULL));