Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

PEMBARUAN ODP.NET... KEMBALI KE... beberapa baris, Jenis parameter

akhirnya, setelah berjam-jam mencari dan bermain dengan kode, saya sampai pada kesimpulan berikut (selain pusing):

saya mendapatkan apa yang saya inginkan menggunakan kombinasi dari

  1. petunjuk di sini , yang menyarankan untuk membungkus pernyataan UPDATE..RETURNING ke dalam blok PL/SQL anonim (mulai dengan BEGIN dan diakhiri dengan END;) - ini berlangsung tanpa penjelasan dan saya masih tidak tahu persis mengapa perilakunya berbeda
  2. cuplikan kode dalam dokumentasi Oracle tentang OracleCommand, khususnya bagian tentang pengikatan PL /Array asosiatif SQL dengan BULK COLLECT INTO (tidak bisa menjalankan ikatan array sederhana..):

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. Konversi Zona Waktu Oracle (menggunakan from_tz)

  2. Bagaimana cara menempatkan nilai default untuk setiap kolom dalam tabel?

  3. fungsi to_date dengan sysdate

  4. Menyimpan gambar yang diunggah:Haruskah disimpan di server atau di database?

  5. Bagaimana cara memilih baris berdasarkan nilai prioritas di baris lain?