C# PLSQLのselectで複数件取得する

C#とPLSQLのselectで複数件取得するサンプルです。
PLSQLでREF CURSORを使用します。

確認環境
・Microsoft Visual Studio Community 2019
・Oracle Express Edition 11g Release 2
・Oracle.ManagedDataAccess 19.5.0

目次

サンプル PLSQL
  C#のコード

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;

一つの引数を受け取り、REF CURSORで複数の値を返します。
9行目は、number型でINです。
10行目は、CURSOR型でOUTです。

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側で値を取得できなくなります。

以下は、Oracleのカーソル変数の宣言のリンクです。
https://docs.oracle.com/cd/E57425_01/121/LNPLS/cursor_variable.htm

C#のコード

using System;
using System.Data;
using Oracle.ManagedDataAccess.Client;
using System.Collections.Generic;

class Test1
{
	static void Main()
	{
		var list1 = new List<string>();
		try
		{
			using (OracleConnection conn = new OracleConnection())
			{
				conn.ConnectionString =
					"User ID=hr; Password=hr; Data Source=localhost/XE";
				conn.Open();
				using (OracleCommand cmd = new OracleCommand())
				{
					cmd.Connection = conn;
					cmd.CommandText = "TEST_SYAIN_INFO.GET_SYAIN_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 (OracleDataReader reader = cmd.ExecuteReader())
					{
						while (reader.Read())
						{
							list1.Add(reader.GetString(1));
						}
					}
				}
			}
		}
		catch (Exception ex)
		{
			Console.WriteLine(ex.Message.ToString());
		}
		foreach (var c1 in list1)
		{
			Console.WriteLine(c1);//
		}
	}
}

15,16行目は、接続情報です。User IDとパスワードとデータソースを指定しています。
11行目は接続です。
21行目は接続先のPLSQLを指定しています。
23行目は、送信する値です。数値の2を指定しています。
25行目は、受信する値です。OracleDbTypeとしてRefCursorを指定しています。
29行目のExecuteReaderメソッドで実行しています。
39行目は、例外が発生したときにcatchされて実行されます。
43行目のforeach文で取得した値を表示します。

以下は、MicrosoftのREF CURSOR の例のリンクです。
https://docs.microsoft.com/ja-jp/dotnet/framework/data/adonet/ref-cursor-examples

関連の記事

C# Oracleに接続してselectするサンプル

△上に戻る