Oracle® Data Provider for .NET開発者ガイド ODAC 12c リリース4 (12.1.0.2) for Microsoft Windows E72575-01 |
|
前 |
次 |
REF
CURSOR
は、Oracle PL/SQL言語でのデータ型です。Oracle Database内のカーソルまたは結果セットを表します。OracleRefCursor
オブジェクトは、REF
CURSOR
型に対応するODP.NETタイプです。
この項では、REF
CURSOR
データ型およびOracleRefCursor
オブジェクトを使用する際の次の点について説明します。
OracleRefCursor
オブジェクトにはコンストラクタがありません。PL/SQLストアド・プロシージャ、ストアド・ファンクションまたは無名ブロックからパラメータ値として取得できるのみです。
OracleRefCursor
オブジェクトは接続されたオブジェクトです。OracleRefCursor
オブジェクトを戻すコマンドの実行に使用される接続が、コマンドの存続期間にわたり必要になります。OracleRefCursor
に関連付けられている接続がクローズされると、OracleRefCursor
オブジェクトは使用できなくなります。
REF
CURSOR
データ型は、OracleDataReader
、DataSet
またはOracleRefCursor
オブジェクトとして取得できます。REF
CURSOR
データ型をOracleRefCursor
オブジェクトとして取得する場合は、OracleDataReader
オブジェクトの作成またはDataSet
への移入に使用できます。REF
CURSOR
データ型にアクセスするときは、常にOracleDbType.RefCursor
パラメータとしてバインドする必要があります。
REF
CURSOR
データ型は、OracleCommand
オブジェクトのExecuteReader
メソッドを呼び出すことでOracleDataReader
として取得できます。OracleDbType
プロパティが設定された出力パラメータは、OracleDbType.RefCursor
にバインドされます。タイプOracleDbType.RefCursor
の出力パラメータは、ExecuteReader
メソッドが起動された後は移入されません。
複数の出力REF
CURSOR
パラメータがある場合、次のREF
CURSOR
データ型にアクセスするにはOracleDataReader
オブジェクトのNextResult
メソッドを使用します。OracleDataReader
のNextResult
メソッドは、REF
CURSOR
データ型に対して順次アクセスを提供します。一時点でアクセスできるREF
CURSOR
データ型は1つのみです。
対応するREF
CURSOR
データ型に対してOracleDataReader
オブジェクトが作成される順序は、パラメータがバインドされている順序に依存します。PL/SQLストアド・ファンクションがREF
CURSOR
データ型を戻した場合は、これが最初のOracleDataReader
オブジェクトになり、出力されるすべてのREF
CURSOR
データ型はパラメータがバインドされている順序に従います。
Fill
メソッドによりDataSet
に正しく移入するには、OracleDataAdapter
のSelectCommand
プロパティをタイプOracleDbType.RefCursor
の出力パラメータにバインドする必要があります。Fill
メソッドが正常に実行されると、REF
CURSOR
データ型を表すDataTable
がDataSet
に移入されます。
コマンドの実行で複数のREF
CURSOR
データ型が戻されると、DataSet
には複数のDataTable
オブジェクトが移入されます。
Oracle Data Provider for .NETリリース11.1.0.6.20では、DataTable
に移入されるREF
CURSOR
を識別するため、拡張プロパティのREFCursorName
がDataTable
に導入されています。
このプロパティは、DataSet
に複数のREF
CURSOR
(その中の1つ以上がNULL
)が移入されている場合に特に便利です。たとえば、3つのREF
CURSOR
を戻すストアド・プロシージャを実行してDataSet
が移入され、2番目のREF
CURSOR
がNULL
である場合、1番目のDataTable
に対するREFCursorName
プロパティ値はREFCursor
で、2番目のDataTable
に対する値はREFCursor2
です。NULL
REF
CURSOR
に対してDataTable
は移入されません。
1つ以上のREF
CURSOR
データ型を戻すコマンドに対してExecuteNonQuery
が起動されると、OracleDbType.RefCursor
としてバインドされている各OracleCommand
パラメータはOracleRefCursor
オブジェクトへの参照を取得します。
OracleRefCursor
オブジェクトからOracleDataReader
オブジェクトを作成するには、OracleRefCursor
オブジェクトからGetDataReader
メソッドを起動します。後続のGetDataReader
メソッドへのコールでは、同一のOracleDataReader
オブジェクトへの参照が戻されます。
DataSet
にOracleRefCursor
オブジェクトを移入するには、OracleRefCursor
オブジェクトを取るOracleDataAdapter
クラスのFill
メソッドをアプリケーションで起動できます。OracleDataReader
オブジェクトと同じく、OracleRefCursor
オブジェクトも順方向専用です。したがって、OracleRefCursor
オブジェクトから行が読み取られると、問合せから再度移入されないかぎり、同じ行は取得できません。
コマンドの実行で複数のREF
CURSOR
データ型がOracleRefCursor
オブジェクトとして戻される場合、アプリケーションではOracleDataReader
オブジェクトを作成するか、特定のOracleRefCursor
オブジェクトをDataSet
に移入するかを選択できます。OracleRefCursor
オブジェクトから作成されるOracleDataReader
オブジェクトまたはDataSet
オブジェクトはすべて同時にアクティブになり、任意の順序でアクセスできます。
REF
CURSOR
型は更新不可能です。ただし、DataSet
から取り出したデータは更新できます。このため、OracleDataAdapter
クラスには、REF
CURSOR
データの更新をすべてデータベースにフラッシュするカスタムSQL文が必要になります。
REF
CURSOR
の更新のためのSQLの生成にOracleCommandBuilder
オブジェクトを使用することはできません。
次のいずれかの場合、ExecuteScalar
メソッドは、REF
CURSOR
の最初の行の最初の列の値を戻します。
ストアド・ファンクション実行の戻り値
ストアド・プロシージャ実行の最初のバインド・パラメータ
関連項目: 詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照 |
アプリケーションは、PL/SQLのストアド・プロシージャまたはファンクションからREF
CURSOR
タイプを取り出して、別のストアド・プロシージャまたはファンクションに渡すことができます。この機能は、ストアド・プロシージャまたはファンクションが.NETアプリケーションにREF
CURSOR
タイプを戻し、アプリケーションがそのロジックに応じて別のストアド・プロシージャまたは処理にこのREF
CURSOR
を渡す場合に便利です。.NETアプリケーション内のREF
CURSOR
タイプからデータを取り出す場合、そのデータを別のストアド・プロシージャに戻すことはできないので注意してください。
次の例では、REF
CURSOR
の引渡しを示しています。
/* connect scott/tiger@oracle create table test (col1 number); insert into test(col1) values (1); commit; create or replace package testPkg as type empCur is REF Cursor; end testPkg; / create or replace procedure testSP(param1 IN testPkg.empCur, param2 OUT NUMBER) as begin FETCH param1 into param2; end; / */ // C# using System; using Oracle.DataAccess.Client; using System.Data; class InRefCursorParameterSample { static void Main() { OracleConnection conn = new OracleConnection ("User Id=scott; Password=tiger; Data Source=oracle"); conn.Open(); // Open the connection to the database // Command text for getting the REF Cursor as OUT parameter String cmdTxt1 = "begin open :1 for select col1 from test; end;"; // Command text to pass the REF Cursor as IN parameter String cmdTxt2 = "begin testSP (:1, :2); end;"; // Create the command object for executing cmdTxt1 and cmdTxt2 OracleCommand cmd = new OracleCommand(cmdTxt1, conn); // Bind the Ref cursor to the PL/SQL stored procedure OracleParameter outRefPrm = cmd.Parameters.Add("outRefPrm", OracleDbType.RefCursor, DBNull.Value, ParameterDirection.Output); cmd.ExecuteNonQuery(); // Execute the anonymous PL/SQL block // Reset the command object to execute another anonymous PL/SQL block cmd.Parameters.Clear(); cmd.CommandText = cmdTxt2; // REF Cursor obtained from previous execution is passed to this // procedure as IN parameter OracleParameter inRefPrm = cmd.Parameters.Add("inRefPrm", OracleDbType.RefCursor, outRefPrm.Value, ParameterDirection.Input); // Bind another Number parameter to get the REF Cursor column value OracleParameter outNumPrm = cmd.Parameters.Add("outNumPrm", OracleDbType.Int32, DBNull.Value, ParameterDirection.Output); cmd.ExecuteNonQuery(); //Execute the stored procedure // Display the out parameter value Console.WriteLine("out parameter is: " + outNumPrm.Value.ToString()); } }