【问题标题】:Intermittent ORA-00904: : invalid identifier间歇性 ORA-00904: : 无效标识符
【发布时间】:2011-06-20 14:00:59
【问题描述】:

有谁知道是什么导致固定查询(静态最终字符串)大部分时间都在工作,然后间歇性地抛出以下错误:

内部原因:java.sql.SQLException: ORA-00904: : invalid identifier

查询正在通过 JDBC 连接运行。

这里奇怪的是标识符是空的,当然查询会间歇性地工作。如果我把已经注销的sql通过plsql developer运行,一切正常。

有什么想法吗?

这是查询。出于安全原因,它已被混淆。

    SELECT b.field1,
       b.field2,
       b.field3,
       my_func(b.field4, ?, nvl2(b.field5, 1, 0)) cardnumber,
       b.field6,
       b.field7,
       b.field8,
       b.field9,
       b.field10,
       b.field11,
       b.field12,
       b.field13,
       b.field14,
       b.field15,
       b.field16,
       b.field17,
       b.field18,
       b.field19,
       b.field20,
       b.field21,
       b.field22,
       b.field23,
       b.field24,
       b.field25,
       b.field26,
       my_func(b.field27, ?, nvl2(b.field28, 1, 0)) account_number,
       b.field29,
       s.field30 source_name,
       b.field31
  from table1 b
  left join table2 s
    on b.source_id = s.source_id
 where b.fieldx in
       (select fieldx from tablex where fieldy = ?)
   and customer_id = ?
   and state not in (7, 12, 1, 3, 13)
UNION
SELECT b.field1,
       b.field2,
       b.field3,
       my_func(b.field4, ?, nvl2(b.field5, 1, 0)) cardnumber,
       b.field6,
       b.field7,
       b.field8,
       b.field9,
       b.field10,
       b.field11,
       b.field12,
       b.field13,
       b.field14,
       b.field15,
       b.field16,
       b.field17,
       b.field18,
       b.field19,
       b.field20,
       b.field21,
       b.field22,
       b.field23,
       b.field24,
       b.field25,
       b.field26,
       my_func(b.field27, ?, nvl2(b.field28, 1, 0)) account_number,
       b.field29,
       s.field30 source_name,
       b.field31
   from table1 b
   left join table2 s
    on b.source_id = s.source_id
   where b.field3 in
       (select fieldx from table7 where fieldy = ?)
   and customer_id = ?
   and state in (1, 3)
   AND (b.field1 not in
       (select b.fieldx
           from table1 b,
                table3 sb,
                table4 sba
          where b.source_id = sb.source_id
            and sb.attribute_id = sba.attribute_id
            and sba.name = 'HIDE_IN_MENU'
            and b.customer_id = ?))

【问题讨论】:

  • 能否让我们识别您的标识符
  • 添加了 sql 的混淆版本

标签: oracle jdbc ora-00904


【解决方案1】:

我在使用 Oracle 10g 和 java 时遇到了类似的问题,下一行中使用 PesonID 导致了错误。

 String sql= "SELECT * FROM Person where PersonID=?"          

但是当我使用以下它时效果很好。

String sql = "SELECT * FROM Person where \"PersonID\"=?"

所以关键是那些额外的引号。

【讨论】:

    【解决方案2】:

    语句是如何执行的? 如果存在某种形式的连接而不是变量绑定可能会导致问题。可能绑定值没有被定义,或者里面有一些垃圾值。

    可能是错误来自执行 MY_FUNC 而不是调用语句。

    【讨论】:

    • 有连接,但只是字段和正文,否则使用变量绑定。
    【解决方案3】:

    看起来像是一种错误 5355253、5458021、5717746 等。 尝试刷新共享池,这在大多数情况下都有帮助。如果没有,您可以提供其他信息,例如 DBMS 版本和平台。

    【讨论】:

    • 知道在哪里可以找到这些错误的详细信息吗?
    • 您可以在 oracle 支持门户上找到更多信息
    • 设法找到某人让我登录到一个门户...缺陷描述看起来很正确,特别是考虑到观察到的行为是间歇性的。下次碰巧缩小原因时,将尝试刷新共享池的推荐方法之一,并更新结果。感谢您到目前为止的指点。
    • 只是为了更新 - 上次我请求刷新共享池时发生这种情况,但这没有效果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2022-01-22
    • 2011-08-27
    • 2011-04-21
    • 2019-06-29
    • 2013-10-20
    • 2017-12-29
    相关资源
    最近更新 更多