sql >> Database >  >> RDS >> Oracle

Oracle-parameters met IN-instructie?

U kunt een Oracle-verzameling van getallen als parameter (bindvariabele) gebruiken wanneer u ODP.NET als dataprovider gebruikt. Dit werkt met Oracle server 9, 10 of 11 en ODP.net release>=11.1.0.6.20 .

Een vergelijkbare oplossing is mogelijk wanneer u de .NET dataprovider van Devart voor Oracle gebruikt.

Laten we de contracten met contractnum's 3 en 4 selecteren.

We moeten een Oracle-type gebruiken om een ​​reeks contractnummers naar onze query over te dragen.

MDSYS.SDO_ELEM_INFO_ARRAY wordt gebruikt omdat als we dit reeds vooraf gedefinieerde Oracle-type gebruiken, we niet ons eigen Oracle-type hoeven te definiëren. U kunt MDSYS.SDO_ELEM_INFO_ARRAY . invullen met max 1048576 nummers.

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();
    }
  }
}

De index op contract.contractnum wordt niet gebruikt wanneer men hint /*+ cardinality(tab 10) */ weglaat. Ik nam aan dat contractnum de primaire sleutel is, dus deze kolom zal worden geïndexeerd.

Zie ook hier:http://forums.oracle.com/forums/thread.jspa?messageID=3869879#3869879



  1. Hoe een gebruiker te klonen in Oracle

  2. Selecteer een groep rijen die overeenkomen met alle items in een lijst

  3. Hoe SQuirrel SQL Client te installeren

  4. Hoe gebruik je een externe sleutel in sqlite?