1

我正在使用 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 绑定存在一些问题,这可能在某种程度上相关吗?

4

3 回答 3

2

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"});
于 2016-01-24T20:31:17.840 回答
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 语句添加新约束时,我们发现了这个错误。只有一个参数,查询可以正常工作,但如果有多个查询参数 (?) 就会失败。

于 2018-10-04T14:01:13.330 回答
0

我和你有同样的错误。

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

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

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

否则,你应该有另一个给你。

祝你好运

于 2017-01-02T04:12:01.043 回答