【问题标题】:Why statement works but not prepared satement in java, jdbc, oracle?java, jdbc, oracle中为什么语句有效,但没有准备好的语句?
【发布时间】:2015-09-24 15:50:15
【问题描述】:

我正在尝试使用 java 和 jdbc 编写查询并从 oracle db 获取结果。我的问题是,如果我尝试使用语句,则相同的查询有效,但如果我使用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);

PreparedStatement 代码:(这里我得到计数​​值为零)

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。

我对其他一些查询也有同样的问题。 谁能知道这里有什么问题?

【问题讨论】:

  • 为什么要在 执行查询之后分配sqlString
  • 我没有分配它,我只是想告诉你我的 sqlString 值是什么。我
  • @sstan 编辑了我的问题,谢谢
  • 因为您应该只使用java.sql.Date!你觉得PreparedStatement.setDate 是干什么用的??
  • @TheGuest 因为当您进行串联查询时,所有变量都会转换为String,然后您的TO_DATE 函数会将其转换回数据库端的DATE。当您使用 PreparedStatement 时,您传递 typed 数据 - 即您将 sqlDate 作为 DATE 传递,因此您不再需要转换。我说双赢。

标签: java oracle jdbc


【解决方案1】:

TO_DATE 函数将字符串转换为给定格式的日期。所以传递给prepared statement的参数应该是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')";

【讨论】:

  • 感谢您的回复。我的 sqlDate 不是字符串,它的类型是 java.sql.Date 和 DAY 也是日期
  • @TheGuest sqlDate.toString() 将获得字符串表示,这是您在系统输出中获得的表示。请参阅第二个更好的解决方案。
猜你喜欢
  • 2013-06-25
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多