2013-04-24 8 views
5

पर कॉल करें मेरे पास एक पीएल/एसक्यूएल संग्रहीत प्रक्रिया है जो 4 इनपुट लेती है। उन इनपुटों में से एक एक एसोसिएटिव सरणी है (ओरेकल टाइप: PLS_INTEGER द्वारा VARCHAR2 (1) इंडेक्स की तालिका)।सी # 2010, ओडीपी.net, संग्रहीत प्रक्रिया कॉलिंग सरणी

मैं एक सी # प्रोग्राम चाहता हूं जो इस संग्रहीत प्रक्रिया को सहयोगी सरणी सहित उचित इनपुट के साथ कॉल करता है।

मैं दृश्य सी # 2010 एक्सप्रेस और ओरेकल 11 जीआर 2 के साथ ओडीपी.net 11.2 का उपयोग कर रहा हूं।

मुझे सी # से एक pl/sql प्रक्रिया में सरणी को पारित करने के बारे में कोई अच्छा उदाहरण नहीं मिल रहा है। क्या कोई मुझे एक उदाहरण दे सकता है? ओरेकल दस्तावेज़ीकरण के बाद मुझे गलत संख्या या तर्कों के प्रकार कहने में त्रुटि मिलती है।

मेरे सी # कोड:

 OracleCommand cmd = new OracleCommand("begin sdg_test.sdg_test2(:1); end;", conn); 

     OracleParameter Param1 = cmd.Parameters.Add("1", OracleDbType.Varchar2); 

     Param1.Direction = ParameterDirection.Input; 

     Param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 

     Param1.Value = new string[22] { "Y", "Y", "N", "Y", "N", "Y", "Y", "Y", "Y", "Y", "N", "Y", "N", "Y", "Y", "Y", "Y", "Y", "N", "Y", "N", "Y" }; 

     Param1.Size = 22; 
     Param1.ArrayBindSize = new int[22] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; 

     cmd.ExecuteNonQuery(); 

     conn.Close(); 
     conn.Dispose(); 

मेरे सभी प्रक्रिया करता है संदेश लॉग ऑन है। मैं बस इस अवधारणा को काम करने की कोशिश कर रहा हूं।

उत्तर

4

आप (सरल तरीके से) से शुरू कर सकते हैं:

List<int> idList = yourObjectList; 
List<int> nameList = yourObjectList; 

using (OracleConnection oraconn = new OracleConnection()) 
{ 
    oraconn.ConnectionString = "Your_Connection_string"; 

    using (OracleCommand oracmd = new OracleCommand()) 
    { 
     oracmd.Connection = oraconn; 

     oracmd.CommandType = CommandType.StoredProcedure; 
     oracmd.CommandText = "Your_Procedura_name"; 
     oraconn.Open(); 

     // To use ArrayBinding, you need to set ArrayBindCount 
     oracmd.BindByName = true; 
     oracmd.ArrayBindCount = idList.Count; 

     // Instead of single values, we pass arrays of values as parameters 
     oracmd.Parameters.Add("ids", OracleDbType.Int32, oyourObjectList.ToArray(), ParameterDirection.Input); 
     oracmd.Parameters.Add("names", OracleDbType.Varchar2, oyourObjectList.ToArray(), ParameterDirection.Input); 

     oracmd.ExecuteNonQuery(); 
     oraconn.Close(); 
    } 
} 

फिर, DB में पैकेज/प्रक्रिया जोड़ें:

PROCEDURE Your_Procedure_name(
     name IN VARCHAR2, 
     id IN NUMBER 
    ) IS  
BEGIN 

    INSERT INTO your_table VALUES(id, name); 
END Your_Procedure_name; 

एक अन्य विकल्प है:

using (OracleConnection oraconn = new OracleConnection()) 
{ 
    oraconn.ConnectionString = "Your_Connection_string"; 

    using (OracleCommand cmd = new OracleCommand()) 
    { 

     cmd.Connection = oraconn; 

     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.CommandText = "Your_Procedure_name"; 
     oraconn.Open(); 


     OracleParameter idParam = new OracleParameter("i_idList", OracleDbType.Int32, ParameterDirection.Input); 
     idParam.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 
     idParam.Value = idList.ToArray(); 
     idParam.Size = idList.Count; 

     OracleParameter nameParam = new OracleParameter("i_nameList", OracleDbType.Varchar2, ParameterDirection.Input); 
     nameParam.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 
     nameParam.Value = nameList.ToArray(); 
     nameParam.Size = nameList.Count; 

     // You need this param for output 
     cmd.Parameters.Add("ret", OracleDbType.RefCursor).Direction = ParameterDirection.Output; 
     cmd.Parameters.Add(idParam); 
     cmd.Parameters.Add(nameParam); 

     conn.Open(); 

     //If you need to read results ... 
     using (OracleDataReader dr = cmd.ExecuteReader()) 
     { 
      while (dr.Read()) 
      { 
       ... 
      } 
     } 
     conn.Close(); 
    } 
} 

लेकिन यह है अधिक जटिल, क्योंकि आपको संग्रहीत प्रक्रिया के लिए नए प्रकारों को परिभाषित करने की आवश्यकता है, जैसे

TYPE integer_list IS TABLE OF Your_table.id_column%TYPE INDEX BY BINARY_INTEGER; 
// same for names 

तरह

create or replace TYPE T_ID_TABLE is table of number; 

एक स्कीमा स्तरीय प्रकार बनाने और फिर उन्हें संग्रहित प्रक्रिया में उपयोग करते हैं, जैसे

PROCEDURE Your_Procedure_name(
     v_ret IN OUT SYS_REFCURSOR, 
     i_idList integer_list, 
     i_nameList string_list) 
    IS 
    begin 
    -- Store passed object id list to array 
idList T_ID_TABLE := T_ID_TABLE(); 
    ... 
    begin 

    -- Store passed object id list to array 
    idList.Extend(i_idList.Count); 
    FOR i in i_idList.first..i_idList.last loop 
    idList(i) := i_idList(i); 
    END LOOP;  

    ... 
END Your_Procedure_name; 
+0

जवाब के लिए धन्यवाद। मैं इसे एक शॉट दूंगा। – user2316634

+0

जब मैं TYPE integer_list चलाता हूं I_table.id_cloumn% TYPE INDEX BINARY_INTEGER द्वारा तालिका है; यह अमान्य एसक्यूएल स्टेटमेंट –

+0

दिखाता है 'टाइप या पुन: स्थापित करें कोशिश करें inst_id_list INSTRUMENT.Inst_Id% TYPE INDEX द्वारा BINARY_INTEGER का सार है; '। आपको EvgenyL के सुझाए गए तर्कों को वास्तविक वस्तुओं के साथ प्रतिस्थापित करने की आवश्यकता है जो पहले से ही आपके डीबी में मौजूद हैं। (यानी inst_id तालिका INSTRUMENT में एक फ़ील्ड है)। – dipdapdop

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