2016-08-14 2 views
0

에 대해 Java를 사용하지만이 예외가 발생하는 행 java.sql.SQLSyntaxErrorException: ORA-00928: missing SELECT keyword을 삭제하려고합니다. 누군가 제거/해결책을 알고 있다면 알려주십시오. 여기에 내 코드입니다 :여러 테이블에서 레코드를 삭제할 때 "java.sql.SQLSyntaxErrorException : ORA-00928 : SELECT 키워드가 없습니다"

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); 
    } 
+2

executeQuery가 select 문에 사용되므로 '누락 된 SELECT'오류가 발생합니다. @davidhxxx가 – Plirkee

답변

2

오라클은 한 번에 하나 개의 테이블에서 삭제를 지원하고, 나는 HQL은이 한계를 가지고 있다고 생각합니다. 이미 사용자 팀 Biegeleisen에 의해이 질문에 대해 제공되는 레코드의 삭제를 수행 할

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); 
+0

을 제안 했으므로 executeUpdate를 대신 사용하십시오 ... 제가 시도했지만 .. 여전히 같은 예외를 얻었습니다 ... 다른 방법이 있습니까? –

+1

어떤 SQL을 사용할 지 파악한 후에는 ('prepareStatement','st.setString (1, attendnt_N)') 바인드 변수를 사용하도록 변경하십시오. – Thilo

+0

@Thilo 준비된 문장을 사용하는 것은 매개 변수가 클라이언트 측에서 직접 오는 경우에만 필요한 IMO 일 수 있습니다. 여기에서는 그렇지 않을 수도 있습니다. –

0

올바른 방법 : 그래서 당신은 두 개의 별도 DELETE 문을 사용해야합니다. 테이블 구조가 무엇인지에 대해 많은 질문을 던지지는 마십시오. 실행중인 잠재적 성능 결함은 다음과 같습니다. m 사용중인 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의 기술을 사용하면 복잡한 작업이나 성능 문제없이 필요한 레코드를 효율적으로 삭제할 수 있습니다.

+0

Tim의 기술을 사용하고 있는데 'stmt.executeQuery ("select * from ATTENDANCE, ATTENDANTS");를'stmt.executeQuery ("select * from ATTENDANCE, ATTENDANTS ATTENDENCE.ATTENDANT_NAME ATTENDANTS.ATTENDANT_NAME 및 ATTENDANTS.ATTENDANT_NAME ATTENDANTS ATTENDANTS에서 선택하십시오. 당신이 말했듯이 이제는이 예외가 발생합니다. java.sql.SQLSyntaxErrorException : ORA-00933 : SQL 명령이 제대로 종료되지 않았습니다. –

+0

@Mee 제 응답을주의 깊게 읽으십시오. 나는 당신이하는 일이 실제로 필요하지 않다는 대안을 제시 한 후 언급했다. 수행자 이름이 어떤 값과 일치하는 Attendance 및 Attendants에서 레코드를 삭제하기 만하면됩니다. 따라서 로직 대신 Tim의 쿼리 만 실행하면됩니다. 또한 여기에 입력 한 예제는 IDE를 지원하지 않고 일부 대괄호가 누락 될 수 있습니다. SQL 개발자와 같은 IDE를 사용하여 구문에 대해 먼저 쿼리를 테스트하고 Java 코드에 배치하기 전에 작업을 중단하십시오 –

+0

내 실수 ... 물론 할 것입니다 .. 감사합니다 :) –

3

먼저 게시물을 주석 처리하면 코드가 더 읽기 어려워 질 수 있습니다.

Tim Biegeleisen이 맞습니다. 표에 의한 삭제는 하나만 수행해야하지만 명세서에 사용 된 방법도 변경해야합니다. stmt.executeQuery(dell)은 (는) 선택 검색어입니다.

의 ResultSet하는 executeQuery (문자열 SQL)

가 하나의 ResultSet 객체를 돌려주는, 지정된 SQL 문을 실행합니다 : 업데이트
은 오히려 문서에서 stmt.executeUpdate(dell) 봐를 사용합니다.

INT의 executeUpdate의 (문자열 SQL은)

이 같은 같은 INSERT, UPDATE, 또는 DELETE 문, 혹은 아무것도 돌려주지 않는 SQL 문이 될 가능성이있는 지정된 SQL 문을 실행 SQL DDL 문.

+0

이상한 ... 예외는 동일합니까? 질문에 새 버전의 코드를 게시 할 수 있습니까? 코드를 편집하지 말고 게시물 끝에 추가하십시오. 찾을 것입니다 :) – davidxxx

+0

이 쿼리에서 대괄호를 제거하지 않았습니다. (Attendant_Name = ' "+ attendnt_N +"') "; 대신에 나는 바깥 쪽을 제거했습니다 ... 이제 제거했습니다. 그리고 잘하고있어 ... 감사합니다 :) –

+0

좋아. 천만에요 :) – davidxxx