通过Java类运行时出现ORA-00936错误

问题描述 投票:-2回答:1

我必须将OracleDataSource用于学校项目。我已经在Oracle Developer上创建并测试了查询,并且得到了正确的输出。当我尝试通过Java代码执行查询时,出现以下错误:java.sql.SQLSyntaxErrorException: ORA-00936: missing expression。我在网上做了一些挖掘,有人说这可能是由于WHERE子句引起的。所以我在执行查询之前先打印出查询。查询是这样的:SELECT b.ISBN, b.TITLE, COUNT(*) FROM BOOKS b JOIN BOOK_SUBJECT bs ON bs.ISBN = b.ISBN WHERE bs.SUBJECT_ID IN (47,46,43) GROUP BY b.ISBN, b.TITLE ORDER BY COUNT(*) DESC如果我在Developer中键入相同的查询,它将起作用,但是当我运行java类时,会出现ORA错误。我正在以这种方式形成我的查询:

  Statement stmt = conn.createStatement();
  String query = "SELECT b.ISBN, b.TITLE, COUNT(*) FROM BOOKS b JOIN BOOK_SUBJECT bs ON bs.ISBN = b.ISBN WHERE bs.SUBJECT_ID IN (";
  PreparedStatement ps = conn.prepareStatement(query);

  for(int i = 0; i < args.length; i++) {
    //int psVar = i + 1; 
    //ps.setInt(psVar, Integer.parseInt(args[i]));
    if(i == args.length - 1) {
        query += args[i] + ")";
    } else {
        query += args[i] + ",";
    }
  }

  query += " GROUP BY b.ISBN, b.TITLE ORDER BY COUNT(*) DESC";

  //Execute the query
  System.out.println(query);
  ResultSet rset = ps.executeQuery();

我迷路了,谢谢您的帮助

java sql oracle ods
1个回答
4
投票

您的问题是,在构造查询之前,您正在准备查询。将最后一次分配后的PreparedStatement ps = conn.prepareStatement(query);移至query,并对每个参数使用占位符:

Statement stmt = conn.createStatement();
String query = "SELECT b.ISBN, b.TITLE, COUNT(*) FROM BOOKS b JOIN BOOK_SUBJECT bs ON bs.ISBN = b.ISBN WHERE bs.SUBJECT_ID IN (";

for(int i = 0; i < args.length; i++) {
  if(i == args.length - 1) {
    query += "?)";
  } else {
    query += "?, ";
  }
}

query += " GROUP BY b.ISBN, b.TITLE ORDER BY COUNT(*) DESC";
PreparedStatement ps = conn.prepareStatement(query);

for(int i = 0; i < args.length; i++) {
  int psVar = i + 1; 
  ps.setInt(psVar, Integer.parseInt(args[i]));
}

ResultSet rset = ps.executeQuery();
© www.soinside.com 2019 - 2024. All rights reserved.