ORA-01460:请求未实现或不合理的转换

时间:2012-06-14 15:21:57

标签: oracle odp.net

当我运行以下.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

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

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

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

不幸的是,在我的情况下,这不是一个好的解决方案,因为我无法控制到SQL,我可以这样改变它。

对于表本身,列是: c1数量(5) c2 varchar2(40) c3 varchar2(20)。

我知道后面的ORA-02063表示有关数据库链接的内容,但我查看了synonim表,它并非来自任何database_link,而且我也不认为\ r \ n应该影响数据库链接。

我尝试在没有绑定参数的情况下运行查询,但它确实有效 - 但在一般术语中这样做也是不好的做法。

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

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

db为10,db链接到oracle v8数据库

任何帮助将不胜感激

4 个答案:

答案 0 :(得分:8)

可以使用直接的步骤重新创建此问题。也就是说,任何具有字符串文字的SQL查询,在where子句中,长度超过4000个字符会产生错误“ORA-01704:字符串文字太长”

但是,当通过JDBC执行相同的查询时,它会提供“ORA-01460:请求未实现或不合理的转换”

答案 1 :(得分:3)

最后我找到了答案!!!

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

p.Direction = ParameterDirection.InputOutput;

答案 2 :(得分:1)

经过大量调查后,我发现我们已经绑定了从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

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

希望这有助于任何人。

答案 3 :(得分:0)

接受的答案对我不起作用。但是,在阅读了附加的链接后,我应用了以下内容 - 尽管它确实涉及编辑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);