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

सी#में DBMS_OUTPUT.GET_LINES से आउटपुट बफर प्राप्त करना

आपके कोड के साथ मुख्य समस्या यह थी कि यह आपके आउटपुट बफर के प्रत्येक तत्व के लिए बाइंड आकार निर्धारित नहीं कर रहा था। साथ ही यह परिणाम प्राप्त करते समय आउटपुट बफर को ठीक से अनुक्रमित नहीं कर रहा था। और अंत में, निष्पादन का क्रम भी एक भूमिका निभाता है:कोड के अपने अनाम ब्लॉक को निष्पादित करने से पहले आपको पहले अपना आउटपुट सक्षम करना होगा। किए गए प्रत्येक परिवर्तन पर निम्नलिखित MCVE में टिप्पणी की गई है। . इसे काम करने के लिए केवल आवश्यक परिवर्तन किए गए थे।

static void Main(string[] args)
{
    string str = "User Id=xxx; password=xxx; Data Source=localhost:1521/xxx;";
    string sql = @"DECLARE lvsName VARCHAR2(6) := 'Oracle'; BEGIN  DBMS_OUTPUT.PUT_LINE('Do you see me?'); DBMS_OUTPUT.PUT_LINE('My name is: ' || lvsName); END;";

    OracleConnection _connection = new OracleConnection(str);

    try
    {
        _connection.Open();

        //adapter not being used
        //using (OracleDataAdapter oda = new OracleDataAdapter())

        using (OracleCommand cmd = new OracleCommand(sql, _connection))
        {
            // First enable buffer output
            // Set output Buffer
            cmd.CommandText = "BEGIN DBMS_OUTPUT.ENABLE(NULL); END;";
            cmd.CommandType = CommandType.Text;
            cmd.ExecuteNonQuery();

            // Then execute anonymous block
            // Execute anonymous PL/SQL block
            cmd.CommandText = sql;
            cmd.CommandType = CommandType.Text;
            var res = cmd.ExecuteNonQuery();


            // Get output
            cmd.CommandText = "BEGIN DBMS_OUTPUT.GET_LINES(:outString, :numLines); END;";
            cmd.CommandType = CommandType.Text;

            cmd.Parameters.Clear();

            cmd.Parameters.Add(new OracleParameter("outString", OracleDbType.Varchar2, int.MaxValue, ParameterDirection.Output));
            cmd.Parameters["outString"].CollectionType = OracleCollectionType.PLSQLAssociativeArray;
            cmd.Parameters["outString"].Size = sql.Length;
            cmd.Parameters["outString"].ArrayBindSize = new int[sql.Length];

            // set bind size for each array element
            for (int i = 0; i < sql.Length; i++)
            {
                cmd.Parameters["outString"].ArrayBindSize[i] = 32000;
            }


            cmd.Parameters.Add(new OracleParameter("numLines", OracleDbType.Int32, ParameterDirection.InputOutput));
            cmd.Parameters["numLines"].Value = 10; // Get 10 lines
            cmd.ExecuteNonQuery();

            int numLines = Convert.ToInt32(cmd.Parameters["numLines"].Value.ToString());
            string outString = string.Empty;

            // Try to get more lines until there are zero left
            while (numLines > 0)
            {
                for (int i = 0; i < numLines; i++)
                {
                    // use proper indexing here
                    //OracleString s = (OracleString)cmd.Parameters["outString"].Value;
                    OracleString s = ((OracleString[])cmd.Parameters["outString"].Value)[i];
                    outString += s.ToString();

                    // add new line just for formatting
                    outString += "\r\n";
                }

                cmd.ExecuteNonQuery();
                numLines = Convert.ToInt32(cmd.Parameters["numLines"].Value.ToString());
            }

            Console.WriteLine(outString);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }

    _connection.Close();
    _connection.Dispose();

    Console.WriteLine("Press RETURN to exit.");
    Console.ReadLine();
}

और आउटपुट परिणाम है:

Do you see me?
My name is: Oracle

Press RETURN to exit.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. आप सभी स्तंभों का चयन कैसे करते हैं, साथ ही oracle 11g में CASE कथन का परिणाम?

  2. ORACLE तालिका फ़ील्ड डिफ़ॉल्ट मान को सूत्र पर सेट करें

  3. Oracle डेटाबेस 12c कनेक्ट करने का प्रयास करते समय त्रुटि:नेटवर्क एडेप्टर कनेक्शन स्थापित नहीं कर सका

  4. निष्क्रियता के समय के बाद कनेक्शन हैंग हो जाता है

  5. लूपिंग कर्सर त्रुटि फेंकता है कि कर्सर परिभाषित नहीं है