Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

CẬP NHẬT ODP.NET ... QUAY LẠI VÀO ... nhiều hàng, Loại tham số

cuối cùng, sau nhiều giờ tìm kiếm và chơi với mã, tôi đã đi đến kết luận sau (ngoài cơn đau đầu):

tôi đã có những gì tôi muốn bằng cách sử dụng kết hợp từ

  1. một gợi ý tại đây , đề xuất bọc câu lệnh UPDATE..RETURNING thành một khối PL / SQL ẩn danh (bắt đầu bằng BEGIN và kết thúc bằng END;) - điều này không có lời giải thích và tôi vẫn không biết chính xác tại sao hành vi lại khác nhau
  2. đoạn mã trong tài liệu Oracle về OracleCommand, cụ thể là phần về ràng buộc PL / Mảng liên kết SQL với BULK COLLECT INTO (không thể khiến liên kết mảng đơn giản hoạt động ..):

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. TNS-12505:TNS:người nghe hiện không biết về SID được cung cấp trong bộ mô tả kết nối

  2. Đếm các giá trị riêng biệt cho từng cột riêng lẻ

  3. Hàm NCHR () trong Oracle

  4. Chèn ngày từ java vào Oracle DB

  5. Tạo chèn sql vào cho Oracle