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