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