【问题标题】:Exception when calling stored procedure: ORA-01460 - unimplemented or unreasonable conversion requested调用存储过程时出现异常:ORA-01460 - 请求的转换未实现或不合理
【发布时间】:2011-02-02 16:53:49
【问题描述】:

我正在尝试使用 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();

任何想法我做错了什么?

【问题讨论】:

    标签: c# .net oracle ado.net


    【解决方案1】:

    你在哪里将值推送到参数中?

    编辑:对不起,不好的问题。相反,您要推入参数的值是什么? ADO.NET 实现不检查您推送到客户端参数中的对象的类型;服务器负责验证对象类型是否与您提供的 DB 参数类型相匹配。转换错误可能是由于将参数声明为 OracleDbType.Decimal 然后意外将字符串推入其中。

    【讨论】:

    • 我在创建 OracleParameters 时设置它们的 Value 属性(对于 IN 参数)。不对吗?
    • p1是字符串,p2是long,p3是字符串
    • 好的。我没有方便测试的 Oracle 副本,但是从过去修补过这类事情时想到了两件事。首先,尝试将 p2 分配给参数时将其转换为小数。其次,尝试删除 Varchar2 参数的 Size 参数。 DB 类型转换是出了名的挑剔,有时提供比它想要的更多的信息(或期望它执行琐碎的隐式转换,如 long 到 decimal)可能会导致挂起。
    • 哦,当你将它们推入参数时,还要确保你的字符串不为空。如果是,请改用 DBNull.Value。这也会造成麻烦。
    • 我尝试了你的两个建议,但不幸的是我仍然遇到同样的异常。
    【解决方案2】:

    不确定是否相关,但 SQL VARCHAR2 值限制为 4000(虽然 PL/SQL 可以处理 32000)

    您可以尝试将“Size = 32767”修改为更小的值(例如 500),看看是否可行。

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

    【讨论】:

    • 将大小更改为 512 而不是 32767 解决了异常。
    【解决方案3】:

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

    我的应用程序在 10.2.0.1 上运行良好,但突然在 11.1.0.7 客户端上出现上述错误。

    切换到 11.2.0.1 oracle 客户端解决了这个问题。

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

    不能保证这是同一个问题,但您至少可以仔细检查一下。

    //抱歉刚刚看到它已经修复,但该信息有时可能对其他人有用

    干杯, 坏了

    【讨论】:

      猜你喜欢
      • 2020-06-28
      • 2012-06-17
      • 2015-10-14
      • 2015-09-18
      • 1970-01-01
      • 2018-08-23
      • 2011-12-29
      • 2021-07-15
      • 1970-01-01
      相关资源
      最近更新 更多