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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 16:36:03