我有这个查询:
SELECT col FROM table WHERE
last_updated > SYS_EXTRACT_UTC(systimestamp) - INTERVAL ? DAY TO SECOND(1)
在我的数据库访问代码中,
stmt.setString(1, "0 00:01:30.0");//stmt is OraclePreparedStatement
rs = stmt.executeQuery();//results in exception
异常消息:java.sql.SQLSyntaxErrorException:ORA-00933:SQL命令未正确结束
如果我替换绑定(bind)并在 Sql Developer 中运行查询,它运行时不会出现错误。我的java代码哪里错了?
最佳答案
问题在于 INTERVAL '0 00:01:30.0' DAY TO SECOND(1)
是数据类型 INTERVAL
的文字。因此您不能在其中使用位置参数。
您必须使用转换函数 NUMTOYMINTERVAL
或 NUMTODSINTERVAL
之一。
准备好的语句的修改后的 SQL 为
SELECT col FROM table WHERE
last_updated > SYS_EXTRACT_UTC(systimestamp) - NUMTODSINTERVAL(?,'SECOND')
参数需要设置为
stmt.setInt(1, 90);
编辑正如亚历克斯提到的那样。另一种方式
SELECT col FROM table WHERE
last_updated > SYS_EXTRACT_UTC(systimestamp) - TO_DSINTERVAL(?)
并且参数可以设置为字符串
stmt.setString("0 00:01:30.0");
手动检查间隔是否相同
select NUMTODSINTERVAL(90,'SECOND') as "NUMTODSINTERVAL",
INTERVAL '0 00:01:30.0' DAY TO SECOND(1) as "INTERVAL",
TO_DSINTERVAL('0 00:01:30.0') as "TO_DSINTERVAL"
from dual
输出
NUMTODSINTERVAL INTERVAL TO_DSINTERVAL
------------------- ------------------- -------------------
+00 00:01:30.000000 +00 00:01:30.000000 +00 00:01:30.000000
关于java - ORA-00933 : SQL command not properly ended on jdbc call,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39145474/