- PR -

VB.NETでストアドプロシージャの戻り値を取得したい

1
投稿者投稿内容
しっぽ。
会議室デビュー日: 2005/08/14
投稿数: 5
投稿日時: 2005-08-14 04:01
初めて投稿させていただきます。
動作環境
Win2000,Oracle10g,VS.NET2002(VB.NET)
やりたいこと
ODPを使って、Oracleのストアドプロシージャを実行し戻り値(複数行)をデータセットに格納しデータグリッドへ表示する。

******************************************************************************
'ORACLEへの接続を作成
Dim conn As New OracleConnection("user id=ユーザ名; password =パスワード;data source=データソース")
'SQLコマンドを定義
Dim cmd As New OracleCommand("パッケージ名.プロシージャ名", conn)
'データアダプタを作成
Dim da As New OracleDataAdapter()
'データセットを作成
Dim ds As New DataSet("dsList")
'データテーブルをデータセットに追加
Dim dt As DataTable = ds.Tables.Add("dtList")
'データテーブルの設定(カラムを追加)
Dim pkCol As DataColumn = dt.Columns.Add("a_a", Type.GetType"System.Int32"))
dt.Columns.Add("b_b", Type.GetType("System.Int32"))
dt.Columns.Add("c_c", Type.GetType("System.String"))
dt.Columns.Add("d_d", Type.GetType("System.String"))
'プライマリキーの設定
dt.PrimaryKey = New DataColumn() {pkCol}

Dim outA As OracleParameter = cmd.Parameters.Add("A", _
OracleDbType.Varchar2, ParameterDirection.Output)
outA.Size = 5
Dim outB As OracleParameter = cmd.Parameters.Add("B", _
OracleDbType.Int32, ParameterDirection.Output)
outB.Size = 4
Dim outC As OracleParameter = cmd.Parameters.Add("C", _
OracleDbType.Varchar2, ParameterDirection.Output)
outC.Size = 80
Dim outD As OracleParameter = cmd.Parameters.Add("D", _
OracleDbType.Varchar2, ParameterDirection.Output)
outD.Size = 20

'コマンドタイプを宣言
cmd.CommandType = CommandType.StoredProcedure

'接続をオープン
conn.Open()
Dim dr As OracleDataReader = cmd.ExecuteReader
dr.Read()
'データをデータセットへ格納
Dim i, count As Integer
count = 0
Do While dr.Read()
For i = 0 To dr.FieldCount - 1
Console.Write(dr(i) & " ")
Next
Console.WriteLine()
count += 1
Loop
MessageBox.Show(count & "レコードです。")
'接続をクローズ
conn.Close()
'データグリッドへ表示
Me.DataGrid.DataSource = ds.Tables("dtList")
******************************************************************************
コンパイルは正常終了し、グリッドには何も表示されません。
countの結果として0が表示されます。
PL/SQL側はOUTとして値をはきだしている様です。

OTNやMSDN等を参考にしてつぎはぎでここまで作成しましたが、VB.NETもPL/SQLも初めてなのでどこが悪いのかさっぱり分かりません。
どうぞご教授願います。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-08-14 05:34
1. OUTPUT パラメータの内容は、(REF CURSOR を出力した場合を除き) ExecuteReader では取得できません。

2. 値を設定していない DataTable には、値は入っていません。
なんらかの方法で値を取得した後、DataTable に追加してください。

Oracle の ストアド プロシージャからの結果がほしいときは、
1. 単一あるいは一組の値が欲しい場合
OracleCommand 側に出力パラメータを追加し、ExecuteNonQuery() を実行した後にパラメータの値を取得することになります。

2. 結果セットが欲しい場合
ストアド プロシージャに REF CURSOR 型(を用いた TYPE) の 出力パラメータを作成します。これにより、ADO.NET 側では結果セットを受け取ることになるため、ExecuteReader() や DataSet.SelectCommand の設定対象となります。

となります。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-08-14 05:36
ちなみにこのへん。

ODP.NETでOracle固有の機能を活用する
しっぽ。
会議室デビュー日: 2005/08/14
投稿数: 5
投稿日時: 2005-08-16 23:21
にしざきさん早々の返信ありがとうございます。
無事解決しました。
プロシージャ側はREF CURSORをOUTする事で解決です。
CREATE OR REPLACE PACKAGE パッケージ名 IS
TYPE tempCursor IS REF CURSOR;
プロシージャ名(cursor OUT tempCursor);
END;
CREATE OR REPLACE PACKAGE BODY パッケージ名 IS
プロシージャ名(cursor OUT tempCursor) IS
BEGIN
OPEN cursor FOR
SELECT a_a,b_b,c_c,d_d FROM テーブル名;
END;
END;
こんな感じです。
vb.net側は
Dim cmd As New OracleCommand("パッケージ名.プロシージャ名", conn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("cursor", OracleDbType.RefCursor, ParameterDirection.Output)
Dim da As New OracleDataAdapter(cmd)
da.Fill(ds, "test")
こんな感じで値を取得できました。
まだまだやりたいことは遠いですが、これでかなり進めます。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)