2

我在 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        
)
4

3 回答 3

3

有几件事可能会出错:

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

String.trim()当然不是问题。

于 2012-08-30T11:17:49.987 回答
2

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

在此处输入图像描述

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

该问题已通过卸载 11.2 并将连接字符串更改为使用msdaora.1而不是OraOLEDB.Oracle.1得到解决。

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

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

于 2017-07-11T04:31:48.583 回答
0

我有一个类似的问题,但我需要更改我的连接字符串以包含

providerName="Oracle.ManagedDataAccess.Client"

代替

providerName="Oracle.DataAccess.Client"

于 2019-01-16T23:34:05.483 回答