http://www.atmarkit.co.jp/fdb/rensai/odpdotnet01/odpdotnet04.html
REF CURSOR
 REF CURSORは、OracleDataReader、DataSetまたはOracleRefCursorとして取得できます。OracleRefCursorオブジェクトとして取得されたREF CURSORは、OracleDataReaderの作成またはREF CURSORからDataSetへの移入に使用できます。REF CURSORにアクセスする際は、必ずOracleDbType.RefCursorとしてバインドします。以下にストアドプロシージャからREF CURSORを取得する方法、および DataGridオブジェクトに情報を表示する方法を説明します。
REF CURSORを使用したパッケージの作成
CREATE OR REPLACE PACKAGE SCOTT.pkg_ref AS
  CURSOR c1 IS SELECT * FROM emp;
  CURSOR c2 IS SELECT * FROM dept;
  TYPE empCur IS REF CURSOR RETURN c1%ROWTYPE;
  TYPE deptCur IS REF CURSOR RETURN c2%ROWTYPE;
  PROCEDURE GetEmpDeptData(
    EmpCursor in out empCur,
    DeptCursor in out deptCur
   );
END; 
リスト18 REF CURSORを使用したパッケージ 
CREATE OR REPLACE PACKAGE BODY SCOTT.pkg_ref AS
  PROCEDURE GetEmpDeptData(
    EmpCursor in out empCur,
    DeptCursor in out deptCur) IS
      BEGIN
        OPEN EmpCursor FOR SELECT * FROM emp;
        OPEN DeptCursor FOR SELECT * FROM dept;
      END GetEmpDeptData;
END pkg_ref; 
リスト19 REF CURSORを使用したパッケージ本体 
ストアドプロシージャからREF CURSORを取得しDataGridオブジェクトに結果を表示するコードは以下のようになります。
Dim cmd As New OracleCommand("pkg_ref.GetEmpDeptData", cnn)
cmd.CommandType = CommandType.StoredProcedure
'REF CURSORパラメータのバインド
cmd.Parameters.Add("EmpCursor", _
OracleDbType.RefCursor, ParameterDirection.Output)
cmd.Parameters.Add("DeptCursor", _
OracleDbType.RefCursor, ParameterDirection.Output)
'SQL文の実行とRef Cursorの使用
Dim dsData As New DataSet
Dim da As New OracleDataAdapter(cmd)
da.Fill(dsData, "data")
'DataGridへ表示
DataGridEmp.SetDataBinding(dsData, "data")
DataGridDept.SetDataBinding(dsData, "data1") 
リスト20 REF CURSORを取得しDataGridオブジェクトに結果を表示(VB.NET) 
OracleCommand cmd = 
  new OracleCommand("pkg_ref.GetEmpDeptData", cnn);
cmd.CommandType = CommandType.StoredProcedure;
//REF CURSORパラメータのバインド
cmd.Parameters.Add("EmpCursor", 
  OracleDbType.RefCursor, ParameterDirection.Output);
cmd.Parameters.Add("DeptCursor", 
  OracleDbType.RefCursor, ParameterDirection.Output);
//SQL文の実行とRef Cursorの使用
DataSet dsData = new DataSet();
OracleDataAdapter da = new OracleDataAdapter(cmd);
da.Fill(dsData, "data");
//DataGridへ表示
dataGridEmp.SetDataBinding(dsData, "data");
dataGridDept.SetDataBinding(dsData, "data1"); 
リスト21 REF CURSORを取得しDataGridオブジェクトに結果を表示(C#) 
 上記のサンプルコードでは、REF CURSORからDataSetへデータを格納していますが、OracleRefCursorオブジェクトからOracleDataReaderオブジェクトへ格納することも可能です。
Dim cmd As New OracleCommand("pkg_ref.GetEmpDeptData", cnn)
cmd.CommandType = CommandType.StoredProcedure
'REF CURSORパラメータのバインド
cmd.Parameters.Add("EmpCursor", OracleDbType.RefCursor, _
ParameterDirection.Output)
cmd.Parameters.Add("DeptCursor", OracleDbType.RefCursor, _
ParameterDirection.Output)
cmd.ExecuteNonQuery()
'SQL文の実行とREF CURSORの使用
Dim dr1 As OracleDataReader = _
CType(cmd.Parameters(0).Value, OracleRefCursor).GetDataReader
Dim dr2 As OracleDataReader = _
CType(cmd.Parameters(1).Value, OracleRefCursor).GetDataReader 
リスト22 REF CURSORを取得しOracleDataReaderへ結果を格納(VB.NET) 
OracleCommand cmd = 
  new OracleCommand("pkg_ref.GetEmpDeptData", cnn);
cmd.CommandType = CommandType.StoredProcedure;
//REF CURSORパラメータのバインド
cmd.Parameters.Add("EmpCursor", OracleDbType.RefCursor, 
  ParameterDirection.Output);
cmd.Parameters.Add("DeptCursor", OracleDbType.RefCursor, 
  ParameterDirection.Output);
cmd.ExecuteNonQuery();
//SQL文の実行とREF CURSORの使用
OracleRefCursor cur1 = 
  (OracleRefCursor)cmd.Parameters[0].Value;
OracleRefCursor cur2 = 
  (OracleRefCursor)cmd.Parameters[1].Value;
OracleDataReader dr1 = cur1.GetDataReader();
OracleDataReader dr2 = cur2.GetDataReader(); 
リスト23 REF CURSORを取得しOracleDataReaderへ結果を格納(C#)
 
댓글 없음:
새 댓글을 작성할 수 없습니다.