我正在尝试运行此查询,但我遇到了错误
ORA-00907:缺少右括号
我查看了该陈述,但括号是正确的。我删除了最后一行查询,它可以工作:
AND TN.LAST_UPDATEDATE > (CURRENT_TIMESTAMP - INTERVAL ? MINUTE)
也许可以是'>'中的某些内容oparator,但我无法做到这一点。
代码:
String sql= "SELECT DID.ORDER_ID "
+ "FROM TEST_ORDER DID, TEST_ORDER_SG DOS, TEST_HRD_SHIPS_GRP DHSG, TEST_INFO CSI "
+ "WHERE DID.ORDER_ID = DOS.ORDER_ID "
+ "AND DOS.SHIPPING_GROUPS = DHSG.SHIPPING_ID "
+ "AND DOS.SHIPPING_GROUPS = CSI.SHIPPING_ID "
+ "AND DHSG.TRACKING_CODE IS NULL AND CSI.SHIPPING_CARRIER IN "
+ "(?) "
+ "AND DID.STATE IN (?) "
+ "AND NOT EXISTS "
+ "("
+ "SELECT 1 FROM "
+ "CLIENT_INTEGRATION.TEST_LOG_ORDERS_STATUS TN "
+ "WHERE TN.ORDER_ID = DID.ORDER_ID AND TN.STATE = DID.STATE "
+ "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;
}
}
所以在另一个方法中我填充了一些for循环,因为在某些情况下,参数(属于属性文件中的参数)可能不止一个。
int i=1;
for(String carriers : getCarrier()) {
ps.setString(i, carriers);
i++;
}
for(String state : getAllStates()) {
ps.setString(i, state);
i++;
}
答案 0 :(得分:1)
INTERVAL '1' MINUTE
无效。
语法为TO_DSINTERVAL( '0 00:' || TO_CHAR( ?, 'FM00' ) || ':00' )
(您无法为该值指定变量)。
如果要指定变量,则需要使用TO_DSINTERVAL()
类似的东西:
{{1}}
暂且
您似乎通过修改查询以获取多个绑定变量来将列表传递到查询中;你不需要这样做。相反,您可以将Oracle集合作为单个绑定变量传递。可以找到here的一个示例(稍微复杂一点,因为该示例适用于多维数组),但有一个更简单的示例here。
答案 1 :(得分:0)
子查询中WHERE
子句的最终条件应如下所示:
AND TN.LAST_UPDATEDATE > (CURRENT_TIMESTAMP - INTERVAL '10' MINUTE)
您需要将时间金额放在单引号中。
答案 2 :(得分:0)
使用interval
或to_dsinterval()
的更简单的解决方案是使用直接日期算法。您可以在日期时间或时间戳中添加或减去数字;数字以天为单位表示,因此如果您的输入(显示为?)以分钟为单位,则必须除以24 * 60。像这样:
... and tn.last_update > current_timestamp - ? / 24 * 60
请注意,这会将右侧更改为日期/时间(无小数秒),因此如果您需要几分之一秒,它将无法正常工作。