ホスト配列は、INSERT文、UPDATE文、DELETE文では入力変数として、またSELECT文およびFETCH文のINTO句では出力変数として使用できます。
ホスト配列に使用される埋込みSQL構文は、単純ホスト変数に使用される埋込みSQL構文とほとんど同じです。ただし、オプションのFOR句で配列処理が制御できるという点に違いがあります。また、ホスト配列と単純ホスト変数を1つのSQL文で併用するときにも制限があります。
後続の項では、データ操作文でのホスト配列の使用方法を説明します。
単一のSQL文で複数のホスト配列を使用する場合、要素の数は同じにする必要があります。同じでない場合には、プリコンパイル時に「配列サイズが一致しません」という警告メッセージが出ます。この警告を無視すると、プリコンパイラではSQL操作で最小数の要素が使用されます。
int emp_number[50]; char emp_name[50][10]; int dept_number[25]; /* Populate host arrays here. */ EXEC SQL INSERT INTO emp (empno, ename, deptno) VALUES (:emp_number, :emp_name, :dept_number);
SQL文のホスト配列に添字を付け、それをループで使用することでデータをINSERTまたはフェッチできます。たとえば、次のようなループを使用して、配列内の5番目の要素ごとにINSERTできます。
for (i = 0; i < 50; i += 5) EXEC SQL INSERT INTO emp (empno, deptno) VALUES (:emp_number[i], :dept_number[i]);
ただし、処理する必要のある配列要素が連続している場合は、ループでホスト配列を処理しないでください。単に、添字の付いていない配列名をSQL文で使用してください。要素数nのホスト配列を含むSQL文は、n個の異なるスカラー変数を持つ同じSQL文としてn回実行するのと同様に扱われます。
インジケータ配列は、NULLを割り当ててホスト配列を入力し、出力ホスト配列でNULLまたは切り捨てられた値(文字列のみ)を検出する場合に使用できます。次の例は、インジケータ配列でINSERTを行う方法を示しています。
int emp_number[50]; int dept_number[50]; float commission[50]; short comm_ind[50]; /* indicator array */ /* Populate the host and indicator arrays. To insert a null into the comm column, assign -1 to the appropriate element in the indicator array. */ EXEC SQL INSERT INTO emp (empno, deptno, comm) VALUES (:emp_number, :dept_number, :commission INDICATOR :comm_ind);
配列インタフェースは、ANSI/ISOの埋込みSQL規格に対するOracle拡張機能です。ただし、MODE=ANSIでプリコンパイルすると、配列のSELECTおよびFETCHは使用できます。必要であれば、FIPSフラガー・プリコンパイラ・オプションによって、配列を使用していることをフラグで示すことができます。
配列をSELECTおよびFETCHするときは、必ずインジケータ配列を使用します。このようにして、関連する出力ホスト配列内にNULLがあるかどうかをテストできます。
DBMS=V7
またはDBMS=v8
のときに、インジケータ配列に対応付けられていないホスト配列にNULL
列値をSELECT
またはFETCH
すると、Oracleは処理を停止し、sqlerrd[2]
に処理済行数を設定しエラー・メッセージを出します。DBMS=V7
またはDBMS=v8
の場合、Oracleは切捨てをエラーとみなしません。
また、SELECT
またはFETCH
の結果、NULL
の使用によるORA-24347
などの警告が発生した場合や、列にインジケータ配列がない場合には、Oracleは処理を停止します。
注意:
SELECT
またはFETCH
では、すべての列に標識変数を使用します。インジケータのない列がある場合は、プリコンパイラ・オプションunsafe_null=yes
をかわりに使用できます。