我正在尝试编写一个查询,并使用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。
我对其他一些问题也有同样的问题。有人能知道这里出了什么问题吗?
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 我知道这不是最理想的解决方案,即:有两个池。但由于当前的体系