You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ORA-00907缺失右括号错误排查:SQL动态拼接问题求助

问题:动态拼接SQL触发ORA-00907: missing right parenthesis错误

我通过Selenium从网站提取数据存入ArrayList后,执行SQL查询数据库时触发了ORA-00907: missing right parenthesis错误。手动拼接的示例SQL(如IN ('john','sam','smith','mary','lili','happy'))能正常运行,但动态拼接就报错。相关Java代码如下:

public static void build(){
 Connection con = null;
 ResultSet rs = null;
 Statement stms = null;

 String buildXML ="";

 String list = lists.stream().collect(Collectors.joining("','"));

 try {
  <<<database>>>
  <<<connection>>>

  rs = stmt.executeQuery("select name, type, dob, age, height, weight from peopleH where name in ('" + list + "') and age !=0 and dob !=0"); <-- *error here?!?*

  while(rs.next()){
   for(int i=0; lists.size() > i; i++){
     if(<<does not contain the name>>){
      <<<<do this>>>>
     }
     else {
      <<<<do that>>>>
     }
   }
  }
 }
catch(){
} finally{
}
}

预期流程:用Selenium过滤提取数据到ArrayList,再通过上述SQL查询数据库,对比浏览器展示内容,但查询报错,已检查无多余逗号或逻辑错误,请求排查原因。


排查方向
  • 检查列表中的特殊字符:如果ArrayList里的名字包含单引号(比如O'Neil),动态拼接后会破坏SQL语法。比如名字是O'Neil,拼接后会变成IN ('O'Neil','sam'),未转义的单引号会截断字符串,Oracle解析时出现语法混乱,误报缺失括号。
  • 打印验证完整SQL:在执行executeQuery前,把拼接好的SQL打印出来(比如System.out.println("拼接后SQL: " + "select name...");),和手动执行的正常SQL逐字符对比。比如lists为空时会生成IN (''),部分Oracle版本对空IN列表处理异常,也会触发语法错误。
  • 核对变量名是否正确:代码里声明的是Statement stms = null;,但执行时用的是stmt.executeQuery,如果stmt未正确初始化,可能导致异常信息不准确,误报缺失括号。
  • 修正日期字段的判断逻辑:如果dob是日期类型,dob !=0属于非法语法,Oracle解析失败后可能误报缺失括号,应该换成dob IS NOT NULL或者和具体日期值比较。

内容的提问来源于stack exchange,提问作者Trong Nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 15:40:50