gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:50:16 30 4
gpt4 key购买 nike

我有这个查询:

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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com