2009-06-30 14 views
14

से ओरेकल को कॉल करते समय एकाधिक चयन विवरणों को बैच करें, मैं डेटाबेस में राउंड ट्रिप को कम करने के लिए एकाधिक चयन कथन बैच करना चाहता हूं। कोड नीचे छद्म कोड की तरह कुछ दिखता है। यह पूरी तरह से SQL सर्वर पर काम करता है, लेकिन ओरेकल पर काम नहीं करता - ओरेकल एसक्यूएल सिंटैक्स के बारे में शिकायत करता है। मैंने देखा है और ओरेकल से कई परिणाम सेट लौटने का एकमात्र उदाहरण संग्रहीत प्रक्रियाओं का उपयोग कर रहे हैं। क्या संग्रहीत प्रक्रियाओं के बिना ओरेकल में ऐसा करना संभव है? मैं एमएस ओरेकल डेटा प्रदाता का उपयोग कर रहा हूं, लेकिन यदि आवश्यक हो तो ओडीपी.Net का उपयोग कर सकता हूं।एडीओ.NET

var sql = @" 
      select * from table1 
      select * from table2 
      select * from table3"; 

DbCommand cmd = GetCommand(sql); 
using(var reader = cmd.ExecuteReader()) 
{ 
    dt1.Load(reader); 
    reader.NextResult(); 
    dt2.Load(reader); 
    reader.NextResult(); 
    dt3.Load(reader); 
} 
+0

http://stackoverflow.com/questions/308963/how -to-split-oracle-sql-statement-for-ado-net – Kirtan

+0

धन्यवाद। मैंने उस पर एक नज़र डाली, लेकिन यह थोड़ा अलग परिदृश्य है, क्योंकि एसक्यूएल कथन किसी भी परिणाम सेट को वापस नहीं कर रहे हैं। –

उत्तर

5

आपको एक अज्ञात पीएल/एसक्यूएल ब्लॉक लिखना चाहिए जो 3 रेफ कर्सर देता है।

संपादित 1: यहां यह एक कर्सर के साथ अज्ञात पीएल/एसक्यूएल ब्लॉक में किया जाता है। यह तीनों के साथ भी काम करना चाहिए। ओरेकल रेफ कर्सर डेटा लॉक नहीं करते हैं और वे एक पीएल/एसक्यूएल प्रक्रिया या एक अज्ञात पीएल/एसक्यूएल ब्लॉक से परिणाम सेट वापस करने का सबसे तेज़ तरीका हैं।

http://www.oracle.com/technetwork/issue-archive/2006/06-jan/o16odpnet-087852.html

+0

हमम। उत्तर के लिए +1। – Kirtan

+1

लिंक अब मर चुका है लेकिन यहां इंटरनेट संग्रह की एक संग्रहित प्रति है: http://web.archive.org/web/20060412173402/http://www.oracle.com/technology/oramag/oracle/06-jan /o16odpnet.html –

+0

लिंक लगभग 2017 तक प्रतीत होता है, लेकिन मुझे [वेबैक मशीन] (http://web.archive.org) पसंद है। इसने मेरी गर्दन को कुछ मौकों पर बचा लिया है। –

0

इसके बजाय संग्रहित प्रक्रियाओं का उपयोग क्यों नहीं करते?

लेकिन, यदि आप उन्हें इनलाइन क्वेरी में बैच करना चाहते हैं, तो आप कथन को अलग करने के लिए अर्धविराम (;) का उपयोग कर सकते हैं।

var sql = @"BEGIN 
       select * from table1; 
       select * from table2; 
       select * from table3; 
      END;"; 

संपादित करें: आप this SO question पर एक नज़र डालें।

EDIT2: this answer पर एक नज़र डालें।

+0

यह एसक्यूएल सर्वर में काम करना चाहिए, साथ ही मुझे लगता है कि –

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। मैंने बयान के बीच अर्ध-कॉलन डालने की कोशिश की लेकिन एक ही समस्या थी। मैं संग्रहीत प्रोसेस का उपयोग नहीं करना चाहता क्योंकि एसक्यूएल गतिशील रूप से जेनरेट किया जाएगा, इसलिए परिणाम सेट की एक परिवर्तनीय संख्या वापस आ जाएगी। प्रदान किया गया नमूना मैं जो कर रहा हूं उसका सरलीकृत संस्करण है। –

+0

काम नहीं करता है, आपको रेफ कर्सर की आवश्यकता है। – tuinstoel

0

कैसे के बारे में:

var sql = @" 
      select * from table1 UNION 
      select * from table2 UNION 
      select * from table3"; 
+0

सभी कॉलम समान होना चाहिए, लेकिन अगर वे हैं तो काम कर सकते हैं। – vapcguy

9

कई कर्सर और एक इनपुट पैरामीटर के साथ सी # में एक उदाहरण:

string ConnectionString = "connectionString"; 
OracleConnection conn = new OracleConnection(ConnectionString); 
StringBuilder sql = new StringBuilder(); 

sql.Append("begin "); 
sql.Append("open :1 for select * from table_1 where id = :id; "); 
sql.Append("open :2 for select * from table_2; "); 
sql.Append("open :3 for select * from table_3; "); 
sql.Append("end;"); 

OracleCommand comm = new OracleCommand(sql.ToString(),_conn); 

comm.Parameters.Add("p_cursor_1", OracleDbType.RefCursor, DBNull.Value, ParameterDirection.Output); 

comm.Parameters.Add("p_id", OracleDbType.Int32, Id, ParameterDirection.Input); 

comm.Parameters.Add("p_cursor_2", OracleDbType.RefCursor, DBNull.Value, ParameterDirection.Output); 

comm.Parameters.Add("p_cursor_3", OracleDbType.RefCursor, DBNull.Value, ParameterDirection.Output); 

conn.Open(); 

OracleDataReader dr = comm.ExecuteReader(); 
+0

कृपया आप इस http://stackoverflow.com/questions/41306344/how-to-execute-multiple-oracle-query-c-sharp/41308024?noredirect=1#comment69821736_41308024 – sam

+0

डैनियल के उदाहरण के साथ-साथ साथ ही मेरी सहायता कर सकते हैं ओडीपी.Net लिंक उदाहरण पैरामीटर को उसी क्रम में जोड़ा जा रहा है जैसा कि वे SQL कथन में देखे जाते हैं। यदि वे एक ही क्रम में नहीं हैं तो आपको गलत संख्या या तर्कों के प्रकार बताते हुए एक त्रुटि मिलेगी। ज्यादातर स्थितियों में यह कोई समस्या नहीं है, लेकिन ऐसे मामलों में जहां आपको अनुक्रम से पैरामीटर जोड़ने की आवश्यकता है, तो OracleCommand BindByName = true सेट करें; –

संबंधित मुद्दे