Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Parametry Oracle z instrukcją IN?

Możesz użyć kolekcji liczb Oracle jako parametru (zmiennej powiązania), gdy używasz ODP.NET jako dostawcy danych. Działa to z serwerem Oracle 9, 10 lub 11 i wersją ODP.net>=11.1.0.6.20 .

Podobne rozwiązanie jest możliwe w przypadku korzystania z dostawcy danych Devart .NET dla Oracle.

Wybierzmy kontrakty z numerami kontraktów 3 i 4.

Musimy użyć typu Oracle, aby przenieść tablicę numerów kontraktów do naszego zapytania.

MDSYS.SDO_ELEM_INFO_ARRAY jest używany, ponieważ jeśli używamy tego predefiniowanego typu Oracle, nie musimy definiować własnego typu Oracle. Możesz wypełnić MDSYS.SDO_ELEM_INFO_ARRAY z maksymalnie 1048576 numerami.

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

Indeks na contract.contractnum nie jest używany w przypadku pominięcia podpowiedzi /*+ liczność(tab 10) */. Założyłem, że numer kontraktu jest kluczem podstawowym, więc ta kolumna zostanie zindeksowana.

Zobacz także tutaj: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. Przetwarzasz ciąg rozdzielany potokami na kolumny?

  2. Jak zainstalować ruby-oci8?

  3. Zmień kolejność kolumn tabeli w Oracle

  4. Proces aktualizacji krok po kroku do wersji R12.2 Aktualizacja, część -3

  5. Składnia starego łączenia zewnętrznego Oracle — po co umieszczać (+) po prawej stronie znaku równości w lewym sprzężeniu zewnętrznym?