当前位置: 首页 > 知识库问答 >
问题:

为什么在java、jdbc、oracle中语句工作而没有准备好的satement?

秦阳旭
2023-03-14

我正在尝试编写一个查询,并使用java和JDBC从oracle db中获取结果。我的问题是,如果我尝试with statement的话,相同的查询可以工作,但是如果我使用PreparedStatement的话,相同的查询就不工作了。语句代码:(这里我得到的是真实的计数值)

Statement stmt = con.createStatement();
String sql = "SELECT COUNT(*) CNT FROM DB.TABLE WHERE DAY = TO_DATE('" + sqlDate + "','YYYY-MM-DD')";
rs = stmt.executeQuery(sql);
Date sqlDate = new java.sql.Date(someJava.Util.Date.getTime());// = 2015-09-24
sqlString = "SELECT COUNT(*) CNT FROM DB.TABLE WHERE DAY = TO_DATE(?,'YYYY-MM-DD')";
pstmt = con.prepareStatement(sqlString);                                        
pstmt.setDate(1, sqlDate);          
rs = pstmt.executeQuery();

当我sysout时,我的sqlDate打印如下:2015-09-24。

我对其他一些问题也有同样的问题。有人能知道这里出了什么问题吗?

共有1个答案

许沛
2023-03-14

to_date函数将字符串转换为给定特定格式的日期。因此传递给准备好的语句的参数应该是Oracle函数要转换的string

pstmt.setString(1, sqlDate.toString());

或者您可以更改查询,使参数为日期本身,并将java.sql.date对象传递给准备好的语句:

sqlString = "SELECT COUNT(*) CNT FROM DB.TABLE WHERE DAY = ?";
pstmt.setDate(1, sqlDate());

请注意,对于普通语句查询:

String sql = "SELECT COUNT(*) CNT FROM DB.TABLE WHERE DAY = TO_DATE('" + sqlDate + "','YYYY-MM-DD')";

字符串级联会追加对象的字符串表示,即相当于:

String sql = "SELECT COUNT(*) CNT FROM DB.TABLE WHERE DAY = TO_DATE('" + sqlDate.toString() + "','YYYY-MM-DD')";
 类似资料:
  • 我正在使用JDBC执行Oracle语句,如下所示: 我在Java找到了几种称呼上面的声明的方法,主要是: > 使用OraclePreparedStatement: 使用CallableStatement: > 方法#2抛出“SQLException:Not all return parameters registered”,但是,如果我将SQL语句包装为“begin..end;”-那么方法2就很好

  • 我正在尝试使用准备好的语句和TABLE_CATALOG和table_schema的参数来选择默认模式'public'中的所有表。当我创建一个准备好的语句时,系统会返回一个错误,这没有任何意义。如果我指定了TABLE_CATALOG而不指定TABLE_SCHEMA,它可以很好地工作。另外,如果指定TABLE_SCHEMA而不指定TABLE_CATALOG,它也可以正常工作。我是不是做错什么了? 线程

  • 我已经回顾了类似的问题“查看并清除Postgres缓存/缓冲区?,但所有的答案都集中在数据缓冲区上,并且自2010年以来,Postgresql发生了很大变化。 与那个问题的OP不同,我不是在计算性能时寻找一致的行为,而是在数据库随时间变化时寻找自适应的行为。 在我的应用程序中,在作业执行开始时,工作表中的行为空。查询运行非常快,但是随着时间的推移,性能下降,因为准备好的语句没有使用理想的访问路径(

  • 我正在寻找一种用Java转义MySQL查询的字符串的方法。 但等一下,在你们中的一些人直接下结论说“事先准备好的声明”之前,我想再解释一下。

  • 我目前正在增强一个使用spring和Hibernate的应用程序。有多个应用程序通过准备好的语句与db(postgres)通信的实例。到目前为止,应用程序通过DBCP与postgres通信。 更改:应用程序现在通过pgbouncer与postgres通信。 即:application->dbcp->pgbouncer->postgres 我知道这不是最理想的解决方案,即:有两个池。但由于当前的体系