Det kan du sikkert. Der er et par ting at være på vagt over for, men her er en testcase
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;
- Jeg har fundet ud af, at funktioner kan lide at have returværdien som DEN FØRSTE paraminere samlingen
- BindByName er som standard FALSE, så det er som standard BIND BY POSITION
Ellers er det ret ligetil:
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));
}
} ...
Gå nu til din Oracle Home-mappe for at få flere eksempler og se @ Ref cursor-eksemplerne i ODP.NET
for eksempel:%oracle-klienthjem%\odp.net\samples\4\RefCursor
hth