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

सी # में ओरेकल, बाइंड वैरिएबल, और आईडी इन (1, 2, 3) जैसे प्रश्न

कोड:

oraParam.UdtTypeName = "SYS.ODCINUMBERLIST";
VArray newArray = new VArray();
newArray.Array = new Int32[] {12,24,42};
oraParam.OracleDbType = OracleDbType.Array;
oraParam.Value = newArray;

string query = @"Select * from TABLE(:1) ";
OracleCommand command = new OracleCommand(query, MyConnection);
command.Parameters.Add(oraParam);
OracleDataReader reader;
var m_connection = new OracleConnection("The CONNECTION STRING");
m_connection.Open();
var reader = command.ExecuteReader();
reader.Close();
m_connection.Close();

जिसके बाद निम्नलिखित हेल्पर क्लास आते हैं:

class VArray : IOracleCustomType, INullable
{
    [OracleArrayMapping()]
    public Int32[] Array;

    private OracleUdtStatus[] m_statusArray;
    public OracleUdtStatus[] StatusArray
    {
        get
        {
            return this.m_statusArray;
        }
        set
        {
            this.m_statusArray = value;
        }
    }

    private bool m_bIsNull;

    public bool IsNull
    {
        get
        {
            return m_bIsNull;
        }
    }

    public static VArray Null
    {
        get
        {
            VArray obj = new VArray();
            obj.m_bIsNull = true;
            return obj;
        }
    }

    public void ToCustomObject(OracleConnection con, IntPtr pUdt)
    {
        object objectStatusArray = null;
        Array = (Int32[])OracleUdt.GetValue(con, pUdt, 0, out objectStatusArray);
        m_statusArray = (OracleUdtStatus[])objectStatusArray;
    }

    public void FromCustomObject(OracleConnection con, IntPtr pUdt)
    {
        OracleUdt.SetValue(con, pUdt, 0, Array, m_statusArray);
    }

    public override string ToString()
    {
        if (m_bIsNull)
            return "VArray.Null";
        else
        {
            string rtnstr = String.Empty;
            if (m_statusArray[0] == OracleUdtStatus.Null)
                rtnstr = "NULL";
            else
                rtnstr = Array.GetValue(0).ToString();
            for (int i = 1; i < m_statusArray.Length; i++)
            {
                if (m_statusArray[i] == OracleUdtStatus.Null)
                    rtnstr += "," + "NULL";
                else
                    rtnstr += "," + Array.GetValue(i).ToString();
            }
            return "VArray(" + rtnstr + ")";
        }
    }
}

[OracleCustomTypeMapping("SYS.ODCINUMBERLIST")]
public class VArrayFactory : IOracleCustomTypeFactory, IOracleArrayTypeFactory
{
    // IOracleCustomTypeFactory
    public IOracleCustomType CreateObject()
    {
        return new VArray();
    }

    // IOracleArrayTypeFactory Interface
    public Array CreateArray(int numElems)
    {
        return new Int32[numElems];
    }

    public Array CreateStatusArray(int numElems)
    {
        // CreateStatusArray may return null if null status information 
        // is not required.
        return new OracleUdtStatus[numElems];
    }
}

विवरण:

सामान्य विचार यह है कि ओसीआई उदाहरण के समान, आपको पैरामीटर को SYS.ODCINUMBERLIST (या अन्य मान्य प्रकार) के रूप में डालना होगा। उस प्रकार को डिफ़ॉल्ट रूप से C# OracleDBType में परिभाषित नहीं किया गया है, इसलिए आपको सफलतापूर्वक बाइंड करने के लिए UdtTypeName और एक कस्टम फ़ैक्टरी/क्लास का उपयोग करना होगा।

यह कस्टम प्रकारों को परिभाषित करने पर निम्नलिखित पोस्ट

सीमाएं:

यह सटीक समाधान केवल INT/NUMBER मानों के साथ काम करेगा क्योंकि यह SYS.ODCINUMBERLIST तालिका प्रकार से पीछे हट रहा है। यदि अन्य प्रकारों के लिए इसकी आवश्यकता है तो आपको अतिरिक्त कस्टम तालिका प्रकार खोजने/लिखने की आवश्यकता हो सकती है।




  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. जांचें कि क्या पंक्ति मौजूद है

  3. ऑरैकल टेबल नाम केस को असंवेदनशील कैसे बनाएं?

  4. पीएल/एसक्यूएल में अल्पविराम सीमित स्ट्रिंग का विश्लेषण कैसे करें?

  5. ओरेकल में MySQL के GROUP_CONCAT के समान कुछ करने वाली क्वेरी कैसे लिखें?