在查询中使用带间隔的 prepareStatement 时出错
Getting error when using prepareStatement with interval in query
当 运行 在 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
中的错误吗?我可以将准备好的语句与间隔一起使用吗?
整个表达式INTERVAL '7' DAY
是一个文字,不能简单地用变量(参数)替换其中的一部分。请改用函数 NUMTODSINTERVAL(?,'DAY')
。
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。
如果你传递一个整数参数乘以一个固定的间隔,它就会起作用例如
select * from foo where (time + ? * INTERVAL '1' DAY) > current_timestamp
您可以输入天数、小时数...
并且比 setInt
参数
当 运行 在 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
中的错误吗?我可以将准备好的语句与间隔一起使用吗?
整个表达式INTERVAL '7' DAY
是一个文字,不能简单地用变量(参数)替换其中的一部分。请改用函数 NUMTODSINTERVAL(?,'DAY')
。
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。
如果你传递一个整数参数乘以一个固定的间隔,它就会起作用例如
select * from foo where (time + ? * INTERVAL '1' DAY) > current_timestamp
您可以输入天数、小时数...
并且比 setInt
参数