Oracle
 sql >> Baza danych >  >> RDS >> Oracle

AKTUALIZACJA ODP.NET... POWRÓT DO... wielu wierszy, Typ parametru

w końcu po wielu godzinach poszukiwań i zabawy z kodem doszedłem do następujących wniosków (poza bólem głowy):

dostałem to, czego chciałem, używając kombinacji z

  1. podpowiedź tutaj , który sugerował zawinięcie instrukcji UPDATE..RETURNING w anonimowy blok PL/SQL (zacznij od BEGIN i kończ na END;) - to poszło bez wyjaśnienia i nadal nie wiem dokładnie, dlaczego zachowanie jest inne
  2. fragment kodu w dokumentacji Oracle na temat OracleCommand, w szczególności część o wiązaniu PL Tablice asocjacyjne /SQL z BULK COLLECT INTO (nie udało się uruchomić prostego powiązania tablicy..):

try
{
    conn.Open();
    transaction = conn.BeginTransaction();

    cmd = new OracleCommand();
    cmd.Connection = GetConnection();

    cmd.CommandText =
        "BEGIN UPDATE some_table " +
        "SET status = 'locked', " +
        "    locked_tstamp = SYSDATE, " +
        "    user_name = '" + user + "' " +
        "WHERE rownum <= 4 " +
        "RETURNING id BULK COLLECT INTO :id; END;";

    cmd.CommandType = CommandType.Text;

    cmd.BindByName = true;
    cmd.ArrayBindCount = 4;

    p = new OracleParameter();
    p.ParameterName = "id";
    p.Direction = ParameterDirection.Output;
    p.OracleDbType = OracleDbType.Int64;
    p.Size = 4;
    p.ArrayBindSize = new int[] { 10, 10, 10, 10 };
    p.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
    cmd.Parameters.Add(p);

    int nRowsAffected = cmd.ExecuteNonQuery();

    // nRowsAffected is always -1 here
    // we can check the number of "locked" rows only by counting elements in p.Value (which is returned as OracleDecimal[] here)
    // note that the code also works if less than 4 rows are updated, with the exception of 0 rows
    // in which case an exception is thrown - see below
    ...
}
catch (Exception ex)
{
    if (ex is OracleException && !String.IsNullOrEmpty(ex.Message) && ex.Message.Contains("ORA-22054")) // precision underflow (wth)..
    {
        Logger.Log.Info("0 rows fetched");
        transaction.Rollback();
    }
    else
    {
        Logger.Log.Error("Something went wrong during Get : " + ex.Message);
        ret = null;
        transaction.Rollback();
    }
}
finally
{
    // do disposals here
}
...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. vba ODBC daje Nieokreślony błąd, gdy tabela Oracle ma znacznik czasu

  2. Metoda gromadzenia:procedura EXTEND w bazie danych Oracle

  3. 7 rzeczy, które warto wiedzieć o przedziałach w Oracle Cloud Infrastructure

  4. 2 sposoby na uzyskanie liczby dni w miesiącu w Oracle

  5. Jakie role i uprawnienia należy nadać użytkownikowi w celu wykonania CRUD(na Oracle 12)