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

Tham số Oracle với câu lệnh IN?

Bạn có thể sử dụng tập hợp số Oracle làm tham số (biến ràng buộc) khi bạn sử dụng ODP.NET làm trình cung cấp dữ liệu. Điều này hoạt động với máy chủ Oracle 9, 10 hoặc 11 và bản phát hành ODP.net> =11.1.0.6.20.

Một giải pháp tương tự có thể thực hiện được khi bạn sử dụng trình cung cấp dữ liệu .NET của Devart cho Oracle.

Hãy chọn các hợp đồng với 3 và 4 của contractnum

Chúng ta phải sử dụng kiểu Oracle để chuyển một mảng số hợp đồng vào truy vấn của chúng ta.

MDSYS.SDO_ELEM_INFO_ARRAY được sử dụng bởi vì nếu chúng ta sử dụng kiểu Oracle đã được xác định trước này, chúng ta không phải xác định kiểu Oracle của riêng mình. Bạn có thể điền MDSYS.SDO_ELEM_INFO_ARRAY với tối đa 1048576 số.

using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;

[OracleCustomTypeMappingAttribute("MDSYS.SDO_ELEM_INFO_ARRAY")]
public class NumberArrayFactory : IOracleArrayTypeFactory
{
  public Array CreateArray(int numElems)
  {
    return new Decimal[numElems];
  }

  public Array CreateStatusArray(int numElems)
  {
    return null;
  }
}

private void Test()
{
  OracleConnectionStringBuilder b = new OracleConnectionStringBuilder();
  b.UserID = "sna";
  b.Password = "sna";
  b.DataSource = "ora11";
  using (OracleConnection conn = new OracleConnection(b.ToString()))
  {
    conn.Open();
    using (OracleCommand comm = conn.CreateCommand())
    {
      comm.CommandText =
      @" select  /*+ cardinality(tab 10) */ c.*  " +
      @" from contract c, table(:1) tab " +
      @" where c.contractnum = tab.column_value";

      OracleParameter p = new OracleParameter();
      p.OracleDbType = OracleDbType.Array;
      p.Direction = ParameterDirection.Input;
      p.UdtTypeName = "MDSYS.SDO_ELEM_INFO_ARRAY";
      //select contract 3 and 4
      p.Value = new Decimal[] { 3, 4 };
      comm.Parameters.Add(p);

      int numContracts = 0;
      using (OracleDataReader reader = comm.ExecuteReader())
      {
        while (reader.Read())
        {
           numContracts++;
        }
      }
      conn.Close();
    }
  }
}

Chỉ mục trên contract.contractnum không được sử dụng khi bỏ qua gợi ý / * + cardinality (tab 10) * /. Tôi đã giả định rằng contractnum là khóa chính nên cột này sẽ được lập chỉ mục.

Xem thêm tại đây:http://forums.oracle.com/forums/thread.jspa?messageID=3869879#3869879



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-28000:lỗi tài khoản bị khóa thường xuyên xảy ra

  2. Oracle SqlPlus - lưu đầu ra trong một tệp nhưng không hiển thị trên màn hình

  3. Oracle là Giải pháp thay thế của các bảng thay đổi

  4. Có thể tham chiếu đến tên cột thông qua các biến liên kết trong Oracle không?

  5. Giới thiệu về Sao lưu cơ sở dữ liệu Oracle