.net एडीओ। नेट के लिए ओरेकल एसक्यूएल स्टेटमेंट कैसे विभाजित करें I




database oracle (3)

Oracle ADO.NET क्लाइंट को भेजने के लिए एसक्यूएल स्टेटमेंट को विभाजित करने का सही तरीका क्या है? उदाहरण के लिए, कहें कि आपके पास एक पाठ फ़ाइल में निम्नलिखित कोड है और इन स्टेटमेंटों को निष्पादित करना चाहते हैं:

CREATE TABLE foo (bar VARCHAR2(100));
INSERT INTO foo (bar) VALUES('one');
INSERT INTO foo (bar) VALUES('two');

मुझे विश्वास है कि एक आदेश में उन सभी को भेजने का प्रयास करने के कारण ओरेकल को ";" मेरा पहला विचार "" पर विभाजित होगा " चरित्र, और एक समय में उन्हें एक भेजते हैं।

लेकिन, संग्रहित प्रक्रिया में अर्ध-बृहदान्त्र भी हो सकते हैं, तो मैं इसे कैसे बनाऊं, ताकि विभाजित दिनचर्या पूरे संग्रहीत प्रक्रिया को एक साथ रखे? क्या इसे शुरू / अंत के बयानों को भी देखने की जरूरत है, या "/"?

क्या ओडीपी। नेट और माइक्रोसॉफ्ट ओरेकल प्रदाता के बीच इन मामलों में कोई अंतर है?


टोनी के जवाब पर विस्तार करने के लिए, आप ऐसा करने के लिए एक बेनामी ब्लॉक का उपयोग कर सकते हैं, आपको यह सुनिश्चित करना होगा कि स्ट्रिंग अपेक्षा करते हुए काम कर रहा है। यह एक नीचे और गंदी उदाहरण है, पर बहुत ज्यादा बंटवारे; और ब्लॉक बनाना

using System;
using System.Data;
using System.Text;
using System.Reflection;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;

namespace ODPSample
{
    class Class1
    {

        private static string formatAnonBlock(string userData)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("Begin ");
            string[] statements = userData.Split(';');
            foreach (string s in statements)
            {
                if (s.Length > 0)
                {
                    sb.AppendFormat(" EXECUTE IMMEDIATE '{0}';", s.Replace("'", "''"));
                }
            }
            sb.Append(" END ; ");
            return sb.ToString();
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Demo: Anon Block");

            // Connect
            string connectStr = "User Id=scott;Password=tiger;Data Source=database";

            string userInputtedSQL;
            userInputtedSQL = "Create table ABC(val varchar2(50)); insert into ABC values('123');insert into ABC values('567');";

            string anonBlock;
            anonBlock = formatAnonBlock(userInputtedSQL);
            Console.WriteLine(anonBlock);

            OracleConnection connection = new OracleConnection(connectStr);
            OracleCommand cmd = new OracleCommand(anonBlock, connection);


            try
            {
                connection.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

            Console.WriteLine("Done");
        }
    }
}

डीडीएल के बिना, आप BEGIN और END के साथ बयानों के आस-पास एक अनाम पीएल / एसक्यूएल ब्लॉक बना सकते हैं:

BEGIN
  INSERT INTO foo (bar) VALUES('one');
  INSERT INTO foo (bar) VALUES('two');
END;

डीडीएल (जैसे टेबल बनाएँ) करने के लिए आपको डायनामिक पीएल / एसक्यूएल का उपयोग करना होगा:

BEGIN
  EXECUTE IMMEDIATE 'CREATE TABLE foo (bar VARCHAR2(100))';
  EXECUTE IMMEDIATE 'INSERT INTO foo (bar) VALUES(:v)' USING 'one';
  EXECUTE IMMEDIATE 'INSERT INTO foo (bar) VALUES(:v)' USING 'two';
END;

INSERTS गतिशील भी होते हैं, क्योंकि ब्लॉक चलने से पहले तालिका मौजूद नहीं होती है और इसलिए यह संकलन करने में असफल हो जायेगी।

नोट: यह एक असामान्य आवश्यकता होगी: अनुप्रयोग सामान्य रूप से तालिकाओं का निर्माण नहीं करना चाहिए!


डेरर्ट नामक एक कंपनी ( www.devart.com ) ओरेकल के लिए डॉट कनेक्ट के नाम से एक लाइब्रेरी प्रकाशित करती है।

इस लाइब्रेरी में ओरेकल स्क्रिप्ट नामक एक वर्ग शामिल है जिसमें एकाधिक स्टेटमेंट्स वाली SQL स्क्रिप्ट को अलग करने की क्षमता है।







ado.net