运行此Java / JDBC代码时出现此错误。任何想法如何解决它?
好像它在抱怨date_trunc函数中的参数?
org.postgresql.util.PSQLException:错误:语法错误在或附近" $ 1" 位置:100
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryEx
ecutorImpl.java:2161)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutor
Impl.java:1890)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.ja
va:255)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Stat
ement.java:560)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(Abstract
Jdbc2Statement.java:417)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc
2Statement.java:302)
Java代码:
static PreparedStatement searchErrorPP = connection.prepareStatement(
"select count(*) from tracking where date_trunc('day', run_date) <=
date_trunc('day', timestamp ?)");
public static int queryCount(java.util.Date date) throws SQLException {
PreparedStatement ps = null;
try {
ps = searchErrorPP;
ps.setDate( 1, new java.sql.Date(date.getTime()));
ResultSet rs = ps.executeQuery();
结果查询在pgAdmin中执行正常:
select count(*) from tracking where date_trunc('day', run_date) <=
date_trunc('day', timestamp '2014-11-11 -05:00:00')
答案 0 :(得分:14)
在type 'string'
中使用timestamp '2014-11-11 -05:00:00'
语法时,提供的值必须是常量,而不是参数。它在解析阶段由SQL引擎解释并转换为内部时间戳表示,在实际执行之前和参数值已知之前。
因此,遇到timestamp $1
时,解析器会产生语法错误,因为$1
不是文字字符串。
另一方面,cast($1 as timestamp)
的值将在执行阶段生成,因此应该使用它。
至于从JDBC的角度来看语法,cast(? as timestamp)
应该没问题。具有双冒号的PostgreSQL特定语法?::timestamp
也可能有效。
答案 1 :(得分:0)
当任何一个jdbc连接url组件都为null时,我看到了这样的错误。
E.g。连接URL组件(如DB主机名,dbname,用户或密码)为空。
请查看那里,你应该找到一个线索。