Đã dành hơn một ngày để điều tra điều này, tôi đã được đưa đến câu trả lời chỉ 10 phút sau khi đăng câu hỏi của mình. Điển hình!
Câu trả lời được tìm thấy ở đây - https://community.oracle.com/thread/659625 - và tất cả những gì cần thiết là bọc mã gọi điện trong một giao dịch. Mã làm việc trông giống như sau:
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);
}
}
}
}
Sự hiểu biết hạn chế của tôi về giải pháp là nếu không có điều này, một giao dịch được cam kết ở cuối SQL Server, điều này khiến con trỏ trả về không thành công trong quá trình lặp lại sau khi được chuyển tới mã .NET. Nếu ai có lời giải thích tốt hơn, vui lòng thêm vào câu hỏi này.