2016-04-13 9 views
0

Ich versuche, ein Tool zu erstellen, das mySQL-Abfragen/Anweisungen in einer Datenbank ausführt. Das Problem, auf das ich stoße, ist, dass diese Abfragen/Anweisungen in einem freien Text wie ein Textfeld sind - ich benutze sie auch mit einem professionellen SQL-Programm. Um ein Beispiel zu geben, es so etwas wie sein würde:Kombinieren von SET-Anweisungen mit normalen Anweisungen

#Example of a query statement 
@SET fName = "John" 
SELECT * FROM Person WHERE Person.firstName = fName 

#Example of an execute statement 
@SET fName = "John" 
DELETE FROM Person WHERE Person.firstName = fName 

Wie Sie die Abfrage sehen/Aussage Kommentare enthalten, SET-Anweisungen und dann entweder eine Ausführungsanweisung oder eine Auswahlabfrage. Außerdem sind sie möglicherweise nicht immer richtig formatiert, so dass möglicherweise Leerzeilen zwischen Material oder Tabs oder Leerzeichen vorhanden sind.

Ich weiß über die Option mit PreparedStatements, aber während das funktionieren würde, passt es nicht wirklich die Rechnung der gesamten Abfrage/Anweisung, die als Freiformtext bearbeitet werden kann. Meine Frage ist, wie diese Anweisungen/Abfragen über Java ausgeführt werden? executeBatch würde für das zweite Beispiel funktionieren, aber nicht für das erste Beispiel, da es ein ResultSet zurückgibt.

+1

Sie müssen mit 'execute()' suchen, stellen Sie sicher, dass Sie die automatische Festschreibung deaktivieren. –

+0

Ermöglicht .setAutoCommit (false) das Stapeln von ausgeführten Anweisungen? Würde nur .execute() arbeiten an "@SET xxxx" Wenn ich die Anweisungen aufteilen und ausführen entweder .executeUpdate() oder .executeQuery() mit. SetAutoCommit (false) wird es mir erlauben, sie zu stapeln und sie danach zu begehen sie haben alle ausgeführt? – ZeW

+1

Ich benutze MySQL nicht regelmäßig, und ich habe nie '@ SET' verwendet, aber ich würde erwarten, dass diese nicht über Grenzen hinweg bestehen bleiben (ich könnte mich aber irren). Sie müssen ['execute'] (http://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#execute-java.lang.String-) verwenden, weil Sie dies nicht tun wissen, welche Art von Anweisung Sie im Voraus ausführen. Und ja, wenn Sie Auto-Commit deaktivieren, müssen Sie 'commit()' selbst auf dem Verbindungsobjekt aufrufen. –

Antwort

0

Lösung kommt mit Statement.execute aus() und nicht einer der spezifischen Funktionen wie .executeUpdate() oder .executeQuery() oder sogar .executeBatch()

Die Funktion .execute() gibt ein Boolescher Wert, um anzugeben, ob Ergebnisse zurückgegeben werden oder ob weitere Ergebnisse zu erzielen sind.

public void executeAll(String queryString) throws SQLException { 
    boolean hasMoreResults = statement.execute(queryString); 
    int updateCount = statement.getUpdateCount(); 

    while(hasMoreResults || (!hasMoreResults && updateCount != -1)){ 
     //.execute() can be false if a query is not returned as when using a SET/ UPDATE/ DELETE which is why we check if updateCount is -1 meaning there are no more statements returned 
     if(hasMoreResults){ 
      resultSet = statement.getResultSet(); 
      //Do what you need to do with the ResultSet 
     } else { 
      //Else it's a UPDATE/ DELETE count - int 
      //Do what you need to do with the updateCount 
     } 
     hasMoreResults = statement.getMoreResults(); 
     updateCount = statement.getUpdateCount(); 
     //New values for the next cycle 
    } 
    //Possibly return stuff? 
} 
Verwandte Themen