sql >> データベース >  >> RDS >> Oracle

INステートメントを使用したOracleパラメータ?

    ODP.NETをデータプロバイダーとして使用する場合は、Oracleの数値コレクションをパラメーター(バインド変数)として使用できます。これは、Oracleサーバー9、10、または11およびODP.netリリース>=11.1.0.6.20で機能します。

    Devartの.NETdataproviderfor 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();
        }
      }
    }
    

    ヒント/*+カーディナリティ(タブ10)* /を省略した場合、contract.contractnumのインデックスは使用されません。 Contractnumが主キーであると想定したため、この列にインデックスが付けられます。

    こちらもご覧ください:http://forums.oracle.com/forums/thread.jspa?messageID =3869879#3869879



    1. OracleのLOG()関数

    2. 別のテーブルの列を更新する挿入トリガー後のmysql

    3. RMANリストバックアップコマンド

    4. SQL Server(T-SQL)のパーティションのスイッチイン