gpt4 book ai didi

java - 为什么语句有效但 java、jdbc、oracle 中的准备语句无效?

转载 作者:行者123 更新时间:2023-11-29 04:58:55 25 4
gpt4 key购买 nike

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

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

最佳答案

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

关于java - 为什么语句有效但 java、jdbc、oracle 中的准备语句无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32765724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com