あなたは確かにできます。注意すべきいくつかの落とし穴がありますが、ここにテストケースがあります
create or replace function testodpRefCursor(
uniqueId IN NUMBER
,resultItems OUT NOCOPY SYS_REFCURSOR) RETURN NUMBER
IS
BEGIN
OPEN resultItems for select level from dual connect by level < uniqueId ;
return 1;
END testodpRefCursor;
- 関数は、ReturnValueを最初のとして持つのが好きだとわかりました。 コレクションのパラミン
- BindByNameはデフォルトでFALSEであるため、デフォルトでBIND BY POSITION になります。
それ以外の場合は非常に簡単です:
OracleCommand cmd = new OracleCommand("TESTODPREFCURSOR", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.BindByName = true;
// Bind
OracleParameter oparam = cmd.Parameters.Add("ReturnValue", OracleDbType.Int64);
oparam.Direction = ParameterDirection.ReturnValue ;
OracleParameter oparam0 = cmd.Parameters.Add("uniqueId", OracleDbType.Int64);
oparam0.Value = 5 ;
oparam0.Direction = ParameterDirection.Input;
OracleParameter oparam1 = cmd.Parameters.Add("resultItems", OracleDbType.RefCursor);
oparam1.Direction = ParameterDirection.Output;
// Execute command
OracleDataReader reader;
try
{
reader = cmd.ExecuteReader();
while(reader.Read() ){
Console.WriteLine("level: {0}", reader.GetDecimal(0));
}
} ...
その他のサンプルについては、Oracleホームディレクトリに移動し、ODP.NETのRefカーソルサンプルを参照してください
例:%oracle client home%\ odp.net \ samples \ 4 \ RefCursor
hth