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

JDBC调用executeQuery执行SET SCHEMA语句出现SQLException如何解决?

错误原因

  • 直接触发报错的原因是执行SET SCHEMA CECS323LAB语句时错误调用了executeQuery()方法:executeQuery()仅适用于执行返回ResultSet结果集的查询语句(通常是SELECT类语句),而SET语句属于DDL操作,不会返回结果集,只会返回操作计数,不符合executeQuery()的调用要求。
  • 除此之外代码还存在SQL拼接语法错误:拼接select OrderDate和from ORDERS时没有加空格,最终生成的SQL会出现OrderDatefrom的错误拼接,修复完第一个问题后也会触发SQL语法报错。

修复方案

  1. 替换SET SCHEMA语句的执行方法,把prep.executeQuery()改为prep.execute()或者prep.executeUpdate()均可。
  2. 修正SQL拼接的空格问题,在select OrderDate末尾加空格,where PRODUCTNAME = ?末尾也加空格,避免拼接后关键词粘连。
  3. 可选优化:原代码中CustomerName的模糊匹配值是硬编码写死的%Euro%,如果需要动态传入可以把这个部分也改成占位符,避免SQL注入风险。

修复后参考代码

PreparedStatement prep = null;

try {
    prep = conn.prepareStatement("SET SCHEMA CECS323LAB");
    // 替换为适配非查询语句的execute方法
    prep.execute();

    // 修正拼接空格问题
    String query = "select OrderDate " +
            "from ORDERS O inner join ORDERDETAILS OD on O.ORDERNUMBER = OD.ORDERNUMBER " +
            "inner join PRODUCTS P on P.PRODUCTCODE = OD.PRODUCTCODE " +
            "where PRODUCTNAME = ? " +
            "and CUSTOMERNUMBER = ( select CUSTOMERNUMBER from CUSTOMERS where CUSTOMERNAME like ? )";

    assert conn != null;
    prep = conn.prepareStatement(query);

    prep.setString(1, "1957 Chevy Pickup");
    // 动态传入客户名的模糊匹配参数
    prep.setString(2, "%Euro%");

    ResultSet data = prep.executeQuery();
}

内容的提问来源于stack exchange,提问作者Abhay Solanki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:54:06