入力ホスト配列およびインジケータ配列は、PL/SQLブロックに渡せます。これらには、BINARY_INTEGER
型のPL/SQL変数、またはその型と互換性のあるホスト変数によって索引付けができます。通常は、ホスト配列全体がPL/SQLに渡されますが、ARRAYLEN
文(後述)を使用すれば、より小さい配列サイズを指定できます。
さらに、サブプログラム・コールを使用して、ホスト配列のすべての値をPL/SQL表の複数の行に割り当てることができます。配列のサブスクリプトの範囲がmからnの場合、対応するPL/SQL表の索引範囲は常に1から(n - m + 1)になります。たとえば、配列サブスクリプト範囲が5から10の場合、対応するPL/SQL表の索引範囲は、1から(10 - 5 + 1)または1から6です。
注意:
Oracleプリコンパイラでは、ホスト変数の使用方法はチェックされません。たとえば、索引の範囲チェックは行われません。
次の例では、salaryというホスト配列をPL/SQLブロックに渡し、ブロックではこのホスト配列がファンクション・コールで使用されます。このファンクションは、一連の数値の中央値を検出するため、medianという名前が付いています。その仮パラメータには、num_tabというPL/SQL表が含まれています。このファンクション・コールにより、実パラメータsalary内のすべての値を仮パラメータnum_tab内の行に割り当てます。
EXEC SQL BEGIN DECLARE SECTION; ... salary (100) REAL; median_salary REAL; EXEC SQL END DECLARE SECTION; -- populate the host array EXEC SQL EXECUTE DECLARE TYPE NumTabTyp IS TABLE OF REAL INDEX BY BINARY_INTEGER; 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;
また、サブプログラム・コールを使用して、PL/SQL表内のすべての行をホスト配列内の対応する要素に割り当てることもできます。
表5-1に、PL/SQL表の行の値とホスト配列の要素間での有効な変換を示しています。たとえば、LONG
型のホスト配列は、VARCHAR2
、LONG
、RAW
またはLONG RAW
型のPL/SQL表と互換性があります。ただし、CHAR
型のPL/SQL表とは互換性がありません。
表5-1 PL/SQL表の行値とホスト配列の要素の有効な変換
PL/SQL表 | CHAR | DATE | LONG | LONG RAW | NUMBER | RAW | ROWID | VARCHAR2 |
---|---|---|---|---|---|---|---|---|
|
_/ |
|||||||
|
_/ |
|||||||
|
_/ |
|||||||
|
_/ |
|||||||
|
_/ |
|||||||
|
_/ |
|||||||
|
_/ |
|||||||
|
_/ |
_/ |
||||||
|
_/ |
_/ |
_/ |
_/ |
||||
|
_/ |
_/ |
||||||
|
_/ |
|||||||
|
_/ |
_/ |
||||||
|
_/ |
|||||||
|
_/ |
_/ |
_/ |
_/ |
||||
|
_/ |
|||||||
|
_/ |
_/ |
_/ |
_/ |
||||
|
_/ |
_/ |
_/ |
_/ |
||||
|
_/ |
|||||||
|
_/ |
_/ |
入力ホスト配列をPL/SQLブロックに渡して処理する必要があるとします。デフォルトでは、このようなホスト配列をバインドする際、Oracleプリコンパイラでは、宣言されたサイズが使用されます。ただし、配列全体を処理する必要がない場合があります。この場合、ARRAYLEN
文を使用して、より小さい配列サイズを指定できます。ARRAYLEN
文は、ホスト配列を格納サイズがより小さいホスト変数と関連付けます。文の構文は次のとおりです。
EXEC SQL ARRAYLEN host_array (dimension);
dimensionは4バイトの整数ホスト変数であり、リテラルや式ではありません。
ARRAYLEN
文は、宣言部でhost_arrayおよびdimension宣言の後に指定する必要があります。ホスト配列にオフセットは指定できません。しかし、その目的にはホスト言語の機能を使用できる場合があります。
次の例では、ARRAYLEN
を使用して、bonusというホスト配列のデフォルトのサイズをオーバーライドします。
EXEC SQL BEGIN DECLARE SECTION; bonus (100) REAL; my_dim INTEGER; EXEC SQL ARRAYLEN bonus (my_dim); EXEC SQL END DECLARE SECTION; -- populate the host array ... set my_dim = 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, :my_dim); ... END; END-EXEC;
ARRAYLEN
によってホスト配列のサイズが100要素から25要素に減るため、PL/SQLブロックには25の配列要素のみが渡されます。その結果、PL/SQLブロックが実行のためOracleに送信されるとき、一緒に送られるホスト配列はずっと小さくなります。これにより、時間を節約し、ネットワーク化された環境でネットワークの通信量を削減できます。