sql >> Databasteknik >  >> RDS >> Oracle

Oracle-parametrar med IN-sats?

Du kan använda en Oracle-samling av tal som en parameter (bindningsvariabel) när du använder ODP.NET som dataleverantör. Detta fungerar med Oracle server 9, 10 eller 11 och ODP.net release>=11.1.0.6.20 .

En liknande lösning är möjlig när du använder Devarts .NET-dataleverantör för Oracle.

Låt oss välja kontrakten med contractnums 3 och 4.

Vi måste använda en Oracle-typ för att överföra en rad kontraktsnummer till vår fråga.

MDSYS.SDO_ELEM_INFO_ARRAY används för att om vi använder denna redan fördefinierade Oracle-typ behöver vi inte definiera vår egen Oracle-typ. Du kan fylla i MDSYS.SDO_ELEM_INFO_ARRAY med max 1048576 nummer.

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

Indexet på contract.contractnum används inte när man utelämnar hint /*+ kardinalitet(tab 10) */. Jag antog contractnum är den primära nyckeln så denna kolumn kommer att indexeras.

Se även här:http://forums.oracle.com/forums/thread.jspa?messageID=3869879#3869879



  1. Hur får man tabelldefinition i Oracle?

  2. Skapa en SQL Server-tabell från en C#-datatabell

  3. SQL INSERT INTO-sats

  4. Okänd kolumn i "fältlista"-fel på MySQL Update-fråga