【问题标题】:wrong number of arguments or type when call procedure in Oracle 12C database在 Oracle 12C 数据库中调用过程时参数或类型的数量错误
【发布时间】:2017-11-22 05:26:52
【问题描述】:

在 oracle 12C 数据库中创建了一个包,并有 C# 代码来调用它。执行NoQuery 时出现错误“参数数量或类型错误”,如下所示。检查包签名并与 C# 中的代码进行比较。无法弄清楚这个问题。唯一不确定的类型是映射 Oracle 编号 (10)。试图用 OracleDbType.varchar2、int32、int64 和 Long 映射它,但得到了同样的错误。下面是包签名和 C# 代码。我想知道我所做的有什么问题,有人可以提供帮助。

包装:

create or replace PACKAGE GETIMPOSITION AS    
   TYPE impTyp IS TABLE OF varchar2(200);
   TYPE impNm IS TABLE OF varchar2(255);  
   TYPE impTax IS TABLE OF char(1);
   TYPE impIncld IS TABLE OF char(1);
   TYPE impId IS TABLE OF varchar2(8);
   TYPE impSkuId IS TABLE OF number(10,0);
   TYPE impPmCd IS TABLE OF varchar2(15);

   /* Get data from each OUT parameter */
   procedure RMS_GET_IMPOSITION_INFO (
      O_IMPOSITIONTYPES OUT impTyp,
      O_ERRORDES OUT VARCHAR2,
      O_ERRORCODE OUT VARCHAR2
   ); 
END GETIMPOSITION;

C#代码:

 int[] aRraybindingSize = new int[2000];
    List<string> empty = new List<string>();
    for (int i = 0; i < arrBindingSize.Length; i++)
    {
       empty.Add(string.Empty);
    }

    using (OracleConnection database = new OracleConnection(connString))
    {
    OracleCommand dbCommand = database.CreateCommand();
    dbCommand.CommandType = System.Data.CommandType.StoredProcedure;
    dbCommand.CommandText = ConfigurationManager.AppSettings.Get("StoredProcedureNameIMPSEX");

    OracleParameter[] oracleParam = new OracleParameter[3];
    oracleParam[0] = new OracleParameter("O_IMPOSITIONTYPES", OracleDbType.Varchar2, 100);
    oracleParam[0].CollectionType = OracleCollectionType.PLSQLAssociativeArray;
    oracleParam[0].Direction = ParameterDirection.Output; 
    oracleParam[0].Size = empty.Count;
    oracleParam[0].ArrayBindSize = arrBindingSize;
    for (int i = 0; i < arrBindingSize.Length; i++)
    {
        oracleParam[0].ArrayBindSize[i] = 100;
    }
    oracleParam[0].Value = empty.ToArray();
    dbCommand.Parameters.Add(oracleParam[0]);

oracleParam[1] = new OracleParameter("O_ERRORDES", OracleDbType.Varchar2, 512); oracleParam[1].Direction = System.Data.ParameterDirection.Output;

    oracleParam[2] = new OracleParameter("O_ERRORCODE", OracleDbType.Varchar2, 512);
    oracleParam[2].Direction = System.Data.ParameterDirection.Output;

    dbCommand.Parameters.AddRange(oracleParam);
    database.Open();
    int status = dbCommand.ExecuteNonQuery(); 
 }

将程序更改为只有一个 OUTPUT 数组(如上所示),但仍然出现相同的错误。如果将其更改为不是数组,则过程和 C# 代码从数据库调用中获得正确的数据。对我来说,当 C# 代码谈论过程时,他们彼此不了解 PLSQLAssociativeArray 是什么。添加状态作为返回参数不是问题。这不是 oracle 函数调用。没有返回值的执行非查询很好,所以行 int 状态可以消失。对 PLSQLAssociativeArray 有何评论?这是任何错误。还是需要改程序?

【问题讨论】:

  • 当执行到 ExecuteNonQuery() 时,C# 代码抛出异常为“参数数量或类型错误”
  • 我相信您的帖子与this 重复,接受的答案会对您有所帮助。
  • 感谢您的评论杰夫。但我使用 Oracle SQL 开发人员运行这个包,它运行良好。有什么想法吗?
  • 只使用一个参数创建一个最小示例,直到您找出导致问题的原因。可能有不止一种类型导致问题。但是通过创建一个更简单的案例,您将能够更好地解决问题。
  • 好主意。会尝试的。谢谢

标签: database oracle procedure


【解决方案1】:

尝试先添加您的状态参数

