2010-11-24 12 views
5

मैं एक प्रक्रिया है कि एक पैरामीटर के रूप में table of numbers के एक कस्टम डेटा प्रकार लेता है फोन करने के लिए प्रयास कर रहा हूँ में ओरेकल UDT के लिए बाध्य है।अमान्य प्रक्रिया पैरामीटर

create type num_list as table of number; 

और प्रक्रिया की परिभाषा:

यहाँ प्रकार की परिभाषा है

create or replace procedure my_procedure 
    (listofnumbers num_list, 
        v_value char) 
is 
begin 

    update my_table 
    set my_column = v_value 
    where my_row_id in (select column_value 
         from table(listofnumbers)); 

end; 

ODP.NET और सी # का उपयोग करना, मैं इसे घोषित कर रहा हूँ इस प्रकार है:

var row_ids = new int[] { 1, 2 }; 

using (var oracleConn = new Oracle.DataAccess.Client.OracleConnection(myConnectionString)) 
{ 
    oracleConn.Open(); 
    var cmd = new Oracle.DataAccess.Client.OracleCommand("my_procedure", oracleConn); 
    cmd.CommandType = CommandType.StoredProcedure; 

    var param1 = new Oracle.DataAccess.Client.OracleParameter("listofnumbers", Oracle.DataAccess.Client.OracleDbType.Array, ParameterDirection.Input); 
    param1.CollectionType = Oracle.DataAccess.Client.OracleCollectionType.PLSQLAssociativeArray; 
    param1.UdtTypeName = "num_list"; 
    param1.Value = row_ids; 
    cmd.Parameters.Add(param1); 

    var param2 = new Oracle.DataAccess.Client.OracleParameter("v_value ", Oracle.DataAccess.Client.OracleDbType.Char, ParameterDirection.Input); 
    param2.Value = "Y"; 
    cmd.Parameters.Add(param2); 

    cmd.ExecuteNonQuery(); 
} 

अपवादों को फेंक दिया गया राज्य:

अमान्य पैरामीटर बाध्यकारी पैरामीटर नाम: listofnumbers

क्या गुण मैं पैरामीटर को परिभाषित करने में याद आ रही है?

+0

हाय, आप इसे हल करने के तरीके को कैसे समाप्त कर चुके हैं? नीचे दिया गया जवाब मेरे लिए काम नहीं करता था। – Jason

+0

मेरे संपादित उत्तर में पोस्ट किए गए लिंक में दिए गए समाधान का प्रयास करें। –

+0

पीएस नीचे दिए गए उत्तर मेरे लिए काम करता है - आपको UdtTypeName सेट नहीं करना चाहिए बल्कि इसके बजाय संग्रह प्रकार का उपयोग करना चाहिए। –

उत्तर

2

संपादित करें: 14 मई

मेरा उत्तर के रूप में अस्वीकृत हो गया है, यहाँ एक कड़ी है कि काम का हो सकता है:

http://developergeeks.com/article/35/working-with-user-defined-type-oracle-udt-and-custom-type-using-odp-net-11g


दुर्भाग्य से मैं इस के रूप में के साथ चारों ओर नहीं खेल सकते मेरे पास x64 ODP.NET है जो यूडीटी का समर्थन नहीं करता है।

हालांकि, जैसा कि आपका यूडीटी एक संग्रह है, क्या आपने पैरा 1 पर आकार संपत्ति सेट करने का प्रयास किया है?

param1.Size = row_ids.Length; 

अब, यह एक UDT नहीं है, लेकिन यहाँ मैं कैसे एक प्रकार के रूप में एक पैकेज कल्पना में परिभाषित करने के लिए बाध्य एक कोड का टुकड़ा है:

TYPE t_stringlist IS TABLE OF VARCHAR2(4000); 

      string[] values = new string[] { "AAA", "BBB" }; 

      OracleParameter parameter = new OracleParameter(); 
      parameter.Name = "my_param"; 
      parameter.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 
      parameter.OracleDbType = OracleDbType.Varchar2; 
      parameter.ArrayBindSize = new int[values.Length]; 
      parameter.ArrayBindStatus = new OracleParameterStatus[values.Length]; 
      parameter.Size = values.Length; 

      for (int i = 0; i < values.Length; ++i) 
      { 
       parameter.ArrayBindSize[i] = 4000; 
       parameter.ArrayBindStatus[i] = OracleParameterStatus.Success; 
      } 

      parameter.Value = values; 

मुझे यकीन है कि नहीं कर रहा हूँ क्या मान आप ArrayBindSize को सेट कर सकते हैं।

इसके अलावा, आप अपने UDT के लिए एक प्रकार का कारखाना बनाने पर विचार हो सकता है:

http://download.oracle.com/docs/html/E15167_01/featUDTs.htm

वैसे भी, मैं आपको कुछ लगता है कि यहाँ की सहायता करेगी।

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