Sie können sicher. Es gibt ein paar Fallstricke, vor denen Sie sich in Acht nehmen sollten, aber hier ist ein Testfall
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;
- Ich habe festgestellt, dass Funktionen gerne den Rückgabewert als DEN ERSTEN haben paraminiere die Sammlung
- BindByName ist standardmäßig FALSE, also standardmäßig BIND BY POSITION
Ansonsten ist es ganz einfach:
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));
}
} ...
Weitere Beispiele finden Sie in Ihrem Oracle-Home-Verzeichnis und sehen Sie sich @ die Ref-Cursor-Beispiele in ODP.NET
anzum Beispiel:%oracle client home%\odp.net\samples\4\RefCursor
hth