REF CURSOR のメッセージ スキーマ
REF CURSOR は、Oracle データベース内の結果セットへのポインターを表す Oracle PL/SQL データ型です。 REF CURSOR 型を使用すると、データの入出力ストリーミングが可能になり、PL/SQL コード ブロックとの間で大量のデータを転送するのに最適です。 Microsoft BizTalk Adapter for Oracle Database では、厳密に型指定され、弱く型指定された REF CURSOR パラメーターを PL/SQL プロシージャおよび関数に IN、OUT、および IN OUT パラメーターとして渡すサポートが提供されます。
Oracle データベースでは、REF CURSOR 型は厳密に型指定することも、弱く型指定することもできます。
厳密に型指定された REF CURSOR は、 のように
TYPE StrongCurType IS REF CURSOR RETURN emp%ROWTYPE;
RETURN 句で宣言されます。 厳密に型指定された REF CURSOR 変数は、REF CURSOR 型が宣言されている型と一致するデータを含む結果セットのみを表すことができます。 Oracle Database アダプターは、厳密に型指定された REF CURSOR の厳密に型指定された結果セットを返します。弱く型指定された REF CURSOR は、 のように
TYPE WeakCurType IS REF CURSOR;
RETURN 句なしで宣言されます。 Oracle には、弱く型指定された REF CURSOR 変数を宣言するために使用できる SYS_REFCURSOR と呼ばれる特別な REF CURSOR 型も用意されています。 弱く型指定された REF CURSOR 変数は、任意の種類の行データを含む結果セットを表すことができます。 Oracle Database アダプターは、弱く型指定された REF CURSOR のジェネリック レコードの弱い型指定された結果セットを返します。
IN REF CURSOR パラメーター
Oracle サーバーに REF CURSOR を作成する ODP.NET API がないため、Oracle Database アダプターは、クライアント プログラムが REF CURSOR 変数を作成および保守するための機能を提供できません。
ただし、Oracle Database アダプターでは、REF CURSOR を返す PL/SQL コードのブロックを指定することで、クライアントが IN REF CURSOR パラメーターを関数またはストアド プロシージャに渡すことができます。 アダプターはこのコードを使用して、Oracle サーバーで REF CURSOR 変数を作成して開きます。次に、この変数を IN パラメーターとして使用して関数またはストアド プロシージャを呼び出します。
Oracle Database アダプターは、IN REF CURSOR パラメーターを PL/SQL コード ブロックを含む文字列として表します。 このブロック内では、REF CURSOR の位置が疑問符 (?) で指定されます。 PL/SQL コード ブロックには、SQL クエリを含む OPEN-FOR ステートメントを含めることができます。または、OUT パラメーターで開かれた REF CURSOR が返される関数またはプロシージャ呼び出しを含めることができます。
ストアド プロシージャまたは関数を呼び出して REF CURSOR を開いて IN REF CURSOR を指定する方法を次に示します。
<[IN_REF_CURSOR_PARAM_NAME]>begin [SP_NAME]([SP_PARAMS...], ?, [SP_PARAMS...]); end;</[IN_REF_CURSOR_PARAM_NAME]>
Example:
<EMP_RC>begin GETEMP(1, ?); end; </EMP_RC>
SELECT クエリを使用して REF CURSOR を開いて IN REF CURSOR を指定する方法を次に示します。
<IN_REF_CURSOR_PARAM_NAME>begin open ? for select [FIELD_NAMES] from [TABLE_NAME]; end;</IN_REF_CURSOR_PARAM_NAME>
Example:
<EMP_RC>begin open ? for select * from EMP; end;</EMP_RC>
OUT REF CURSOR パラメーター
OUT REF CURSOR パラメーターは、厳密に型指定された結果セットまたは弱く型指定された結果セットとして返されます。 返される結果セットの型は、ORACLE サーバー上のストアド プロシージャまたは関数定義で、REF CURSOR パラメーターが厳密に型指定された REF CURSOR として宣言されているか、弱く型指定された REF CURSOR として宣言されているかによって異なります。 厳密に型指定された REF CURSOR パラメーターの場合は厳密に型指定された結果セットが返され、弱く型指定された REF CURSOR パラメーター (たとえば、SYS_REFCURSOR型で宣言されたパラメーター) に対して弱型の結果セットが返されます。
厳密に型指定された OUT REF CURSOR パラメーターの XML を次に示します。
<[PARAM_NAME]>
<[PARAM_NAME]RECORD>
<[COL1_NAME]>value1</[COL1_NAME]>
<[COL2_NAME]>value2</[COL2_NAME]>
...
</[PARAM_NAME]RECORD>
</[PARAM_NAME]>
[PARAM_NAME] = OUT REF CURSOR parameter name; for example, EMP_REFCURSOR
[COL_NAME] = Name of a column in the REF CURSOR type; for example, Name.
弱く型指定された OUT REF CURSOR パラメーターの XML を次に示します。
<[PARAM_NAME]>
<GenRecordRow xmlns="oracledb">
<GenRecordColumn>
<ColumnName>COL_NAME</ColumnName>
<ColumnValue>COL_VALUE</ColumnValue>
<ColumnType>COL_TYPE</ColumnType>
</GenRecordColumn>
…
</GenRecordRow>
…
</[PARAM_NAME]>
[COL_NAME] = Name of column; for example, Name
[COL_VALUE] = Column value; for example, Scott
[COL_TYPE] = Column data type; for example, System.String
IN OUT REF CURSOR パラメーター
Oracle Database アダプターは IN REF CURSOR パラメーターを文字列としてモデル化し、OUT REF CURSOR パラメーターを複合型としてモデル化するため、IN OUT REF CURSOR パラメーターに対して 1 つの型をサポートすることはできません。 このため、IN OUT REF CURSOR パラメーターは、要求メッセージの IN パラメーターと応答メッセージの OUT パラメーターの 2 つの異なるパラメーターとして扱われます。
サービス モデル プログラミングで名前の競合を回避するために、Oracle Database アダプターは、要求メッセージの IN パラメーターに文字列 "_IN" を追加して、[PARAM_NAME] という名前の特定のパラメーターに対して、次の 2 つのパラメーターが作成されるようにします。
[PARAM_NAME]_INは、ストアド プロシージャまたは関数要求メッセージの IN REF CURSOR パラメーターです。 これには、REF CURSOR を返す PL/SQL ステートメント (選択クエリまたはストアド プロシージャまたは関数呼び出し) が含まれています。
[PARAM_NAME] は、ストアド プロシージャまたは関数応答メッセージの OUT REF CURSOR パラメーターです。 OUT REF CURSOR は、厳密に型指定された結果セットまたは弱く型指定された結果セットとして格納されます。
重要
アダプターは、[PARAM_NAME]_INという名前の IN パラメーターと [PARAM_NAME] という名前の IN OUT REF CURSOR パラメーターを含むプロシージャまたは関数をサポートできません。 これは、アダプターが REF CURSOR パラメーターへの入力を表す [PARAM_NAME]_IN という名前のパラメーターを想定しており、要求メッセージで両方のパラメーターを指定できないためです。