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
関連の記事