【问题标题】:ORA-01460: unimplemented or unreasonable conversion requestedORA-01460: 请求的转换未实现或不合理
【发布时间】:2012-06-17 16:12:18
【问题描述】:

当我运行以下 .Net 代码时:

using (var c = Shared.DataSources.BSS1.CreateCommand())
{
    c.CommandText = "\r\nSelect c1, c2, c3, rowid \r\nFrom someSpecificTable \r\nWhere c3 = :p0";
    var p = c.CreateParameter() as Oracle.DataAccess.Client.OracleParameter;
    c.Parameters.Add(p);
    p.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2;
    p.DbType = System.Data.DbType.AnsiString;
    p.Size = 20;
    p.Value = "007";
    p.ParameterName = ":p0";
    using (var r = c.ExecuteReader())
    {
        r.Read();
    }
}

我收到以下错误:

ORA-01460: unimplemented or unreasonable conversion requested
ORA-02063: preceding line from XXX

这不是我的数据库,我无法控制我得到的选择语句,该表来自数据库链接。

有趣的是,如果我在 ExecuteReader 之前添加以下代码,它运行良好。

c.CommandText = c.CommandText.Replace("\r\n", " ");

不幸的是,在我的情况下,这不是一个好的解决方案,因为我无法控制 SQL,也不能这样更改。

至于表本身,列是: c1 编号(5) c2 varchar2(40) c3 varchar2(20).

我知道之后出现的 ORA-02063 表示有关数据库链接的某些内容,但我查看了同义词表,它不是来自任何 database_link,而且我认为 \r\n 不会影响数据库链接。

我尝试在没有绑定参数的情况下运行查询,它确实有效 - 但笼统地说,这样做又是一种不好的做法。

问题在于,不是基于 .Net 的竞争工具正在运行,因此这不是一个普遍问题。

我也无法在我自己的环境中重现该问题,这是一个客户数据库和站点。 我正在使用即时客户端 11.1.6.20,还使用即时客户端 11.2.3.0 对其进行了测试

db 为 10,db 链接指向 oracle v8 数据库

任何帮助将不胜感激

【问题讨论】:

  • 你不能控制 SQL 但你还是执行它?所以你只是拿用户给你的任何东西?抱歉,我可能误解了情况。
  • 这是一个自动从一种语言迁移到另一种语言的应用程序。大多数 SQL 都是动态自行生成的。其中一些嵌入在代码中。
  • 我猜它一定是我在 .Net 驱动程序或应用程序中的一些东西。例如通过 JDBC 运行带有嵌入换行符的 SQL 语句完全没有问题
  • 不是每个查询。这是这个特定的查询。我运行了数千个其他查询,一切都很好。
  • 我认为这与绑定变量、odp.net 和数据库链接有关。

标签: oracle odp.net


【解决方案1】:

这个问题可以通过直接的步骤重现。也就是说,任何具有字符串文字的 SQL 查询,在 where 子句中,长度超过 4000 个字符都会给出错误“ORA-01704: string literal too long”

但是,当通过 JDBC 执行相同的查询时,它会给出“ORA-01460: unimplemented or unreasonable conversion requested”

【讨论】:

    【解决方案2】:

    终于找到答案了!!!

    在调查并反映到代码后,我发现通过将参数的方向更改为输入输出 - 问题得到了解决。

    p.Direction = ParameterDirection.InputOutput;
    

    【讨论】:

      【解决方案3】:

      经过大量调查,我发现这完全是因为我们绑定了从 ODP.NET 使用的参数,并将 DBLINK 中的表定位到 V8 Oracle 服务器。

      一旦我消除了绑定参数,它就全部起作用了。

      这是不久前的事了,但我认为这与发送到绑定参数的字符串的不同字符串长度有关。 它似乎忽略了 size 属性,所以如果在第一个查询中我发送了一个长度为 10 的字符串,而在第二个字符串中我发送了一个长度为 12 的字符串,我会收到该错误。

      我还找到了有关它的 oracle 文章: https://community.oracle.com/thread/2460796?tstart=0

      及其补丁: https://support.oracle.com/CSP/main/article?cmd=show&type=NOT&id=745005.1

      但是 - 我在我的代码中找到了一个真正解决它的修复 - 请参阅我的下一个答案。

      希望这对任何人都有帮助。

      【讨论】:

        【解决方案4】:

        接受的答案对我不起作用。然而,在阅读了附加的链接之后,我应用了以下内容——尽管它确实涉及到编辑 SQL。

        就我而言,我知道绑定变量的最大左侧(第一次调用后长度减少是导致问题的原因)。所以我填充了 .NET 字符串,并在 SQL 中添加了 TRIM。按照你的例子:

        c.CommandText = "\r\nSelect c1, c2, c3, rowid \r\nFrom someSpecificTable \r\nWhere c3 = TRIM(:p0)";
        ...
        p.Value = "007".PadRight(10);
        

        【讨论】:

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