ODP.NETファーストステップ(1)

ODP.NETでOracle固有の機能を活用する Page 4

日本オラクル
大田 浩
2004/11/27

SQLステートメントの実行

 Oracleデータベースに対してSQLステートメントまたはストアドプロシージャを実行するにはOracleCommandオブジェクトを使用します。OracleCommandオブジェクトの主なメソッドはOTNの「Oracle Data Provider for .NET開発者ガイド」で詳細に説明してありますので、そちらを参照してください。

 OracleCommandでは、Parametersプロパティによって名前付きパラメータを利用できます。

cmd.CommandText = _
"insert into emp(empno,ename) values(:empno,:ename)"
cmd.BindByName = True
Dim pEmpno As OracleParameter = _
cmd.Parameters.Add("empno", 100)
Dim pEname As OracleParameter = _
cmd.Parameters.Add("ename", "steve")
cmd.ExecuteNonQuery()
リスト14 Parametersプロパティによって名前付きパラメータを利用(VB.NET)

cmd.CommandText = 
  "insert into emp(empno,ename) values(:empno,:ename)";
cmd.BindByName = true;
OracleParameter pEmpno = 
  cmd.Parameters.Add("empno", 100);
OracleParameter pEname = 
  cmd.Parameters.Add("ename", "steve");
cmd.ExecuteNonQuery();
リスト15 Parametersプロパティによって名前付きパラメータを利用(C#)

 ODP.NETでのパラメータの指定方法には以下の2つの方法があります。

  • 位置パラメータ(デフォルト)
    位置パラメータを使用する場合は、OracleParameterオブジェクトの追加順をSQLで指定されたパラメータ順にする必要があります。SQLで指定されたパラメータ名とOracleParameterで指定するパラメータ名が同一である必要はありません。
     
  • 名前指定パラメータ
    名前指定パラメータとは、上記のサンプルソースのように、「cmd.BindByName = True」とOracleCommandオブジェクトのBindByNameプロパティをTrueに設定します。名前指定パラメータの場合はOracleParameterオブジェクトの追加順は引数順にする必要はありませんが、パラメータ名とOracleParameterで指定するパラメータ名が同一である必要があります。

 OracleCommandオブジェクトでは、ODP.NET固有の以下の機能をサポートしています。

PL/SQL配列のサポート

 ODP.NETは、PL/SQL配列(以前はPL/SQL表と呼ばれていました)のバインドをサポートします。

配列バインド

 配列バインド機能により、アプリケーションはOracleParameterクラスを使用して型の配列をバインドできます。配列バインド機能を使用すると、アプリケーションは1回のデータベース・ラウンドトリップで複数の行を表に挿入できます。以下のサンプルコードでは、deptテーブルに対して1回のSQLの実行で3行を一度にInsertしています。

Dim myArrayDeptNo() As Integer = {10, 20, 30}
cmd.CommandText = _
"insert into dept(deptno) values (:deptno)"
cmd.ArrayBindCount = 3
Dim prm As OracleParameter = _
New OracleParameter("deptno", OracleDbType.Int32)
prm.Direction = ParameterDirection.Input
prm.Value = myArrayDeptNo
cmd.Parameters.Add(prm)
cmd.ExecuteNonQuery()
リスト16 配列バインドを使用したサンプルコード(VB.NET)

int[] myArrayDeptNo = new int[3]{10, 20, 30};
cmd.CommandText = 
  "insert into dept(deptno) values (:deptno)";
cmd.ArrayBindCount = 3;
OracleParameter prm = 
  new OracleParameter("deptno", OracleDbType.Int32);
prm.Direction = ParameterDirection.Input;
prm.Value     = myArrayDeptNo;
cmd.Parameters.Add(prm);
cmd.ExecuteNonQuery();
リスト17 配列バインドを使用したサンプルコード(C#)

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#)

 以上、今回はODP.NETのインストールからOracleへの接続/SQLの発行まで説明しました。次回はASP.NETでODP.NETの機能を最大限に引き出すコーディングテクニックを説明します。どうぞご期待ください。(次回へ続く)

4/4  

 Index
連載:ODP.NETファーストステップ(1)
ODP.NETでOracle固有の機能を活用する
  Page 1
・ODP.NETを使うメリットとは?
・ODP.NETのインストールと設定
  Page 2
・Oracleへの接続
・tnsnames.oraファイルの設定
  Page 3
・OracleConnection固有の機能
Page 4
・SQLステートメントの実行


ODP.NETファーストステップ

TechTargetジャパン

Database Expert フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH