存储过程调用给出错误PLS-00306 ORA-06550

时间:2012-08-30 09:58:07

标签: c# oracle stored-procedures

我在Oracle中有一个存储过程,它有一些参数,我从C#(http处理程序)调用它,有时会得到异常。

  

PLS-00306:调用'PROC_ADD _...'时参数的数量或类型错误   ORA-06550:第1行第7栏:
  PL / SQL:忽略语句

我知道错误的数字或类型的含义。这意味着我没有在过程调用的所有参数中提供值。

我的问题是我在每个参数值中都使用了string.trim()函数,如下所示

所以它应该给出错误或object reference或我错了。

var prm = new OracleParameter[8];
prm[0] = Command.Parameters.Add(new OracleParameter("IP_ACTION", OracleType.VarChar, 20));
prm[0].Value = pobjCustomerProps.Action.Trim();
prm[1] = Command.Parameters.Add(new OracleParameter("IOP_CUSTOMER_UID", OracleType.VarChar, 30));
prm[1].Direction = ParameterDirection.InputOutput;
prm[1].Value = pobjCustomerProps.CustomerID.Trim();

prm[2] = Command.Parameters.Add(new OracleParameter("IP_MOBILE_NO", OracleType.VarChar, 50));
prm[2].Value = objEncryption.Encrypt(pobjCustomerProps.MobileNo.Trim());
prm[3] = Command.Parameters.Add(new OracleParameter("IP_CUSTOMER_NAME", OracleType.VarChar, 200));
prm[3].Value = pobjCustomerProps.CustomerName==""? "": objEncryption.Encrypt(pobjCustomerProps.CustomerName.Trim());

 prm[4] = Command.Parameters.Add(new OracleParameter("IP_EMAILID", OracleType.VarChar, 500));
 prm[4].Value = pobjCustomerProps.EmailID == "" ? "" : objEncryption.Encrypt(pobjCustomerProps.EmailID.Trim());

 prm[5] = Command.Parameters.Add(new OracleParameter("IP_MODEL_CODE", OracleType.VarChar, 10));
 prm[5].Value = pobjCustomerProps.ModelCode.Trim();

 prm[6] = Command.Parameters.Add(new OracleParameter("IP_USER_UID", OracleType.VarChar, 10));
 prm[6].Value = pobjCustomerProps.UserUID.Trim();

var lobjparamErrorCode = new OracleParameter("OP_ERROR_CODE", OracleType.Number) { Direction = ParameterDirection.Output };
prm[7] = Command.Parameters.Add(lobjparamErrorCode);

这是我的sp定义

 PROCEDURE PROC_ADD_DETAILS_V1
(
    IP_ACTION IN VARCHAR2,
    IOP_CUSTOMER_UID IN OUT DIGICALL.CUSTOMER_DTL.CUSTOMER_UID%TYPE,
    IP_MOBILE_NO IN DIGICALL.CUSTOMER_DTL.MOBILE_NO%TYPE,
    IP_CUSTOMER_NAME IN DIGICALL.CUSTOMER_DTL.CUSTOMER_NAME%TYPE,
    IP_EMAILID IN DIGICALL.CUSTOMER_DTL.EMAIL_ID%TYPE,
    IP_MODEL_CODE IN  DIGICALL.CUSTOMER_DTL.MODEL_CODE%TYPE,
    IP_USER_UID IN DIGICALL.CUSTOMER_DTL.USER_UID%TYPE,
    OP_ERROR_CODE OUT NUMBER        
)

3 个答案:

答案 0 :(得分:3)

有几件事可能出错:

  • 您的参数数量可能不正确。在您的情况下似乎没问题。
  • 您可以使用错误类型的参数(关于输入/输出,关于数据类型)。在您的情况下,输入/输出似乎没问题。数据类型无法从您的描述中派生,因为存储过程定义引用了其他一些对象。
  • 您可以按错误的顺序提供参数(因此类型错误)。请注意,默认情况下,即使您为每个参数指定了名称,参数也会按位置绑定。这部分取决于您是使用ODP.NET还是System.Data.OracleClient类。在你的情况下,这似乎不是问题。
  • 可能是您的CommandText与参数不匹配。它在你的问题中遗漏了,所以我们无法分辨。

String.trim()肯定不是问题。

答案 1 :(得分:2)

我收到了这个错误,这是一个完整的红鲱鱼。

enter image description here

安装了Oracle客户端11.2和9.2。带有x86应用程序的x64位服务器。

通过卸载11.2并更改连接字符串以使用 msdaora.1 而不是 OraOLEDB.Oracle.1 来解决问题。

Alex Keh - Oracle产品经理解释了为什么会这样做:https://community.oracle.com/thread/2491412

希望这可以为其他人节省一些头发和几天的挫折感。

答案 2 :(得分:0)

我遇到了类似的问题,但是我需要更改连接字符串以包含

  

providerName =“ Oracle.ManagedDataAccess.Client”

代替

  

providerName =“ Oracle.DataAccess.Client”