Oracleでは、要素数nのホスト配列を含むSQL文を、同一のSQL文をn個の異なるスカラー変数(個々の配列要素)でn回実行するのと同様に扱います。このような扱いがあいまいなときにかぎり、プリコンパイラによりエラー・メッセージが発行されます。
たとえば、次のような宣言をしたとします。
int mgr_number[50]; char job_title[50][20];
次の文の場合、あいまいになります。
EXEC SQL SELECT mgr INTO :mgr_number FROM emp WHERE job = :job_title;
次の仮想の文のように処理されるためです。
for (i = 0; i < 50; i++) SELECT mgr INTO :mgr_number[i] FROM emp WHERE job = :job_title[i];
WHERE句の検索条件を満たす複数行があっても、データの受取りに使用できる出力変数が1つしかないためです。したがって、エラー・メッセージが出力されます。
一方、次の文を使用すると、不明瞭にならない場合があります。
EXEC SQL UPDATE emp SET mgr = :mgr_number WHERE empno IN (SELECT empno FROM emp WHERE job = :job_title);
次の仮想の文のように処理されるためです。
for (i = 0; i < 50; i++) UPDATE emp SET mgr = :mgr_number[i] WHERE empno IN (SELECT empno FROM emp WHERE job = :job_title[i]);
これは、それぞれのjob_titleが複数行に一致する場合でも、WHERE句内のjob_titleに一致する各行についてSET句内にmgr_numberが指定されているためです。それぞれのjob_titleに一致する行すべてに、同一のmgr_numberをSETできます。したがってエラー・メッセージは発行されません。