Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

IN कथन के साथ Oracle पैरामीटर्स?

जब आप डेटा प्रदाता के रूप में ODP.NET का उपयोग करते हैं तो आप संख्याओं के Oracle संग्रह को पैरामीटर (बाइंड वैरिएबल) के रूप में उपयोग कर सकते हैं। यह Oracle सर्वर 9, 10 या 11 और ODP.net रिलीज़>=11.1.0.6.20 के साथ काम करता है।

जब आप Oracle के लिए Devart के .NET डेटा प्रदाता का उपयोग करते हैं तो ऐसा ही समाधान संभव है।

आइए कॉन्ट्रैक्टनम के 3 और 4 के साथ अनुबंधों का चयन करें।

हमें अपनी क्वेरी में अनुबंध संख्याओं की एक सरणी स्थानांतरित करने के लिए ओरेकल प्रकार का उपयोग करना होगा।

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) */ को छोड़ देता है, तो कॉन्ट्रैक्ट.कॉन्ट्रैक्टनम पर इंडेक्स का उपयोग नहीं किया जाता है। मैंने माना कि कॉन्ट्रैक्टनम प्राथमिक कुंजी है इसलिए इस कॉलम को अनुक्रमित किया जाएगा।

यहां भी देखें: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. स्तंभ के डिफ़ॉल्ट मान को संशोधित करने के लिए तालिका बदलें

  2. Oracle डेटाबेस से एक्सेल स्प्रेडशीट बनाएं

  3. क्या ओरेकल में उपनाम को परिभाषित करने के लिए 'as' कीवर्ड आवश्यक है?

  4. Oracle में उपयोगकर्ता कैसे बनाएं और विशेषाधिकार असाइन करें

  5. पीएल/एसक्यूएल ब्लॉक समस्या:कोई डेटा त्रुटि नहीं मिली