ODP.NETをデータプロバイダーとして使用する場合は、Oracleの数値コレクションをパラメーター(バインド変数)として使用できます。これは、Oracleサーバー9、10、または11およびODP.netリリース>=11.1.0.6.20で機能します。
Devartの.NETdataproviderfor Oracleを使用する場合も、同様のソリューションが可能です。
Contractnumが3と4のコントラクトを選択しましょう。
契約番号の配列をクエリに転送するには、Oracleタイプを使用する必要があります。
MDSYS.SDO_ELEM_INFO_ARRAY
このすでに定義済みのOracleタイプを使用する場合、独自のOracleタイプを定義する必要がないため、が使用されます。 MDSYS.SDO_ELEM_INFO_ARRAY
に入力できます 最大1048576の番号で。
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();
}
}
}
ヒント/*+カーディナリティ(タブ10)* /を省略した場合、contract.contractnumのインデックスは使用されません。 Contractnumが主キーであると想定したため、この列にインデックスが付けられます。
こちらもご覧ください:http://forums.oracle.com/forums/thread.jspa?messageID =3869879#3869879