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 データベース アダプターは、厳密に型指定された REF CURSOR の厳密に型指定された結果セットを返します。弱く型指定された REF CURSOR は、
TYPE WeakCurType IS REF CURSOR;
のように RETURN 句なしで定義されます。 Oracle には、弱く型指定された REF CURSOR 変数を宣言するために使用できる、SYS_REFCURSORと呼ばれる特殊な REF CURSOR 型も用意されています。 弱く型指定された REF CURSOR 変数は、任意の種類の行データを含む結果セットを表すことができます。 Oracle データベース アダプターは、型が弱い REF CURSOR 用のジェネリック レコードの型が弱い結果セットを返します。
IN REF CURSOR のパラメーター
Oracle サーバーに REF CURSOR を作成する ODP.NET API がないため、Oracle データベース アダプターは、クライアント プログラムが REF CURSOR 変数を作成および保守するための機能を提供できません。
ただし、Oracle Database アダプターでは、REF CURSOR を返す PL/SQL コードのブロックを指定することで、クライアントが IN REF CURSOR パラメーターを関数またはストアド プロシージャに渡すことができます。 アダプターはこのコードを使用して、Oracle サーバー上に REF CURSOR 変数を作成して開きます。次に、この変数を IN パラメーターとして使用して、関数またはストアド プロシージャを呼び出します。
Oracle データベース アダプターは、PL/SQL コード ブロックを含む文字列として IN REF CURSOR パラメーターを表します。 このブロック内では、REF CURSOR の位置が疑問符 (?) で指定されます。 PL/SQL コード ブロックには、SQL クエリを含む OPEN-FOR ステートメントを含めることができます。または、開かれた REF CURSOR が OUT パラメーターで返される関数またはプロシージャ呼び出しを含めることができます。
ストアド プロシージャまたは関数を呼び出して 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 データベース アダプターは、IN REF CURSOR パラメーターを文字列としてモデル化し、OUT REF CURSOR パラメーターを複合型としてモデル化するため、IN OUT REF CURSOR パラメーターに対して 1 つの型をサポートすることはできません。 このため、IN OUT REF CURSOR パラメーターは、要求メッセージの IN パラメーターと応答メッセージの OUT パラメーターの 2 つの異なるパラメーターとして扱われます。
サービス モデル プログラミングで名前の競合を回避するために、Oracle データベース アダプターは、要求メッセージの IN パラメーターに文字列 "_IN" を追加して、[PARAM_NAME] という名前の指定されたパラメーターに対して、次の 2 つのパラメーターが作成されるようにします。
[PARAM_NAME]_INは、ストアド プロシージャまたは関数要求メッセージの IN REF CURSOR パラメーターです。 これには、REF CURSOR を返す PL/SQL ステートメント (select クエリまたはストアド プロシージャまたは関数呼び出し) が含まれています。
[PARAM_NAME] は、ストアド プロシージャまたは関数の応答メッセージの OUT REF CURSOR パラメーターです。 OUT REF CURSOR は、厳密に型指定された結果セットまたは弱く型指定された結果セットとして格納されます。
Von Bedeutung
アダプターは、[PARAM_NAME]_INという名前の IN パラメーターと [PARAM_NAME] という名前の IN OUT REF CURSOR パラメーターを含むプロシージャまたは関数をサポートできません。 これは、アダプターが REF CURSOR パラメーターへの入力を表すために [PARAM_NAME]_INという名前のパラメーターを受け取り、要求メッセージで両方のパラメーターを指定できないためです。