Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Fehler beim Abrufen der Tabelle aus der Oracle-Funktion in C# außerhalb der Reihenfolge, wobei die Funktion dblink zu SQL Server verwendet

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.