sql >> Base de Datos >  >> RDS >> Oracle

Error al recuperar la tabla de retorno fuera de secuencia de la función de Oracle en C# donde la función usa dblink para SQL Server

Habiendo pasado más de un día investigando esto, me dirigieron a la respuesta solo 10 minutos después de publicar mi pregunta. ¡Típico!

La respuesta se encontró aquí:https://community.oracle.com/thread/659625 - y todo lo que se requiere es envolver el código de llamada en una transacción. El código de trabajo se ve así:

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);
            }
        }
    }
}

Mi comprensión limitada de la solución es que, sin esto, se confirma una transacción en el extremo de SQL Server, lo que hace que el cursor devuelto falle en su iteración una vez que se pasa al código .NET. Si alguien tiene una explicación mejor, agréguela a esta pregunta.