2014-02-10 39 views
1

我有一个至少有30个参数的存储过程。大多数用默认值指定,没有用默认值指定的值被认为是强制性的。PLS-00306:错误的参数数量或类型在调用.... ASP.NET

通过SQL plus执行以下操作适用于我。

DECLARE 
l_error_value NUMBER; 
l_error_product VARCHAR2(10); 
l_ce_doc_id NUMBER; 
BEGIN 
procedurename 
(ce_cat => 'RO' 
, ce_class => 'REP' 
, ce_location => location value' 
, ce_description => 'description value' 
, ce_enquiry_type => 'IR' 
, ce_source => 'W' 
, ce_incident_datetime => '01-JAN-2014' 
, ce_doc_outcome =>'FC' 
, ce_doc_outcome_reason => 'First Contact' 
, ce_doc_id => l_ce_doc_id 
, error_value => l_error_value 
, error_product => l_error_product 
); 
END; 
/

大多数是VARCHAR2,随着日期时间(这是日期时间)例外,ce_doc_id其数量和error_product其数量。

当我尝试这与asp.net和oracle.dataaccess部件的使用,一直给我:

PLS-00306:错号码或呼叫类型的参数“过程名”。

现在它有点疯狂了。

以下是我的(尽管杂乱的代码)。

using (OracleConnection connection = new OracleConnection(oracleconnection.thisConnString())) 
      { 
       connection.Open(); 

       OracleCommand command = new OracleCommand(procedureName, connection); 
       command.CommandType = CommandType.StoredProcedure; 


       OracleParameter thisParam = new OracleParameter(); 
       thisParam.Direction = ParameterDirection.Input; 
       thisParam.OracleDbType = OracleDbType.Varchar2; 
       thisParam.Value = "RO"; 
       thisParam.ParameterName = "ce_cat"; 
       OracleParameter thisParam2 = new OracleParameter(); 
       thisParam2.Direction = ParameterDirection.Input; 
       thisParam2.OracleDbType = OracleDbType.Varchar2; 
       thisParam2.Value = "REP"; 
       thisParam2.ParameterName = "ce_class"; 
       OracleParameter thisParam3 = new OracleParameter(); 
       thisParam3.Direction = ParameterDirection.Input; 
       thisParam3.OracleDbType = OracleDbType.Varchar2; 
       thisParam3.Value = "Location"; 
       thisParam3.ParameterName = "ce_location"; 
       OracleParameter thisParam4 = new OracleParameter(); 
       thisParam4.Direction = ParameterDirection.Input; 
       thisParam4.OracleDbType = OracleDbType.Varchar2; 
       thisParam4.Value = "Description"; 
       thisParam4.ParameterName = "ce_description"; 
       OracleParameter thisParam5 = new OracleParameter(); 
       thisParam5.Direction = ParameterDirection.Input; 
       thisParam5.OracleDbType = OracleDbType.Varchar2; 
       thisParam5.Value = "IR"; 
       thisParam5.ParameterName = "ce_enquiry_type"; 
       OracleParameter thisParam6 = new OracleParameter(); 
       thisParam6.Direction = ParameterDirection.Input; 
       thisParam6.OracleDbType = OracleDbType.Varchar2; 
       thisParam6.Value = "W"; 
       thisParam6.ParameterName = "ce_source"; 
       OracleParameter thisParam7 = new OracleParameter(); 
       thisParam7.Direction = ParameterDirection.Input; 
       thisParam7.OracleDbType = OracleDbType.Date; 
       thisParam7.Value = DateTime.Now; 
       thisParam7.ParameterName = "ce_incident_datetime"; 
       OracleParameter thisParam8 = new OracleParameter(); 
       thisParam8.Direction = ParameterDirection.Input; 
       thisParam8.OracleDbType = OracleDbType.Varchar2; 
       thisParam8.Value = "FC"; 
       thisParam8.ParameterName = "ce_doc_outcome"; 
       OracleParameter thisParam9 = new OracleParameter(); 
       thisParam9.Direction = ParameterDirection.Input; 
       thisParam9.OracleDbType = OracleDbType.Varchar2; 
       thisParam9.Value = "First Contact"; 
       thisParam9.ParameterName = "ce_doc_outcome_reason"; 

       OracleParameter thisParam10 = new OracleParameter(); 
       thisParam10.Direction = ParameterDirection.ReturnValue; 
       thisParam10.OracleDbType = OracleDbType.Decimal; 
       thisParam10.ParameterName = "ce_doc_id"; 
       OracleParameter thisParam11 = new OracleParameter(); 
       thisParam11.Direction = ParameterDirection.ReturnValue; 
       thisParam11.OracleDbType = OracleDbType.Varchar2; 
       thisParam11.ParameterName = "error_value"; 
       OracleParameter thisParam12 = new OracleParameter(); 
       thisParam12.Direction = ParameterDirection.ReturnValue; 
       thisParam12.OracleDbType = OracleDbType.Decimal; 
       thisParam12.ParameterName = "error_product"; 

       command.Parameters.Add(thisParam); 
       command.Parameters.Add(thisParam2); 
       command.Parameters.Add(thisParam3); 
       command.Parameters.Add(thisParam4); 
       command.Parameters.Add(thisParam5); 
       command.Parameters.Add(thisParam6); 
       command.Parameters.Add(thisParam7); 
       command.Parameters.Add(thisParam8); 
       command.Parameters.Add(thisParam9); 
       command.Parameters.Add(thisParam10); 
       command.Parameters.Add(thisParam11); 
       command.Parameters.Add(thisParam12); 


       command.ExecuteNonQuery(); 


      } 

在过去的版本(张贴)我换成返回值输出,看它是否作出任何区别 - 什么都没有。

我错过了什么,或者因为我使用的是asp.net和oracle odac,我是否需要指定所有参数,即使那些使用默认值?

回答

0

我通过ODP.NET转向了跟踪,以查看它在SQL中产生的内容。看起来好像ODP.NET对日期> OracleDbType.Date转换以及将其输入的值很有趣。

0

我发现调试这些类型的问题的最佳方式是注释掉除C#代码和存储过程中的所有参数外的所有参数。编译并确保它能正常工作。然后取消注释掉10个参数,重新编译并查看是否有效。继续以10个块为单位进行操作,直到代码被破坏。然后你知道这是你刚刚添加的10个之一,所以你可以开始逐个添加,直到找到破坏代码的那个。

我称这种技术为“二分查找调试”。 :)

此外,如果您将30个参数传递给SP,则可能需要查看是否可以以某种方式简化该过程。正如你发现的那样,有了这么多的参数,事情可能变得有点笨拙。

+0

我喜欢的灵活性,但是存储过程是第三方,我无法灵活地修改它。它很奇怪怎么通过SQLPlus它是好的。 –

+0

@Jon Selby - 您可以将存储过程复制到“沙箱”数据库,您可以在那里修改它? – dcp

+0

我可以尝试,但是我的用户帐户是相当有限的,我还没有能够查看SP的来源。 –

相关问题