调用存储过程时出现异常:ORA-01460 - 请求未实现或不合理的转换

时间:2010-03-30 22:49:01

标签: c# .net oracle ado.net

我正在尝试使用ADO .NET调用存储过程,我收到以下错误:

  

ORA-01460 - 未实施或   要求无理转换

我试图调用的存储过程具有以下参数:

param1 IN VARCHAR2,
param2 IN NUMBER,
param3 IN VARCHAR2,
param4 OUT NUMBER,
param5 OUT NUMBER,
param6 OUT NUMBER,
param7 OUT VARCHAR2

下面是我用来调用存储过程的C#代码:

    OracleCommand command = connection.CreateCommand();
    command.CommandType = CommandType.StoredProcedure;
    command.CommandText = "MY_PROC";

    OracleParameter param1 = new OracleParameter() { ParameterName = "param1", Direction = ParameterDirection.Input,
        Value = p1, OracleDbType = OracleDbType.Varchar2, Size = p1.Length };
    OracleParameter param2 = new OracleParameter() { ParameterName = "param2", Direction = ParameterDirection.Input,
        Value = p2, OracleDbType = OracleDbType.Decimal };
    OracleParameter param3 = new OracleParameter() { ParameterName = "param3", Direction = ParameterDirection.Input,
        Value = p3, OracleDbType = OracleDbType.Varchar2, Size = p3.Length };

    OracleParameter param4 = new OracleParameter() { ParameterName = "param4", Direction = ParameterDirection.Output,
        OracleDbType = OracleDbType.Decimal };
    OracleParameter param5 = new OracleParameter() { ParameterName = "param5", Direction = ParameterDirection.Output,
        OracleDbType = OracleDbType.Decimal};
    OracleParameter param6 = new OracleParameter() { ParameterName = "param6", Direction = ParameterDirection.Output,
        OracleDbType = OracleDbType.Decimal };
    OracleParameter param7 = new OracleParameter() { ParameterName = "param7", Direction = ParameterDirection.Output,
        OracleDbType = OracleDbType.Varchar2, Size = 32767 };

    command.Parameters.Add(param1);
    command.Parameters.Add(param2);
    command.Parameters.Add(param3);
    command.Parameters.Add(param4);
    command.Parameters.Add(param5);
    command.Parameters.Add(param6);
    command.Parameters.Add(param7);

    command.ExecuteNonQuery();

任何想法我做错了什么?

3 个答案:

答案 0 :(得分:1)

不确定它是否相关但SQL VARCHAR2值限制为4000(尽管PL / SQL可以应付32,000)

您可以尝试将“尺寸= 32767”修改为较小的尺寸(例如500)并查看是否有效。

还要查看要传入的字符串的大小。如果其中一个是50000个字符,则可能是问题。

答案 1 :(得分:1)

你正在使用什么oracle客户端。有一个与绑定相关的oracle问题给出了同样的错误信息。如果我没记错的话,问题是从10.2.0.3到11.1.0.7的所有客户端都会出现此错误。

我有一个适用于10.2.0.1的应用程序,并且突然与11.1.0.7客户端一起得到了上述错误。

切换到11.2.0.1 oracle客户端修复了该问题。

但是在你的情况下,我会首先检查你的客户端的NLS设置是否与数据库匹配(或者至少是兼容的)

Theres不保证它是同一个问题,但你至少可以仔细检查它。

//很抱歉只是看到它已经修好了,但有时这些信息对其他人有用

干杯, 喝醉

答案 2 :(得分:0)

你在哪里将值推入参数?

编辑:抱歉,不好问题。相反,你正在推动参数的价值是什么? ADO.NET实现不会检查您在客户端输入参数的对象的类型;服务器负责验证对象类型是否与您给定的DB参数类型进行网格划分。转换错误可能是由于将参数声明为OracleDbType.Decimal,然后意外地将字符串推入其中而引起的。