Oracle
 sql >> база данни >  >> RDS >> Oracle

Параметри на Oracle с IN изявление?

Можете да използвате колекция от числа на Oracle като параметър (свързваща променлива), когато използвате ODP.NET като доставчик на данни. Това работи с Oracle сървър 9, 10 или 11 и версия ODP.net>=11.1.0.6.20.

Подобно решение е възможно, когато използвате .NET доставчик на данни на Devart за 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();
    }
  }
}

Индексът на contract.contractnum не се използва, когато се пропусне намек /*+ кардиналност (раздел 10) */. Предполагах, че contractnum е първичният ключ, така че тази колона ще бъде индексирана.

Вижте също тук: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. Изтрийте с Join в Oracle sql Query

  2. Промяна на заявката за материализиран изглед

  3. Може ли операторът IN да използва заместващи знаци LIKE (%) в Oracle?

  4. Как да стартирате съхранена процедура в oracle sql developer?

  5. Въведение в PL/SQL Ref курсори в Oracle Database