入力ホスト配列およびインジケータ配列は、PL/SQLブロックに渡せます。これらは、BINARY_INTEGER型またはPLS_INTEGER型のPL/SQL変数を使用して索引付けができます。VARCHAR2型のキーは使用できません。通常は、ホスト配列全体がPL/SQLに渡されますが、ARRAYLEN文(後述)を使用すれば、より小さい配列サイズを指定できます。
さらに、ホスト配列のすべての値をPL/SQL表の複数の行に割り当てるために、プロシージャ・コールを使用できます。配列のサブスクリプトの範囲がmからnの場合、対応するPL/SQL表の索引範囲は常に1から n - m + 1になります。たとえば、配列サブスクリプト範囲が5から10の場合、対応するPL/SQL表の索引範囲は、1から(10 - 5 + 1)または1から6です。
次の例では、salaryという名前の配列をPL/SQLブロックに渡し、そのブロックのファンクション・コール内でその配列を使用しています。このファンクションは、一連の数値の中央値を検出するため、medianという名前が付いています。その仮パラメータには、num_tabというPL/SQL表が含まれています。このファンクション・コールにより、実パラメータsalary内のすべての値を仮パラメータnum_tab内の行に割り当てます。
...
float salary[100];
/* populate the host array */
EXEC SQL EXECUTE
DECLARE
TYPE NumTabTyp IS TABLE OF REAL
INDEX BY BINARY_INTEGER;
median_salary REAL;
n BINARY_INTEGER;
...
FUNCTION median (num_tab NumTabTyp, n INTEGER)
RETURN REAL IS
BEGIN
-- compute median
END;
BEGIN
n := 100;
median_salary := median(:salary, n);
...
END;
END-EXEC;
...
注意:
動的SQL方法4では、TABLE型のパラメータを使用して、ホスト配列をPL/SQLプロシージャにバインドすることはできません。方法4の使用方法も参照してください。
PL/SQL表のすべての行の値をホスト配列の対応する要素に割り当てる場合にも、プロシージャ・コールを使用できます。
関連項目:
例は、ストアドPL/SQLおよびJavaサブプログラムを参照してください。
表7-1に、PL/SQL表の行の値とホスト配列のエレメント間での有効な変換を示します。たとえば、LONG型のホスト配列は、VARCHAR2、LONG、RAWまたはLONG RAW型のPL/SQL表と互換性があります。ただし、CHAR型のPL/SQL表とは互換性がないため注意してください。
表7-1 正当なデータ型変換
| PL/SQL表→ホスト配列 | CHAR | DATE | LONG | LONG RAW | NUMBER | RAW | ROWID | VARCHAR2 |
|---|---|---|---|---|---|---|---|---|
CHARF |
X |
- |
- |
- |
- |
- |
- |
- |
CHARZ |
X |
- |
- |
- |
- |
- |
- |
- |
DATE |
- |
X |
- |
- |
- |
- |
- |
- |
DECIMAL |
- |
- |
- |
- |
X |
- |
- |
- |
DISPLAY |
- |
- |
- |
- |
X |
- |
- |
- |
FLOAT |
- |
- |
- |
- |
X |
- |
- |
- |
INTEGER |
- |
- |
- |
- |
X |
- |
- |
- |
LONG |
X |
- |
X |
- |
- |
- |
- |
- |
LONG VARCHAR |
- |
- |
X |
X |
- |
X |
- |
X |
LONG VARRAW |
- |
- |
- |
X |
- |
X |
- |
- |
NUMBER |
- |
- |
- |
- |
X |
- |
- |
- |
RAW |
- |
- |
- |
X |
- |
X |
- |
- |
ROWID |
- |
- |
- |
- |
- |
- |
X |
- |
STRING |
- |
- |
X |
X |
- |
X |
- |
X |
UNSIGNED |
- |
- |
- |
- |
X |
- |
- |
- |
VARCHAR |
- |
- |
X |
X |
- |
X |
- |
X |
VARCHAR2 |
- |
- |
X |
X |
- |
X |
- |
X |
VARNUM |
- |
- |
- |
- |
X |
- |
- |
- |
VARRAW |
- |
- |
- |
X |
- |
X |
- |
- |
注意:
Pro*C/C++プリコンパイラでは、ホスト配列の使用方法はチェックされません。たとえば、索引範囲チェックは実行されません。
入力ホスト配列をPL/SQLブロックに渡して処理するとします。デフォルトでは、入力ホスト配列をバインドすると、Pro*C/C++プリコンパイラは、その宣言されたサイズを使用します。ただし、配列全体を処理する必要がない場合があります。この場合には、ARRAYLEN文を使用して、より小さい配列サイズを指定できます。ARRAYLEN文では、ホスト配列をホスト変数と対応付け、そのホスト変数がより小さいサイズを格納します。文の構文は次のとおりです。
EXEC SQL ARRAYLEN host_array (dimension) [EXECUTE];
dimensionは4バイトの整数型ホスト変数です。リテラルや式ではありません。
EXECUTEはオプションのキーワードです。
ARRAYLEN文はhost_arrayおよびdimensionの宣言とともに(ただし、それらの宣言よりも後に)表示する必要があります。ホスト配列にオフセットは指定できません。しかし、この目的にC言語の機能が使用できる場合もあります。次の例では、ARRAYLENを使用して、bonusという名前のCホスト配列のデフォルトのサイズを上書きしています。
float bonus[100];
int dimension;
EXEC SQL ARRAYLEN bonus (dimension);
/* populate the host array */
...
dimension = 25; /* set smaller array dimension */
EXEC SQL EXECUTE
DECLARE
TYPE NumTabTyp IS TABLE OF REAL
INDEX BY BINARY_INTEGER;
median_bonus REAL;
FUNCTION median (num_tab NumTabTyp, n INTEGER)
RETURN REAL IS
BEGIN
-- compute median
END;
BEGIN
median_bonus := median(:bonus, :dimension);
...
END;
END-EXEC;
ARRAYLENでホスト配列のサイズが100要素から25要素に減少するため、25の配列要素のみがPL/SQLブロックに渡されます。その結果、PL/SQLブロックが実行のためOracleに送信されるとき、一緒に送られるホスト配列はずっと小さくなります。これにより、時間を節約し、ネットワーク化された環境でネットワークの通信量を削減できます。
動的SQL方法2のEXEC SQL EXECUTE文で使用されるホスト配列には、オプション・キーワードEXECUTEの有無によって、2つの異なる解釈があります。
関連項目:
デフォルト(ARRAYLEN文にEXECUTEキーワードがないとき):
ホスト配列はPL/SQLブロックが実行される回数が決定されるときに考慮されます。(最小値の配列サイズが使用されます。)
ホスト配列はPL/SQL索引表に結合されません。
EXECUTEキーワードが存在しているとき:
ホスト配列は索引表に結合されます。
PL/SQLブロックは1回のみ実行されます。
EXEC SQL EXECUTE文で指定されているすべてのホスト変数は、次のいずれかです。
ARRAYLEN ... EXECUTE文で指定
スカラー
たとえば、次のPL/SQLプロシージャを仮定します。
CREATE OR REPLACE PACKAGE pkg AS
TYPE tab IS TABLE OF NUMBER(5) INDEX BY BINARY_INTEGER;
PROCEDURE proc1 (parm1 tab, parm2 NUMBER, parm3 tab);
END;
次のPro*C/C++ファンクションは、特定のPL/SQLブロックを実行する回数を決定するためにホスト配列を使用する方法を示しています。この場合、PL/SQLブロックはemp表に新しい行が3行あるために3回実行されます。
func1()
{
int empno_arr[5] = {1111, 2222, 3333, 4444, 5555};
char *ename_arr[3] = {"MICKEY", "MINNIE", "GOOFY"};
char *stmt1 = "BEGIN INSERT INTO emp(empno, ename) VALUES :b1, :b2; END;";
EXEC SQL PREPARE s1 FROM :stmt1;
EXEC SQL EXECUTE s1 USING :empno_arr, :ename_arr;
}
次のPro*C/C++ファンクションは、動的方法2でホスト配列をPL/SQL索引表にバインドする方法を示しています。EXEC SQL EXECUTE文に指定されたすべてのホスト配列についてARRAYLEN...EXECUTE文があることに注意してください。
func2()
{
int ii = 2;
int int_tab[3] = {1,2,3};
int dim = 3;
EXEC SQL ARRAYLEN int_tab (dim) EXECUTE;
char *stmt2 = "begin pkg.proc1(:v1, :v2, :v3); end; ";
EXEC SQL PREPARE s2 FROM :stmt2;
EXEC SQL EXECUTE s2 USING :int_tab, :ii, :int_tab;
}
次のPro*C/C++ファンクションは、int_arrのARRAYLEN...EXECUTE文がないために、プリコンパイル時警告を生じます。
func3()
{
int int_arr[3];
int int_tab[3] = {1,2,3};
int dim = 3;
EXEC SQL ARRAYLEN int_tab (dim) EXECUTE;
char *stmt3 = "begin pkg.proc1(:v1, :v2, :v3); end; ";
EXEC SQL PREPARE s3 FROM :stmt3;
EXEC SQL EXECUTE s3 USING :int_tab, :int_arr, :int_tab;
}
関連項目:
配列の使用方法の詳細は、ホスト配列を参照してください。