8

当我运行以下 .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 Number(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 数据库

任何帮助,将不胜感激

4

4 回答 4

18

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

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

于 2016-01-12T09:14:37.417 回答
6

Finally I found the answer!!!

After investigating and reflecting into the code I found that by changing the Direction of the Parameter to input output - the problem was resolved.

p.Direction = ParameterDirection.InputOutput;
于 2014-08-04T14:01:38.417 回答
2

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

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

It was a while back, but I think it's had something to do with varying string lengths of the strings sent to the bound parameter. It seems that it ignored the size property, so if in the first query I sent a string with length 10 and in the second string I sent a string with length 12, I'll get that error.

I also found the oracle articles about it : https://community.oracle.com/thread/2460796?tstart=0

and the patch for it: https://support.oracle.com/CSP/main/article?cmd=show&type=NOT&id=745005.1

But - I found a fix in my code that actually solved it - see my next answer.

Hope this helps anyone.

于 2012-11-10T08:11:47.780 回答
0

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

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

c.CommandText = "\r\nSelect c1, c2, c3, rowid \r\nFrom someSpecificTable \r\nWhere c3 = TRIM(:p0)";
...
p.Value = "007".PadRight(10);
于 2018-05-18T09:32:19.793 回答