.execute() wird nicht fertig

Hallo,

ich möchte ein einfaches Update in einer Tabelle machen aber mein Statement wird irgendwie nicht fertig…
habe ich da irgend einen Fehler drinnen?

        
       
         if (gui.GUIBMÄndern.rBSperren.isSelected() == true) {
            
             if(gui.GUIBMÄndern.jTextFieldnummer.getText().length() >= 1 && gui.GUIBMÄndern.jTextFieldnummer2.getText().length() <= 0) 
            {
                System.out.println("start");
                String updateTableSQL  = "update Table_ST S set S.EVAL = 1 where S.VOL =5 and S.CN like ?";
           Connection conn = null;
                try {

                
                conn = _DB_Connection.getConnectionDB();
                //PreparedStatement stmt = null;
                
               

        PreparedStatement stmt = conn.prepareStatement(updateTableSQL);
        stmt.setString(1, "551%");
        stmt.execute();

        System.out.println(stmt.getResultSet().toString());
       

             
                }finally {               
       conn.close();
   }  ```

Bist Du sicher, dass da keine Exception fliegt? Würde die vom aufrufenden Code irgendwie behandelt werden?

ich hatte das auch schon mit catch … probiert um eine exception angezeigt zu bekommen, aber anscheinend wird keine geworfen…

wieviele Treffer erwartest Du und wie viele Einträge hat die Tabelle Table_ST ?
Gibt es einen Index auf Table_ST.CN?

bye
TT

es sollten 19 Rows upgedatet werden, also müsste das ziemlich schnell gehen und ja, auf der Tabelle ist ein Index

wechsle doch allein schon testweise auf eine einfachere Query
„update Table_ST S set S.EVAL = 1 where id = 5“
oder gar ein Select
„select count(*) from Table_ST“
dann freilich kein execute() mehr

ruhig auch auf eine parallel komplett neue leere Test-Tabelle X, um alle Probleme wie blockierende offene Transaktionen auszuschließen

das wird nicht direkt dein Problem lösen, aber zusätzliche Informationen sammeln:
was geht alles, bei welchem Schritt genau geht es nicht mehr?
liegt es an der Tabelle, liegt es an Update vs. Select, liegt es am LIKE?

wahrscheinlich musst du eh parallel in die DB schauen,
ein Tool um dort laufende Queries usw. zu erkennen wäre hilfreich,
bekannt/ vorhanden? welche DB?


das klingt ja nicht sehr vertrauensvoll,
Kenntnis vom Programmfluss? wer führt diese Query aus, eine GUI nach einem Button-Klick oder irgendein laufender Thread?
kontrolliere ob die GUI dauerhaft blockiert (gehen anderen Buttons danach?)/ lasse den Thread regelmäßg loggen, was immer der normalerweise danach macht,
da solltest du Klarheit schaffen

Also wenn ich ein Select mache dann läuft es ohne Probleme durch

DB ist Oracle 11g

Der SourceCode allgemein ist aber richtig, oder?

executeUpdate() statt execute() ist genauer, aber das sollte gehen, gewiss,
siehe auch Tutorials und wie gesagt kann man genau solche Teilpunkte viel besser abklären, wenn man nebenher auf einfachere Anwendungsfälle,
etwa ein Update in einer neuen Dummy-Tabelle (ohne kompliziere Indexe, Primary Key, andere Zugriffe im Programm usw.) oder auch dasselbe Update schon ohne LIKE, wechselt

genauer nachgeschaut ist das getResultSet() danach allerdings nicht sinnvoll,
dürfte hoffentlich Fehlermeldung geben,
zur Sicherheit solltest du aber nach execute() und vor diesem Aufruf eine einfache Ausgabe einbauen, nicht dass es doch an diesem Befehl liegt…

ich habe jetzt zum testen folgendes gemacht:

                //PreparedStatement stmt = null;
                
               System.out.println("vor:" + updateTableSQL);
               
        PreparedStatement stmt = conn.prepareStatement(updateTableSQL);
        //PreparedStatement stmt2 = conn.prepareStatement(test);
        stmt.setString(1, "555%");
        //stmt.executeQuery();
                stmt.executeUpdate();
     System.out.println("nach: " + stmt.executeUpdate());

 }finally {    
                    System.out.println("fertig");
       conn.close();
   }  

die Ausgabe:

vor:update update Table_ST S set S.EVAL = 1 where S.VOL =5 and S.CN like  555%'
fertig```

gut, das hätte nun auch jeder sehen können, kein Lobeslied,
aber zumindest geht es voran, also die „fertig“-Ausgabe bestätigt eben, dass es fertig ist,
mit dem finally wird Exception-Ausgabe übersprungen (edit: oder auch nicht, die Exception müsste dann weiter geworfen werden…),
so geht es jedenfalls besonders übersichtlich:

try { 
...
} catch (Exception e) {
  System.out.println("catch kommt dran");
  e.printStackTrace();
} finally {
 ...
}

sollte natürlich auch bekannt sein :wink:

was kommt nun hoffentlich an Fehlerausgabe?

edit: gut möglich allein wegen ResultSet,
immer noch hast du auch keine Ausgabe vor dem ResultSet-Aufruf, aber die Fehlermeldung klärt das womöglich auch schon

[QUOTE=garaq]ja, auf der Tabelle ist ein Index[/QUOTE]Ist CN der Primärschlüssel?
Außerden hast Du ja einen Teistring.-Vergleich, da wird der Index nicht ziehen…
Oracle kennt functionbased index. geht sowas in MySQL auch?

bye
TT

Danke, habs hinbekommen… bin nicht sicher was falsch war, aber ich denke am ehesten haben mit ’ ’ im SQL Statement gefehlt was er aber nicht als Fehler erkannt hat.