【问题标题】:Stored procedure call gives an error PLS-00306 ORA-06550存储过程调用给出错误 PLS-00306 ORA-06550
【发布时间】:2012-08-25 00:43:14
【问题描述】:

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

【问题讨论】:

  • 您能发布您的 SP 定义吗?
  • 我已经用 sq 定义编辑了我的问题。在这里面,我根据某些条件调用了不同的 sp。

标签: c# oracle stored-procedures


【解决方案1】:

有几件事可能会出错:

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

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

【讨论】:

  • 我正在使用 System.Data.OraclecClient。我在“PROC_ADD_DETAILS_V1”过程中使用的过程是否可能导致问题。
  • 关于String.trim() 我想说的是,如果任何一个参数值为null,那么它会在调用诸如“对象引用未设置为对象”之类的过程之前引发异常
  • PROC_ADD_DETAILS_V1 中的过程不太可能导致问题(除非使用 EXECUTE IMMEDIATE 调用它并且它的名称也以“PROC_ADD_”开头)。请添加更多代码,包括 OracleCommand 实例的创建及其执行,并添加 DIGICALL.CUSTOMER_DTL 的定义,以便我们了解所涉及的数据类型。
  • 我得到了解决方案,我检查了我的代码,并且在一个参数值为“null”的情况下。
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

    providerName="Oracle.ManagedDataAccess.Client"

    而不是

    providerName="Oracle.DataAccess.Client"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多