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
相关产品推荐
相关产品推荐

