Spring Boot集成Oracle时SQL在DBeaver正常但报ORA-00933语法错误
问题根因
- 核心错误点:Oracle数据库通过JDBC接口执行SQL时,不允许SQL语句末尾携带分号(
;)。你在DBeaver中执行正常是因为DBeaver作为数据库客户端会自动过滤掉语句末尾的分号后再提交请求,而应用直接把带分号的SQL提交给Oracle就会触发ORA-00933: SQL 命令未正确结束报错。 - 额外隐患:你当前手动拼接IN参数的写法存在SQL注入风险,同时如果传入的
userNames是空数组,执行substring截取时会直接报索引越界错误。
修复方案
快速修复(仅解决当前报错)
直接删掉SQL拼接逻辑末尾的分号即可:
把原代码中
+ ");\n";
修改为
+ ")\n";
推荐优化写法(避免注入+适配多场景)
使用Spring JdbcTemplate原生的参数绑定逻辑处理IN查询,不要手动拼接参数:
public List<UserFullNameDesignationDto> getUserFullNameDesignation(String[] userNames) { // 入参空校验 if (userNames == null || userNames.length == 0) { return Collections.emptyList(); } // 动态生成对应数量的占位符 String placeholders = String.join(",", Collections.nCopies(userNames.length, "?")); String sql = "SELECT " + " u.USERNAME, " + " u.FULL_NAME, " + " cd.NAME " + "FROM USER_ENTITY u " + "LEFT JOIN CORE_DESIGNATIONS cd ON u.DESIGNATION_ID = cd.ID " + "WHERE u.USERNAME IN (" + placeholders + ")"; var rowMapper = BeanPropertyRowMapper.newInstance(UserFullNameDesignationDto.class); return jdbcTemplate.query(sql, userNames, rowMapper); }
内容的提问来源于stack exchange,提问作者Black Swan
相关产品推荐
相关产品推荐

