Na meer dan een dag te hebben besteed aan het onderzoeken hiervan, werd ik slechts 10 minuten na het plaatsen van mijn vraag naar het antwoord geleid. Typisch!
Het antwoord is hier gevonden - https://community.oracle.com/thread/659625 - en het enige dat nodig is, is de oproepcode in een transactie te verpakken. Werkcode ziet er als volgt uit:
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);
}
}
}
}
Mijn beperkte begrip van de oplossing is dat zonder dit een transactie wordt gepleegd aan het einde van de SQL Server, waardoor de geretourneerde cursor faalt in zijn iteratie zodra deze is doorgegeven aan de .NET-code. Als iemand een betere uitleg heeft, voeg deze vraag dan toe.