java - ORA-00933 : SQL command not properly ended on jdbc call

标签 java oracle jdbc

我有这个查询:

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 的文字。因此您不能在其中使用位置参数。

您必须使用转换函数 NUMTOYMINTERVALNUMTODSINTERVAL 之一。

准备好的语句的修改后的 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/

相关文章:

java - antMatcher() 与 antMatchers() 的 Spring 安全应用

java - 构建的java类不代表变化

sql - SQL 表连接中 ON 和 WHERE 子句的区别

java - Java EE 中的 log4j postgres

java - 是否可以制作一个调用 jdbc 的 Java JNI?

java - JTextField 固定高度

java - BeanUtils 中转换器的注册是线程本地的吗?

oracle - 数据库服务器 TLS 配置。故障 TNS-00542 : SSL Handshake failed

java - 什么是 ojdbc6.jar 文件?

java - 调用execute()时PreparedStatement与记录不匹配