Oracle
 sql >> Base de données >  >> RDS >> Oracle

Erreur lors de la récupération hors séquence en renvoyant la table à partir de la fonction Oracle en C # où la fonction utilise dblink vers SQL Server

Après avoir passé plus d'une journée à enquêter sur ce sujet, j'ai été dirigé vers la réponse à peine 10 minutes après avoir posté ma question. Typique !

La réponse a été trouvée ici - https://community.oracle.com/thread/659625 - et tout ce qui est requis est d'envelopper le code appelant dans une transaction. Le code de travail ressemble à ceci :

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

Ma compréhension limitée de la solution est que sans cela, une transaction est validée à la fin de SQL Server, ce qui entraîne l'échec du curseur renvoyé dans son itération une fois transmis au code .NET. Si quelqu'un a une meilleure explication, veuillez ajouter à cette question.