Oracleでは、要素数nのホスト配列を含むSQL文を、同じSQL文をn個の異なるスカラー変数(個々の配列要素)でn回実行するのと同様に扱います。このように扱いがあいまいなときにかぎり、プリコンパイラから次のエラー・メッセージが発行されます。
PCC-S-0055: Array <name> not allowed as bind variable at ...
たとえば、次のような宣言をしたとします。
EXEC SQL BEGIN DECLARE SECTION; mgr_number (50) INTEGER; job_title (50) CHARACTER(20); EXEC SQL END DECLARE SECTION;
次の文の場合、あいまいになります。
EXEC SQL SELECT MGR INTO :mgr_number FROM EMP WHERE JOB = :job_title;
次の仮想の文のように処理されるためです。
FOR i = 1 TO 50 SELECT MGR INTO :mgr_number[i] FROM EMP WHERE JOB = :job_title[i]; ENDFOR;
これは、WHERE
句の検索条件を満たす行が複数あっても、データの受取りに使用できる出力変数は1つしかないためです。したがって、エラー・メッセージが出力されます。
しかし、次の文の場合、あいまいになりません。
EXEC SQL UPDATE EMP SET MGR = :mgr_number WHERE EMPNO IN (SELECT EMPNO FROM EMP WHERE JOB = :job_title);
次の仮想の文のように処理されるためです。
FOR i = 1 TO 50 UPDATE EMP SET MGR = :mgr_number[i] WHERE EMPNO IN (SELECT EMPNO FROM EMP WHERE JOB = :job_title[i]); ENDFOR;
これは、各job_titleが複数の行に一致する場合でも、WHERE
句のjob_titleに一致する行ごとにSET
句内でmgr_numberが指定されているためです。各job_titleに一致するすべての行に、同じmgr_numberをSET
できます。したがって、エラー・メッセージは表示されません。