VB.NET PLSQLのselectで複数件取得する

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

関連の記事

VB.NET Oracleに接続してselectするサンプル

△上に戻る