Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ORA-00907:缺少带PreparedStatement的右括号_Java_Oracle_Prepared Statement_Ora 00907 - Fatal编程技术网

Java ORA-00907:缺少带PreparedStatement的右括号

Java ORA-00907:缺少带PreparedStatement的右括号,java,oracle,prepared-statement,ora-00907,Java,Oracle,Prepared Statement,Ora 00907,我正在尝试运行此查询,但出现错误 ORA-00907:缺少右括号 我审阅了陈述,但括号是对的。我删除了查询的最后一行,它可以工作: AND TN.LAST_UPDATEDATE > (CURRENT_TIMESTAMP - INTERVAL ? MINUTE) 也许可以是'>'运算器中的某个东西,但我不能没有它 代码: 绑定参数的代码: int actualIndex = 0; for (int i = 0; i < params.length; i++) { actual

我正在尝试运行此查询,但出现错误

ORA-00907:缺少右括号

我审阅了陈述,但括号是对的。我删除了查询的最后一行,它可以工作:

AND TN.LAST_UPDATEDATE > (CURRENT_TIMESTAMP - INTERVAL ? MINUTE)
也许可以是'>'运算器中的某个东西,但我不能没有它

代码:

绑定参数的代码:

int actualIndex = 0;
for (int i = 0; i < params.length; i++) {
    actualIndex = sql.indexOf('?', actualIndex+1);
    Class classe = params[i].getClass();

    if(classe.isArray()) {
        StringBuffer newPlaceHolders = new StringBuffer();

        int arrayLength = java.lang.reflect.Array.getLength(params[i]);

        for (int j = 0; j < arrayLength; j++) {

            if (j>0) {
                newPlaceHolders.append(",?");                        
            } else {
                newPlaceHolders.append("?");                        
            }
        }

        sql = sql.substring(0, actualIndex) + newPlaceHolders + sql.substring(actualIndex+1);
        actualIndex += newPlaceHolders.length();
    }

    if (actualIndex == -1) {
           break;
    }
}

间隔?分钟
无效

语法为
INTERVAL'1'MINUTE
(不能为值指定变量)

如果要指定需要使用的变量

比如:

TO_DSINTERVAL( '0 00:' || TO_CHAR( ?, 'FM00' ) || ':00' )
旁白


通过修改查询以获取多个绑定变量,您似乎正在将列表传递到查询中;你不需要这样做。相反,您可以将Oracle集合作为单个绑定变量传入。可以找到这样一个例子(这个例子对于多维数组来说稍微复杂一些),但有一个更简单的例子。

子查询中
WHERE
子句的最终条件应该如下所示:

AND TN.LAST_UPDATEDATE > (CURRENT_TIMESTAMP - INTERVAL '10' MINUTE)

您需要将时间量放在单引号中。

使用
interval
到\u dsinterval()
的更简单的解决方案是使用直接日期算法。您可以在日期时间或时间戳中添加或减去数字;数字以天表示,因此如果输入(显示为?)以分钟为单位,则必须除以24*60。像这样:

... and tn.last_update > current_timestamp - ? / 24 * 60
请注意,这会将右侧更改为日期/时间(无小数秒),因此如果需要小数秒,则无法使用

AND TN.LAST_UPDATEDATE > (CURRENT_TIMESTAMP - INTERVAL '10' MINUTE)
... and tn.last_update > current_timestamp - ? / 24 * 60