在SELECT SYSDATE + INTERVAL '7' DAY FROM DUAL;
这样的<{p>}中运行此查询prepareStatement
时
PreparedStatement ps = connection.prepareStatement("select sysdate + interval ? day from dual" );
ps.setString(1, "7");
ps.executeQuery();
它会抛出异常,语法不好,显然是,因为我能够在sql-developer中运行相同的查询。
这是PreparedStatement
中的错误吗?我可以将预备语句与间隔一起使用吗?
答案 0 :(得分:12)
整个表达式INTERVAL '7' DAY
是一个文字,你不能简单地用变量(参数)替换它的一部分。请改用函数NUMTODSINTERVAL(?,'DAY')
。
答案 1 :(得分:0)
PreparedStatement不适用于区间文字,因此setInt和setString都不起作用! http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements003.htm
因此,如果要动态更改查询中的天数(使用区间文字),唯一的方法是连接该值。
在你的例子中:
int yourDays = 7;
String query ="select sysdate + interval '" + yourDays + "' day from dual ";
如果您需要添加其他参数并执行查询,则可以使用PreparedStatement。
答案 2 :(得分:0)
如果您将int参数乘以固定间隔(例如),它将起作用。
select * from foo where (time + ? * INTERVAL '1' DAY) > current_timestamp
您可以放几天,几个小时...
而不是setInt
参数