Dat kan je zeker. Er zijn een paar valkuilen waar je op moet letten, maar hier is een 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;
- Ik heb ontdekt dat functies de ReturnValue graag als DE EERSTE hebben paramin de collectie
- BindByName is standaard FALSE, dus het is standaard BIND BY POSITION
Anders is het vrij eenvoudig:
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));
}
} ...
Ga nu voor meer voorbeelden naar uw Oracle Home-directory en kijk @ de Ref-cursorvoorbeelden in ODP.NET
bijvoorbeeld:%oracle client home%\odp.net\samples\4\RefCursor
hde