OracleRefCursorオブジェクトは、Oracle REF CURSORを表します。
クラスの継承
System.Object
System.MarshalRefByObject
Oracle.DataAccess.Types.OracleRefCursor
宣言
// C# public sealed class OracleRefCursor : MarshalByRefObject, IDisposable, INullable
スレッド安全性
パブリック静的メソッドはスレッドセーフですが、インスタンス・メソッドではスレッド安全性は保証されません。
備考
オープン・サーバー・カーソルの数を最小限にするには、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();
}
}
要件
ネームスペース: Oracle.DataAccess.Types
アセンブリ: Oracle.DataAccess.dll
Microsoft .NET Frameworkバージョン1.0以降
次の表に、OracleRefCursorメンバーを示します。
OracleRefCursor静的メソッド
OracleRefCursor静的メソッドを、表11-28にリストします。
OracleRefCursorプロパティ
OracleRefCursorプロパティを、表11-29にリストします。
表11-29 OracleRefCursorプロパティ
| プロパティ | 説明 |
|---|---|
|
|
|
|
|
|
|
|
|
OracleRefCursorインスタンス・メソッド
OracleRefCursorインスタンス・メソッドを、表11-30にリストします。
表11-30 OracleRefCursorインスタンス・メソッド
| メソッド | 説明 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
OracleRefCursor静的メソッドを、表11-31にリストします。
OracleRefCursorプロパティを、表11-32にリストします。
表11-32 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値は無効です。
備考
デフォルト = 65536。
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データの実際のサイズではなく、参照に必要なメモリー(非常に少量)のみ算定します。UDTおよびXMLTypeデータの実際のサイズはFetchSizeに対するものではないため、アプリケーションは大量のUDTまたはXMLTypeインスタンスを1回のデータベース・ラウンドトリップからフェッチする可能性があり、これにはデフォルトのキャッシュ・サイズの64Kを満たすほどの大量のUDTおよびXMLType参照が必要となります。このため、UDTまたはXMLTypeデータをフェッチする際には、フェッチする実際のUDTおよびXMLTypeデータの総量ではなく、対象UDTおよびXMLTypeインスタンスの数を制御するよう、FetchSizeプロパティを適切に構成する必要があります
注意: LOBおよびLONGデータ型の場合、選択リストの各LOBのキャッシュによって保持されたメタデータおよび参照情報に加えて、InitialLOBFetchSizeおよびInitialLONGFetchSizeプロパティで指定されたサイズのみがRowSizeプロパティによって算定されます。
このプロパティは、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インスタンス・メソッドを、表11-33にリストします。
表11-33 OracleRefCursorインスタンス・メソッド
| メソッド | 説明 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
このインスタンス・メソッドは、OracleRefCursorオブジェクトによって割り当てられたリソースを処理します。
宣言
// C# public void Dispose();
実装
IDisposable
備考
オブジェクトは、処理後は再度使用できません。
Dispose()が呼び出されると、OracleRefCursorのオブジェクトは未初期化状態になります。引き続き一部のプロパティにアクセスすることはできますが、その値は信頼できません。リソースが解放されているため、メソッドのコールにより例外が発生することがあります。
このインスタンス・メソッドは、REF CURSORのOracleDataReaderオブジェクトを戻します。
宣言
// C# public OracleDataReader GetDataReader();
戻り値
OracleDataReader
備考
OracleDataReaderを使用すると、REF CURSORから行をフェッチできます。