我有一个至少有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,我是否需要指定所有参数,即使那些使用默认值?
我喜欢的灵活性,但是存储过程是第三方,我无法灵活地修改它。它很奇怪怎么通过SQLPlus它是好的。 –
@Jon Selby - 您可以将存储过程复制到“沙箱”数据库,您可以在那里修改它? – dcp
我可以尝试,但是我的用户帐户是相当有限的,我还没有能够查看SP的来源。 –