【问题标题】:Commons DBUtils Oracle 11g Prepared StatementCommons DBUtils Oracle 11g 准备好的语句
【发布时间】:2016-05-01 01:05:59
【问题描述】:

我正在使用 oracle 数据库 11g 第 2 版,我正在使用 apache commons dbutils v1.6,以及 JDK 8 和 tomcat 8.0.30。所以我使用 QueryRunner 及其方法,如果我只是在这样的文本中连接我的变量,一切都很好

query.query ("select * from table where field = '"+value+"'", rsh);

最近我一直在尝试使用准备好的语句以正确的方式进行查询,但无济于事,每次我使用查询方法绑定参数时

query.query ("select ESTREC,LOTE,FECREC from prueba.RECAUDO_ENC where NITREC = ? and ESTREC = ? ORDER BY FECREC DESC", rsh, new Object[]{"1234","PG"}); 

我无缘无故地收到此错误

java.sql.SQLException: ORA-00942: table or view does not exist
  Query: select ESTREC,LOTE,FECREC from prueba.RECAUDO_ENC where NITREC = ? and ESTREC = ? ORDER BY FECREC DESC; Parameters: [1234, PG]

我 100% 确定该表存在,并且用户对该表具有权限,如果我执行相同的查询连接查询中的参数,它运行得很好,所以我正在寻找这种行为背后的原因,是否存在该方法的使用有什么问题吗? 我也在某处读到,使用 dbutils 和 oracle 进行 BLOB 绑定存在一些问题,这可能与此有关吗?

【问题讨论】:

  • 您是否尝试过将new Object[]{1234,"PG"} 作为参数数组(intString 元素)传递?您的一列似乎是NUMBER,另一列是VARCHAR
  • 它们都是字符串,我确实尝试过更改我传递的数据类型。

标签: java oracle oracle11g apache-commons-dbutils


【解决方案1】:

这个错误几乎让我们发疯。我们不明白为什么该解决方案有效,但它就是这样。只需对 SQL 语句中的所有列进行双引号和转义:

String sqlStr = "SELECT \"ESTREC\",\"LOTE\",\"FECREC\" " + 
    "FROM prueba.RECAUDO_ENC " +
    "WHERE \"NITREC\" = ? and \"ESTREC\" = ?" + 
    "ORDER BY \"FECREC\" DESC"
query.query(sqlStr, rsh, new Object[]{"1234","PG"});

有趣的是,当我们向 SELECT 语句添加新约束时,我们发现了这个错误。仅使用一个参数,查询就可以正常工作,但使用多个查询参数 (?) 时会失败。

【讨论】:

    【解决方案2】:

    我遇到了同样的错误。

    我想你一定要小心jdbc驱动的版本。 就我而言,我解决了为我更改正确的 jdbc 驱动程序的问题。

    我误用了 jdbc 驱动程序。 我猜你有一个 12 或更高版本的 jdbc 驱动程序。 首先在 MANIFEST.MF 中检查 jdbc 驱动程序的版本。 它有以下几行

        ....
        Implementation-Version: 11.2.0.4.0
        ....
    

    否则,您应该为您准备另一个。

    祝你好运

    【讨论】:

      【解决方案3】:

      oracle 的正确查询语法是:

      query.query ("select ESTREC,LOTE,FECREC 
                      from prueba.RECAUDO_ENC 
                     where NITREC = :P1 and ESTREC = :P2 
                     ORDER BY FECREC DESC", 
                   rsh, new Object[]{"1234","PG"});
      

      【讨论】:

      • thx 问题所在的人已经尝试过查询并且工作正常,是否有与此信息相关的链接,可能是 dbutils 文档?我做了搜索,但找不到任何东西
      • 我不明白,这种语法确实有效但并非总是如此,有时我会收到错误 java.sql.SQLException: ORA-00936: missing expression, 为什么会这样?查询工作可以连接字段,但是如果我更改为 :Pn 或 ?它抛出错误。到目前为止,只有 3 个查询以这种方式工作,无论如何感谢解决方案和任何反馈
      • @lacripta 此类错误通常出现在您尚未完成selectwheregroup byorder by 子句中的表达式时。例如,当你写select column1, from ...,或... where column1 = column2 and order by column3,或... where column1 = order by column3时,如果你动态组装你的查询,请注意这一点。
      猜你喜欢
      • 2013-04-01
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      相关资源
      最近更新 更多