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

Posted

技术标签:

【中文标题】通过 java 类运行时出现 ORA-00936 错误【英文标题】:ORA-00936 error when running through java class 【发布时间】:2019-11-17 03:27:03 【问题描述】:

我需要将 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();

我迷路了,谢谢你的帮助

【问题讨论】:

您正在尝试准备一个不完整的查询 我不确定它有什么不完整的地方,如果我在 Oracle Developer 中输入,我在上面的代码中输出的查询,同样的查询有效 另外,您应该为此使用PreparedStatement。手动组装查询会导致 SQL 注入漏洞。 @Stephen C 我最初确实使用了 ps.setInt 语句,但它不起作用。于是改用硬编码方式 你应该使用 setArray: ***.com/a/189399/139985 【参考方案1】:

您的问题是您在完成构建查询之前正在准备查询。将最后一次赋值后的 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();

【讨论】:

以上是关于通过 java 类运行时出现 ORA-00936 错误的主要内容,如果未能解决你的问题,请参考以下文章

查询返回 ORA-00936: 缺少表达式

ORA-00936 缺少表达式

ORA-00936: 缺少表达式

ora:00936 缺少表达式错误

平均查询 ORA-00936 错误

ORA 00936 缺少表达式