在查询中使用带有间隔的预准备语句时出错

时间:2015-03-15 20:49:10

标签: java oracle prepared-statement intervals

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中的错误吗?我可以将预备语句与间隔一起使用吗?

3 个答案:

答案 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参数