Oracle
 sql >> Database >  >> RDS >> Oracle

Errore durante il recupero della sequenza che restituisce la tabella dalla funzione Oracle in C# dove la funzione usa dblink in SQL Server

Dopo aver trascorso più di una giornata a indagare su questo, sono stato indirizzato alla risposta solo 10 minuti dopo aver pubblicato la mia domanda. Tipico!

La risposta è stata trovata qui - https://community.oracle.com/thread/659625 - e tutto ciò che serve è racchiudere il codice chiamante in una transazione. Il codice funzionante ha questo aspetto:

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

La mia comprensione limitata della soluzione è che senza questo viene eseguita una transazione all'estremità di SQL Server che causa il fallimento del cursore restituito nella sua iterazione una volta passato al codice .NET. Se qualcuno ha una spiegazione migliore si prega di aggiungere a questa domanda.