Commons DBUtils Oracle 11g 预处理语句

Commons DBUtils Oracle 11g Prepared Statement

我正在使用 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% 确定 table 存在,并且用户拥有 table 的权限,如果我执行相同的查询连接查询中的参数,它运行得很好,所以我正在寻找这种行为背后的原因,该方法的使用是否有问题?。 我也在某处读到,使用 dbutils 和 oracle 进行 BLOB 绑定存在一些问题,这是否与某种方式有关?

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"});

我遇到了和你一样的错误。

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

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

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

要不然,你应该再给你一个。

祝你好运

这个错误差点把我们逼疯了。我们不明白为什么该解决方案有效,但它就在这里。只需双引号并转义 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 句子添加新约束时发现了这个错误。只有一个参数查询会正常工作,但如果有多个查询参数 (?) 就会失败。