create or replace PACKAGE GETIMPOSITION AS    
   TYPE impTyp IS TABLE OF varchar2(200);
   TYPE impNm IS TABLE OF varchar2(255);  
   TYPE impTax IS TABLE OF char(1);
   TYPE impIncld IS TABLE OF char(1);
   TYPE impId IS TABLE OF varchar2(8);
   TYPE impSkuId IS TABLE OF number(10,0);
   TYPE impPmCd IS TABLE OF varchar2(15);

   /* Get data from each OUT parameter */
   procedure RMS_GET_IMPOSITION_INFO (
      O_IMPOSITIONTYPES OUT impTyp,
      O_IMPOSITIONNAME OUT impNm,
      O_IMPSTTAXABILITIES OUT impTax,
      O_INCLUDEDINTAXES OUT impIncld,
      O_IMPOSITIONID OUT impId,
      O_IMPSTSKUS OUT impSkuId,
      O_IMPSTPIMS OUT impPmCd,
      O_ERRORDES OUT VARCHAR2,
      O_ERRORCODE OUT VARCHAR2
   ); 
END GETIMPOSITION;



    int[] aRraybindingSize = new int[2000];

    using (OracleConnection database = new OracleConnection(connString))
    {
    OracleCommand dbCommand = database.CreateCommand();
    dbCommand.CommandType = System.Data.CommandType.StoredProcedure;
    dbCommand.CommandText = ConfigurationManager.AppSettings.Get("StoredProcedureNameIMPSEX");

// Return value parameter has to be added first !
                int status = new OracleParameter();
                status.Direction = ParameterDirection.ReturnValue;
                status.OracleDbType = OracleDbType.Int32;
                cmd.Parameters.Add(status);

    OracleParameter[] oracleParam = new OracleParameter[9];
    oracleParam[0] = new OracleParameter("O_IMPOSITIONTYPES", OracleDbType.Varchar2, 100);
    oracleParam[0].CollectionType = OracleCollectionType.PLSQLAssociativeArray;
    oracleParam[0].Direction = ParameterDirection.Output;
    oracleParam[0].ArrayBindSize = aRraybindingSize;

    oracleParam[1] = new OracleParameter("O_IMPOSITIONNAME", OracleDbType.Varchar2, 255);
    oracleParam[1].CollectionType = OracleCollectionType.PLSQLAssociativeArray;
    oracleParam[1].Direction = ParameterDirection.Output;
    oracleParam[1].ArrayBindSize = aRraybindingSize;

    oracleParam[2] = new OracleParameter("O_IMPSTTAXABILITIES", OracleDbType.Char, 1);
    oracleParam[2].CollectionType = OracleCollectionType.PLSQLAssociativeArray;
    oracleParam[2].Direction = ParameterDirection.Output;
    oracleParam[2].ArrayBindSize = aRraybindingSize;

    oracleParam[3] = new OracleParameter("O_INCLUDEDINTAXES", OracleDbType.Char, 1);
    oracleParam[3].CollectionType = OracleCollectionType.PLSQLAssociativeArray;
    oracleParam[3].Direction = ParameterDirection.Output;
    oracleParam[3].ArrayBindSize = aRraybindingSize;

    oracleParam[4] = new OracleParameter("O_IMPOSITIONID", OracleDbType.Varchar2, 8);
    oracleParam[4].CollectionType = OracleCollectionType.PLSQLAssociativeArray;
    oracleParam[4].Direction = ParameterDirection.Output;
    oracleParam[4].ArrayBindSize = aRraybindingSize;

    oracleParam[5] = new OracleParameter("O_IMPSTSKUS", OracleDbType.Int64);
    oracleParam[5].CollectionType = OracleCollectionType.PLSQLAssociativeArray;
    oracleParam[5].Direction = ParameterDirection.Output;
    oracleParam[5].Precision = 10;
    oracleParam[5].Scale = 0;
    oracleParam[5].Size = 10;
    oracleParam[5].ArrayBindSize = aRraybindingSize;

    oracleParam[6] = new OracleParameter(`enter code here`"O_IMPSTPIMS", OracleDbType.Varchar2, 15);
    oracleParam[6].CollectionType = OracleCollectionType.PLSQLAssociativeArray;
    oracleParam[6].Direction = ParameterDirection.Output;
    oracleParam[6].ArrayBindSize = aRraybindingSize;

    oracleParam[7] = new OracleParameter("O_ERRORDES", OracleDbType.Varchar2, 512);
    oracleParam[7].Direction = System.Data.ParameterDirection.Output;

    oracleParam[8] = new OracleParameter("O_ERRORCODE", OracleDbType.Varchar2, 512);
    oracleParam[8].Direction = System.Data.ParameterDirection.Output;

    dbCommand.Parameters.AddRange(oracleParam);
    database.Open();
    Convert.ToInt32(status.Value) = dbCommand.ExecuteNonQuery(); 

 }

【讨论】:

    猜你喜欢
    • 2021-11-30
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    相关资源
    最近更新 更多