Nachdem ich über einen Tag damit verbracht hatte, dies zu untersuchen, wurde ich nur 10 Minuten nach dem Posten meiner Frage zur Antwort weitergeleitet. Typisch!
Die Antwort wurde hier gefunden - https://community.oracle.com/thread/659625 - und alles, was erforderlich ist, ist, den aufrufenden Code in eine Transaktion einzuschließen. Arbeitscode sieht so aus:
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);
}
}
}
}
Mein begrenztes Verständnis der Lösung ist, dass ohne dies eine Transaktion am SQL Server-Ende festgeschrieben wird, was dazu führt, dass der zurückgegebene Cursor in seiner Iteration fehlschlägt, sobald er an den .NET-Code übergeben wurde. Wenn jemand eine bessere Erklärung hat, ergänzen Sie diese Frage bitte.