【问题标题】:Getting error when using prepareStatement with interval in query在查询中使用带有间隔的 prepareStatement 时出错
【发布时间】:2015-03-15 20:49:09
【问题描述】:

当像这样在prepareStatement 中运行这个查询SELECT SYSDATE + INTERVAL '7' DAY FROM DUAL;

    PreparedStatement ps =  connection.prepareStatement("select sysdate + interval ? day from dual" );      
    ps.setString(1, "7");
    ps.executeQuery();

它会抛出一个异常,语法不好,很明显,因为我能够在 sql-developer 中运行相同的查询。

这是 PreparedStatement 中的错误吗?我可以将准备好的语句与间隔一起使用吗?

【问题讨论】:

  • 不应该将“7”设置为int值吗?
  • 试试interval '7 day'
  • 不,应该是字符串,区间的oracle语法是interval 'SOME_NUMBER' day

标签: java oracle prepared-statement intervals


【解决方案1】:

整个表达式INTERVAL '7' DAY 是一个字面量,不能简单地用变量(参数)替换其中的一部分。请改用函数NUMTODSINTERVAL(?,'DAY')

【讨论】:

    【解决方案2】:

    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。

    【讨论】:

      【解决方案3】:

      如果你传递一个 int 参数乘以一个固定的间隔,它就会起作用,例如

      select * from foo where (time + ? * INTERVAL '1' DAY) > current_timestamp
      

      您可以设置天数、小时数…… 而不是setInt参数

      【讨论】:

        猜你喜欢
        • 2019-03-15
        • 1970-01-01
        • 2015-12-21
        • 2020-12-25
        • 2015-08-01
        • 2012-05-25
        • 1970-01-01
        • 2021-02-19
        • 2020-05-22
        相关资源
        最近更新 更多