Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Parameter Oracle dengan pernyataan IN?

Anda dapat menggunakan kumpulan angka Oracle sebagai parameter (variabel pengikat) saat Anda menggunakan ODP.NET sebagai penyedia data. Ini berfungsi dengan server Oracle 9, 10 atau 11 dan rilis ODP.net>=11.1.0.6.20 .

Solusi serupa dimungkinkan ketika Anda menggunakan penyedia data .NET Devart untuk Oracle.

Mari kita pilih kontrak dengan contractnum 3 dan 4.

Kita harus menggunakan tipe Oracle untuk mentransfer array nomor kontrak ke kueri kita.

MDSYS.SDO_ELEM_INFO_ARRAY digunakan karena jika kita menggunakan tipe Oracle yang sudah ditentukan sebelumnya, kita tidak perlu mendefinisikan tipe Oracle kita sendiri. Anda dapat mengisi MDSYS.SDO_ELEM_INFO_ARRAY dengan maksimal 1048576 angka.

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 pada contract.contractnum tidak digunakan ketika seseorang menghilangkan petunjuk /*+ kardinalitas(tab 10) */. Saya berasumsi contractnum adalah kunci utama sehingga kolom ini akan diindeks.

Lihat juga di sini: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. Mengurai string yang dibatasi pipa menjadi kolom?

  2. Memeriksa informasi Jaringan dan IP Oracle RAC

  3. Dapatkan id sisipan dalam pernyataan yang sama

  4. SQL Bergabung dengan nilai nol

  5. Perubahan Tabel Pemantauan di Oracle