获取有关从多个表中删除记录"java.sql.SQLSyntaxErrorException: ORA-00928: missing SELECT keyword"



我试图使用java删除对attendnt_N的行,但得到此异常java.sql.SQLSyntaxErrorException: ORA-00928: missing SELECT keyword。如果有人知道它的移除/解决方案,请告诉我。下面是我的代码:

ResultSet rss = stmt.executeQuery("select * from ATTENDANCE, ATTENDANTS");
    System.out.println(attendnt_N);   //working fine
    int countd = 0;
        while(rss.next()){
            countd++;
            if(attendnt_N.equalsIgnoreCase(rss.getString(1))){
                String dell = ("(DELETE FROM ATTENDANCE, ATTENDANTS WHERE Attendant_Name ='" + attendnt_N + "')");
                //String del = ("(DELETE FROM ATTENDANCE WHERE Attendant_Name ='" + attendnt_N + "')");   
                //String dell = ("(DELETE FROM ATTENDANTS WHERE Attendant_Name ='" + attendnt_N + "')");
                //stmt.executeQuery(del);
                stmt.executeQuery(dell);
                JOptionPane.showMessageDialog(null, "Record against "+ attendnt_N +" is Deleted");
                System.out.println("Deleted");
            }           
        }
    if(countd == 0){
        JOptionPane.showMessageDialog(null, "Record against "+ attendnt_N +" does not exist");
        System.out.println("Not Deleted");
        faceFrame.repaint();
        delBut.setEnabled(true);
    }

首先,您应该在发布时抑制注释的sql查询,这会使代码更难阅读。

Tim Biegeleisen是对的。您应该只执行一次按表删除操作,但还需要更改语句使用的方法。stmt.executeQuery(dell)用于选择查询。
要更新,请使用stmt.executeUpdate(dell)查看文档:

ResultSet executeQuery(String sql)

执行给定的SQL语句,返回单个ResultSet对象。

int executeUpdate(String sql)

执行给定的SQL语句,该语句可以是INSERT、UPDATE或DELETE语句或不返回任何值的SQL语句,例如SQL DDL语句

Oracle只支持一次从一个表中删除,我相信HQL也有这个限制。因此,您应该使用两个单独的DELETE语句:

String del1 = ("DELETE FROM ATTENDANCE WHERE Attendant_Name ='" + attendnt_N + "'";
String del2 = ("DELETE FROM ATTENDANTS WHERE Attendant_Name ='" + attendnt_N + "'";
stmt.executeUpdate(dell);
stmt.executeUpdate(del2);

执行记录删除的正确方法已经在用户Tim Biegeleisen的回答中提供了。虽然,这个问题并没有透露多少关于你的表结构是什么,有一个潜在的性能故障,你会遇到:米您正在使用的SELECT查询将导致CROSS JOIN。因此,下面的SELECT语句应该更改为使用更严格的连接,例如INNER join。

stmt.executeQuery("select * from ATTENDANCE, ATTENDANTS");

应该用

之类的东西代替
stmt.executeQuery("select * from ATTENDANCE, ATTENDANTS WHERE ATTENDENCE.ATTENDANT_NAME = ATTENDANTS.ATTENDANT_NAME AND ATTENDANTS.ATTENDANT_NAME = 'attendant1'").

但我认为这是不必要的。使用Tim的技术,您可以有效地删除所需的记录,而不会有太多的复杂性和性能影响。

相关内容

  • 没有找到相关文章

最新更新