2013-06-19 3 views
-2

자바 프로그램에서 준비된 문을 사용하여 데이터베이스에 연결하고 테이블을 업데이트하려고합니다. 데이터베이스는 "데이터베이스"라고하며, 뷰에는 다른 뷰가있는 폴더가 있습니다. 내가 업데이트하려고하는 테이블 ("TABLE")입니다. 여기 내 코드는 다음과 같습니다.자바에서 준비된 SQL 문

public void updateTable(Map<String, String> mp) throws SQLException { 

    String URL = "jdbc:oracle:thin:@localhost:1500:orcl"; 
    String USER = "user"; 
    String PASS = "password"; 
    Connection con = DriverManager.getConnection(URL, USER, PASS); 

    PreparedStatement updateTableName = null; 


    String updateString = 
     "update database.Views.TABLE " + 
     "set TABLENAME = ? " + 
     "where TABLENAME = ?"; 

    try { 
     con.setAutoCommit(false); 
     updateTableName = con.prepareStatement(updateString); 

     for (Map.Entry<String, String> e : mp.entrySet()) 
     { 
      updateTableName.setString(1, e.getValue()); 
      updateTableName.setString(2, e.getKey()); 
      updateTableName.executeUpdate(); 
      con.commit(); 

     } 

    } catch (SQLException e) { 

     if (con != null) 
     { 
      try { 
       System.err.print("Transaction is being rolled back"); 
       con.rollback(); 
      } catch (SQLException excep) { 

      } 
     } 
    } finally { 
     if (updateTableName != null) 
     { 
      updateTableName.close(); 
     } 
     con.setAutoCommit(true); 
} 
    con.close(); 
} 

코드를 실행할 때마다 "트랜잭션이 롤백 중입니다."라는 메시지가 나타납니다. try 문에 어떤 오류가 있습니까? 미리 감사드립니다!

EDIT : 예외를 인쇄하도록 변경하면 ORA-00971 : SET 키워드가 누락됩니다.

+4

대신 바로 잡기, 인쇄/로깅 예외가 전자에게 약간의 단서를 GIV 수 – kosa

+3

디를 예외를 읽었 니? – SLaks

답변

0

난 그냥 TABLE1 업데이트와 간단한 쿼리로 변경했지만 나는 또한 꺼내서 @Spiff 내가 그것을 알아 냈 확인 :

String updateString = 
    "update database.Views.TABLE " + 
    "set TABLENAME = ? " + 
    "where TABLENAME = ?"; 

을하고

하나 개의 라인으로 결합
updateTableName = con.prepareStatement(updateString) 

을 만들려면 :

updateTableName = con.prepareStatement(update TABLE1 set TABLENAME = ? where TABLENAME = ?); 
+0

위대한, 다행 작동합니다! – Spiff

6
"update database.Views.TABLE" + 
    "set TABLENAME = ?" + 
    "where TABLENAME = ?"; 

이 문자열의 값은 유효한 SQL하지

update database.Views.TABLEset TABLENAME = ?where TABLENAME = ? 

입니다.

+0

나는 공간을 엉망으로 만들었지 만, "database.Views.TABLE"은 유효하지 않습니까? – user22

+0

@ user22 간격을 고정 시키려고 했습니까? – djechlin

+0

@djechlin 그래, 내가 그걸 고친다 – user22

0

첫 번째 catch 블록에서 catch하는 SQLException 로깅을 시도하면 문제가 무엇인지 명확히 알 수 있습니다.

어쨌든 TABLE은 SQL 예약 키워드이므로 더 나은 이름이 없으므로 적어도 이름을 TABLE1으로 바꾸어보십시오.

+0

테이블은 내 프로그램에서 다른 이름으로 방금 여기에서 변경 했으므로 문제가되지 않습니다. 하지만 로그에 "누락 된 SET 키워드"라고 표시됩니다. – user22

+0

지금 쿼리는 어떻게 생겼습니까? 간격 문제가 해결되지 않은 것 같습니다. – Spiff

+0

이제 간격을 편집하여 편집했습니다. – user22