VB.NETとPLSQLのselectで複数件取得するサンプルです。
PLSQLでREF CURSORを使用します。
(確認環境:Microsoft Visual Studio Community 2019,Oracle Express Edition 11g)
目次
サンプル | PLSQL |
VB.NETのコード |
PLSQL
PLSQLの仕様部
CREATE OR REPLACE PACKAGE TEST_employee_INFO
IS
/*
* REF CURSORのテスト用
*/
TYPE CURSOR IS REF CURSOR;
PROCEDURE GET_employee_INFO(
ID1 IN number,
CURSOR1 OUT CURSOR
);
END;
一つの引数を受け取り、REF CURSORで複数の値を返します。
9行目は、number型でINです。
10行目は、CURSOR型でOUTです。
PLSQLの本体部
CREATE OR REPLACE PACKAGE BODY TEST_employee_INFO
IS
/*
* REF CURSORのテスト用
*/
PROCEDURE GET_employee_INFO
(
ID1 IN number,
CURSOR1 OUT CURSOR
)
IS
BEGIN
OPEN CURSOR1 FOR
select id,name,romaji from employee
-- where ID = ID1
order by id;
END;
END;
14行目のSQLの実行結果が13行目のCURSOR1にセットされます。
9行目でCURSOR1はOUTなので結果を返します。
15行目の条件をコメントにしているので全件返します。
コメントを外せば指定したIDのデータのみ返します。
カーソルのcloseは入れていません。入れるとVB側で値を取得できなくなります。
以下は、Oracleのカーソル変数の宣言のリンクです。
https://docs.oracle.com/cd/E57425_01/121/LNPLS/cursor_variable.htm
VB.NETのコード
Imports Oracle.ManagedDataAccess.Client
Module Module1
Sub Main()
Dim list1 As New List(Of String)
Try
Using conn As New OracleConnection()
conn.ConnectionString =
"User Id=hr;Password=hr;Data Source=localhost/XE;"
conn.Open()
Using cmd = New OracleCommand()
cmd.Connection = conn
cmd.CommandText = "TEST_employee_INFO.GET_employee_INFO"
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add(New OracleParameter(
"ID1", OracleDbType.Int32)).Value = 2
cmd.Parameters.Add(New OracleParameter(
"CURSOR1", OracleDbType.RefCursor)
).Direction = ParameterDirection.Output
Using reader = cmd.ExecuteReader()
While (reader.Read())
list1.Add(reader.GetString(1))
End While
End Using
End Using
End Using
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
For Each b In list1
Console.WriteLine(b) '
Next
End Sub
End Module
8,9行目は、接続情報です。User Idとパスワードとデータソースを指定しています。
10行目は接続です。
13,14行目は接続先のPLSQLを指定しています。
16行目は、送信する値です。数値の2を指定しています。
18目は、受信する値です。OracleDbTypeとしてRefCursorを指定しています。
21行目のExecuteReaderメソッドで実行しています。
28行目は、例外が発生したときにcatchされて実行されます。
31行目は、取得した値を表示します。
以下は、MicrosoftのREF CURSOR の例のリンクです。
https://docs.microsoft.com/ja-jp/dotnet/framework/data/adonet/ref-cursor-examples
関連の記事