Poté, co jsem strávil více než den zkoumáním tohoto, byl jsem nasměrován na odpověď pouhých 10 minut po odeslání mé otázky. Typické!
Odpověď byla nalezena zde - https://community.oracle.com/thread/659625 - a vše, co je potřeba, je zabalit volací kód do transakce. Pracovní kód vypadá takto:
using (var connection = new OracleConnection(connstring))
{
connection.Open();
using (var command = connection.CreateCommand())
{
// Start a local transaction
using (var transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
// Assign transaction object for a pending local transaction
command.Transaction = transaction;
command.CommandText = "FNC_AXA_APPTS";
command.CommandType = CommandType.StoredProcedure;
OracleParameter retVal = new OracleParameter("PRS", OracleDbType.RefCursor);
retVal.Direction = ParameterDirection.ReturnValue;
command.Parameters.Add(retVal);
command.Parameters.Add(new OracleParameter("EG_PARAM", OracleDbType.Varchar2, 50)).Value = paramValue;
command.ExecuteNonQuery();
using (OracleDataReader reader = ((OracleRefCursor)command.Parameters["PRS"].Value).GetDataReader())
{
dt.Load(reader);
}
}
}
}
Mé omezené chápání řešení je, že bez toho je transakce potvrzena na konci SQL Serveru, což způsobí, že vrácený kurzor selže ve své iteraci, jakmile je předán kódu .NET. Pokud má někdo lepší vysvětlení, přidejte se k této otázce.