Oracle® Data Provider for .NET開発者ガイド ODAC 12c リリース4 (12.1.0.2) for Microsoft Windows E72575-01 |
|
前 |
次 |
OracleRefCursor
オブジェクトは、Oracle REF
CURSOR
を表します。
クラスの継承
System.Object
System.MarshalRefByObject
Oracle.DataAccess.Types.OracleRefCursor
宣言
// C# public sealed class OracleRefCursor : MarshalByRefObject, IDisposable, INullable
要件
プロバイダ | ODP.NET管理対象外ドライバ | ODP.NET管理対象ドライバ |
アセンブリ | Oracle.DataAccess.dll |
Oracle.ManagedDataAccess.dll |
ネームスペース | Oracle.DataAccess.Types |
Oracle.ManagedDataAccess.Types |
.NET Framework | 3.5, 4.0, 4.5, 4.6 | 4.0, 4.5, 4.6 |
スレッド安全性
パブリック静的メソッドはスレッドセーフですが、インスタンス・メソッドではスレッド安全性は保証されません。
備考
オープン・サーバー・カーソルの数を最小限にするには、OracleRefReader
オブジェクトを明示的に処理する必要があります。
例
// Database Setup /* connect scott/tiger@oracle CREATE OR REPLACE FUNCTION MyFunc(refcur_out OUT SYS_REFCURSOR) RETURN SYS_REFCURSOR IS refcur_ret SYS_REFCURSOR; BEGIN OPEN refcur_ret FOR SELECT * FROM EMP; OPEN refcur_out FOR SELECT * FROM DEPT; RETURN refcur_ret; END MyFunc; / */ // C# using System; using System.Data; using Oracle.DataAccess.Client; using Oracle.DataAccess.Types; class OracleRefCursorSample { static void Main() { // Example demonstrates how to use REF CURSORs returned from // PL/SQL Stored Procedures or Functions // Create the PL/SQL Function MyFunc as defined previously string constr = "User Id=scott;Password=tiger;Data Source=oracle"; OracleConnection con = new OracleConnection(constr); con.Open(); // Create an OracleCommand OracleCommand cmd = new OracleCommand("MyFunc", con); cmd.CommandType = CommandType.StoredProcedure; // Bind the parameters // p1 is the RETURN REF CURSOR bound to SELECT * FROM EMP; OracleParameter p1 = cmd.Parameters.Add("refcur_ret", OracleDbType.RefCursor); p1.Direction = ParameterDirection.ReturnValue; // p2 is the OUT REF CURSOR bound to SELECT * FROM DEPT OracleParameter p2 = cmd.Parameters.Add("refcur_out", OracleDbType.RefCursor); p2.Direction = ParameterDirection.Output; // Execute the command cmd.ExecuteNonQuery(); // Construct an OracleDataReader from the REF CURSOR OracleDataReader reader1 = ((OracleRefCursor)p1.Value).GetDataReader(); // Prints "reader1.GetName(0) = EMPNO" Console.WriteLine("reader1.GetName(0) = " + reader1.GetName(0)); // Construct an OracleDataReader from the REF CURSOR OracleDataReader reader2 = ((OracleRefCursor)p2.Value).GetDataReader(); // Prints "reader2.GetName(0) = DEPTNO" Console.WriteLine("reader2.GetName(0) = " + reader2.GetName(0)); reader1.Close(); reader1.Dispose(); reader2.Close(); reader2.Dispose(); p1.Dispose(); p2.Dispose(); cmd.Dispose(); con.Close(); con.Dispose(); } }
次の表に、OracleRefCursor
メンバーを示します。
OracleRefCursor静的メソッド
OracleRefCursor
静的メソッドを、表13-28にリストします。
OracleRefCursor静的フィールド
OracleRefCursor
静的フィールドを、表13-29にリストします。
OracleRefCursorプロパティ
OracleRefCursor
プロパティを、表13-30にリストします。
表13-30 OracleRefCursorプロパティ
プロパティ | 説明 |
---|---|
|
|
|
|
|
|
|
|
OracleRefCursorインスタンス・メソッド
OracleRefCursor
インスタンス・メソッドを、表13-31にリストします。
OracleRefCursor
静的フィールドを、表13-32にリストします。
OracleRefCursor
プロパティを、表13-34にリストします。
表13-34 OracleRefCursorプロパティ
プロパティ | 説明 |
---|---|
|
|
|
|
|
|
|
|
このプロパティは、REF
CURSOR
データのフェッチに使用されるOracleConnection
を参照します。
宣言
// C# public OracleConnection Connection {get;}
プロパティ値
OracleConnection
。
例外
ObjectDisposedException
- オブジェクトはすでに処理されています。
備考
このプロパティを設定すると、REF
CURSOR
にバインドされます。コンストラクタによってOracleRefCursor
オブジェクトが作成されると、このプロパティは最初はnull
になります。コマンドを実行すると、OracleRefCursor
オブジェクトはREF
CURSOR
にバインドされます。
接続がクローズされるか、または接続プールに返されると、OracleRefCursor
は未初期化状態になり、このオブジェクトからの操作は実行されません。ただし、未初期化のOracleRefCursor
を別のREF
CURSOR
に再割当てすることはできます。
このプロパティは、OracleDataReader
の内部キャッシュのサイズを指定し、結果セットのデータを格納します。
宣言
// C# public long FetchSize {get; set;}
プロパティ値
OracleRefCursor
内部キャッシュのサイズ(バイト)を指定するlong
です。
例外
ArgumentException
- 指定したFetchSize
値は無効です。
備考
デフォルト = 131072
FetchSize
プロパティ値はOracleRefCursor
オブジェクトを作成したOracleCommand
に継承されます。OracleDataReader
オブジェクトのFetchSize
プロパティは、OracleRefCursor
がデータベース・ラウンドトリップごとに内部キャッシュにフェッチするデータ量を定義します。
このプロパティは、REF
CURSOR
のデータのフェッチ方法の制御を提供するため、OracleDataAdapter
を介して、DataSet
またはDataTable
を入力する際に明示的にOracleRefCursor
を使用する場合に有用です。
OracleDataReader
オブジェクトがOracleRefCursor
から作成される場合、作成したOracleDataReader
オブジェクトは、OracleDataReader
オブジェクトのFetchSize
値を継承します。ただし、OracleDataReader
FetchSize
プロパティを設定して、結果セットに対してOracleDataReader
Read
メソッドを最初に呼び出す前に継承した値を設定すると、その値はオーバーライドされます。
RowSize
およびFetchSize
プロパティは、他のスカラー・データ型とは異なる方法でUDTおよびXMLType
データを処理します。ODP.NETの内部キャッシュにはUDTおよびXMLType
データへの参照のみが格納されているため、RowSize
プロパティはUDTおよびXMLType
データの実際のサイズではなく、参照に必要なメモリー(非常に少量)のみを算定します。その結果、アプリケーションは1回のデータベース・ラウンドトリップで多数のUDTまたはXMLType
インスタンスをデータベースからフェッチしてしまう可能性があります。これは、UDTおよびXMLType
データの実際のサイズがFetchSize
に対するものではなく、デフォルトのキャッシュ・サイズである131072バイトを満たすには非常に多くのUDTおよびXMLType
参照が必要となるためです。したがって、UDTまたはXMLType
データをフェッチする際には、フェッチする実際のUDTおよびXMLType
データの総量ではなく、対象UDTおよびXMLType
インスタンスの数を制御するよう、FetchSize
プロパティを適切に構成する必要があります。
注意: LOBおよびLONG
データ型の場合、選択リストの各LOBのキャッシュによって保持されたメタデータおよび参照情報に加えて、InitialLOBFetchSize
およびInitialLONGFetchSize
プロパティで指定されたサイズのみがRowSize
プロパティによって算定されます。
このプロパティは、OracleRefCursor
がNULLかどうかを示します。
宣言
// C# public bool IsNull {get;}
プロパティ値
OracleRefCursor
がnullの値型を表す場合、true
を返します。それ以外の場合はfalse
を戻します。
例外
ObjectDisposedException
- オブジェクトはすでに処理されています。
InvalidOperationException
- OracleConnection
がオープンされていないか、またはオブジェクトの存続中にクローズされています。
このプロパティは、OracleRefcursor
内部キャッシュがデータの1行を保存するために必要とするメモリー量を指定します。
宣言
// C# public long RowSize {get;}
プロパティ値
long
は、OracleRefcursor
が実行された問合せのデータ1行を格納するために必要とするメモリー量(バイト)を示します。
備考
RowSize
プロパティは、OracleRefcursor
オブジェクトが作成されると、ゼロ以外の値に設定されます。このプロパティは、行数に基づいてFetchSize
を設定する場合に、設計時または実行時に動的に使用できます。たとえば、OracleRefcursor
を有効にして、データベース・ラウンドトリップごとにN
行をフェッチするには、OracleRefcursor
FetchSize
プロパティをRowSize
*
N
に動的に設定できます。FetchSize
を適切に有効化するには、OracleDataAdapter
を使用して、DataSet
またはDataTable
を入力してから設定する必要があることに注意してください。
OracleDataReader
がGetDataReader
メソッドを介してOracleRefCursor
から取得される場合、OracleDataReader
には、OracleRefCursor
のFetchSize
値に対するFetchSize
プロパティ・セットが含まれます。
OracleRefCursor
インスタンス・メソッドを、表13-35にリストします。
表13-35 OracleRefCursorインスタンス・メソッド
メソッド | 説明 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
このインスタンス・メソッドは、OracleRefCursor
オブジェクトによって割り当てられたリソースを処理します。
宣言
// C# public void Dispose();
実装
IDisposable
備考
オブジェクトは、処理後は再度使用できません。
Dispose()
が呼び出されると、OracleRefCursor
のオブジェクトは未初期化状態になります。引き続き一部のプロパティにアクセスすることはできますが、その値は信頼できません。リソースが解放されているため、メソッドのコールにより例外が発生することがあります。