java - Oracle:OALL8 处于不一致状态

标签 java oracle jdbc coldfusion jrun

作为升级 JRun 的一部分,我们正在从 1.4 JVM 迁移到 1.6 JVM。现在我收到一个非常奇怪的 oracle db 错误:“OALL8 处于不一致状态”。我已经确定了插入根本不使用绑定(bind)变量的查询的问题 - 所有内联参数。如果我在没有任何绑定(bind)变量的情况下运行查询,则会出现上述错误。一旦我用绑定(bind)变量替换其中一个硬编码值 - 一切正常,没有错误。

另一个奇怪的是,在执行查询之后,它实际上是提交给数据库的。我可以从另一个 session 连接并查看插入的行。我已尝试将查询包装在一个事务中,它似乎成功了,因为在没有显式事务的情况下,查询的行为没有改变。

相关细节如下:

Java 版本:1.6.0_12-b04
虚拟机版本:11.2-b01 (HotSpot Server)
甲骨文服务器:10.2.0.4
Oracle 客户端:11.1.0.7.0 通过 ojdbc6.jar

更新: 我正在使用 cfqueryparam - 它们在 oracle 世界中被称为绑定(bind)变量。虽然这确实解决了眼前的问题,但我们有一个相当大的遗留代码库,我们实际上无法通过所有代码库来更新查询,作为从 CF7 升级到 CF8 的一部分。

尽管我已经确定了一种失败的特定情况(并将其封装在 mxunit 测试中)——但这并不意味着其他领域没有这可能是个问题。我真的很想有一个解决方案来消除 OALL8 错误,而不是围绕它进行编码。

更新 2:在与我们的 DBA 确认后,他将一个名为 CURSOR_SHARING 的参数设置为 SIMILAR。 Oracle 的默认值是 EXACT。发生的事情是,当 ColdFusion 将查询交给执行时,Oracle 正在将所有文字值转换为绑定(bind)变量,这似乎使 ColdFusion 感到困惑。将设置转回 EXACT 允许文字查询正常工作。

更新 3:Oracle 终于为我们发布了 JDBC 的带外补丁。它被识别为 JDBC 错误。最新的驱动程序在最终更新时应该包括它。如果您有支持,您也可以通过他们的 TAR 系统请求补丁。

最佳答案

那么...使用绑定(bind)变量?

无论如何,您应该使用它们(通过 cfqueryparam)来确保安全,如果它解决了问题,那就更有理由这样做了。


如果您对实际错误的含义感兴趣,Google 有 plenty of results ,提示这是 JDBC 驱动程序的错误,甚至提示 patch is available .


但我在您的帖子中没有看到实际问题...?

关于java - Oracle:OALL8 处于不一致状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/679683/

相关文章:

sql开头和结尾

sql - 使用 "LIKE"语法进行高效全文搜索的索引

java jdbc mysql : how to store credentials in properties file with special characters?

java - LaTeX 生成的结果

java - 如何在 Mac OSX 上安装 Java 以允许版本切换?

java - 如何分别获取每个元素的所有属性?

java - 访问 DefaultListModel 的索引时出现空指针异常

Oracle - 特定用户的审计跟踪

apache-spark - 从JDBC源迁移数据时如何优化分区?

java - 无法使用executeQuery()和StringTokenizer发出数据操作语句