2012-03-28 4 views
0

ich eine Demo-Anwendung haben für Update-Abfrage zu überprüfen, wählenjava.sql.SQLException: ORA-01002: holen aus Sequenz

public class Test implements Runnable{ 

    public Test() { 
    } 

    public static void main(String[] args) { 
     Thread t1 = new Thread(new Test()); 
     Thread t2 = new Thread(new Test()); 

     t1.start(); 
     t2.start(); 
    } 

    public void run() { 
     // TODO Auto-generated method stub 
     try{ 
      String updateWith = ""; 
      String sel = "SELECT SIDNUMBERTO FROM tblmserialbatchdetail WHERE sidnumberto = ("+ 
      "SELECT max(sidnumberto) FROM tblmserialbatchdetail WHERE generationmode='A' and nvl(serialprefix,' ') = nvl('',' ') " + 
      "and sidlengthwithoutprefix =12) FOR UPDATE"; 
      //System.out.println("SELECT QUERY ===: "+sel); 
      String updatequery = "update tblmserialbatchdetail set sidnumberto = ? where serialbatchid = ?"; 
      System.out.println(); 
      Connection connection = Conn.getDBConnection(); 
      PreparedStatement pStatement = connection.prepareStatement(sel); 

      ResultSet rSet = pStatement.executeQuery(); 

      while(rSet.next()){ 

       updateWith = rSet.getString(1); 
       long value = Long.parseLong(updateWith)+1; 
       updateWith = String.valueOf(value); 
       System.out.println("resulet To be Updated ===> "+value); 
      } 
      connection.commit(); 
      connection.close(); 



     }catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

Dies funktioniert gut, wenn ich sonst Fehler geben Sie mir für den Umstieg von Auswahlabfrage entfernen

java.sql.SQLException: ORA-01002: fetch out of sequence 

    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:180) 
    at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:208) 
    at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:543) 
    at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1451) 
    at oracle.jdbc.ttc7.TTC7Protocol.fetch(TTC7Protocol.java:943) 
    at oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:2119) 
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2324) 
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:421) 
    at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:365) 
    at com.response.Test.run(Test.java:47) 
    at java.lang.Thread.run(Thread.java:595) 

Antwort

6

SELCT ... FOR UPDATE ist nur im Kontext einer verwalteten Transaktion sinnvoll, da Sperren für die ausgewählten Zeilen erforderlich sind.

Standardmäßig verwendet JDBC keine verwaltete Transaktion. Sie verwendet eine implizit erstellte Transaktion, die festgeschrieben wird, sobald die Abfrage ausgeführt wird. Dies wird die Semantik von SELECT ... FOR UPDATE brechen, und der JDBC-Treiber beschwert sich.

Um eine verwaltete Transaktion zu verwenden, fügen Sie

connection.setAutoCommit(false); 

bevor Sie die Abfrage ausführen. Führen Sie anschließend connection.commit() aus.

+0

Ja, es funktioniert, aber jetzt gestoppt Prozess in Zeile ResultSet rSet = pStatement.executeQuery(); – chetan

+0

Warum Prozess gestoppt? – chetan

+0

@chetan: Wahrscheinlich, weil es das Schloss nicht herausnehmen kann, weil etwas anderes es bereits gesperrt hat. Unmöglich, das zu sagen. – skaffman

0

Versuchen:

connection.setAutoCommit(false); 

Als allgemeine Anmerkung, 'wählen ... for update' ist nicht die beste lo Cking-Strategie.

+1

können Sie Ihre Antwort erklären? –

+0

Aber hat es funktioniert? – maximdim

+0

können Sie bitte alternative zur Verfügung stellen? – chetan

0

Anstatt executeQuery zu verwenden, können Sie die Funktion executeUpdate verwenden. Verwenden Sie nicht "Wählen Sie für Update" anstatt direkt versuchen, die Zeilen in einer Transaktion zu aktualisieren, Dies wird Ihnen die aktualisierte Anzahl der Zeilen. Wenn zum Beispiel zwei Transaktionen versuchen, eine Zeile zu aktualisieren, wird zuerst eine andere Null zurückgegeben, und Sie wissen, dass die erste Aktualisierung erfolgreich ist, da sie aktualisierte Zeilenanzahl zurückgibt.

Verwandte Themen