it-swarm.com.de

JDBC SQL SERVER: Die Anweisung hat keine Ergebnismenge zurückgegeben

Ich führe die folgende Abfrage aus Microsoft SQL Server Studio aus, die einwandfrei funktioniert und Ergebnisse anzeigt:

SELECT *
INTO   #temp_table
FROM   md_criteria_join
WHERE  user_name = 'tecgaw'

UPDATE #temp_table
SET    user_name = 'tec'
WHERE  user_name != 'tec'

SELECT *
FROM   md_criteria_join
WHERE  user_name = 'tec'
   AND view_name NOT IN (SELECT view_name
                         FROM   md_criteria_join
                         WHERE  user_name = 'tecgaw')
UNION
SELECT *
FROM   #temp_table
ORDER  BY view_name,
      user_name,
      crit_usage_seq,
      crit_join_seq 

Wenn ich jedoch dieselbe Abfrage in Java ausführe, wird eine Ausnahme ausgegeben, in der "Die Anweisung hat keine Ergebnismenge zurückgegeben." Hier ist der Java-Code:

statement = conn.getConnection().createStatement();
resultSet = stmt.executeQuery(sql.toString());

Ist das so, weil ich nicht mehrere SQL-Abfragen in einer Anweisung ausführen kann (d. H., #temp_table erstellen, aktualisieren und dann meine select-Anweisung dafür verwenden)?

10
user2966439

Ich habe eine ähnliche Frage in StackOverflow hier gefunden. Sie sollten die Verbindung aktivieren, um mehrere Anweisungen zu unterstützen, und diese mit ; trennen. Für konkrete Beispiele siehe diese Antwort. Es ist jedoch nur für MySql.

Ich denke auch, dass Sie Ihre SQL in eine einzelne Abfrage umschreiben können

SELECT columnA, columnB, 'tec' as user_name from md_criteria_join
WHERE (
       user_name = 'tec' 
   AND view_name NOT IN (
       SELECT view_name 
       FROM md_criteria_join 
       WHERE user_name = 'tecgaw')
   )
   OR user_name = 'tecgaw' 
ORDER BY view_name, user_name, crit_usage_seq, crit_join_seq

Eine andere Option besteht darin, Ihre Anweisungen in eine gespeicherte Prozedur zu verschieben und sie von JDBC mithilfe von CallableStatement abzurufen

Oder vielleicht sollten Sie es mit mehreren jdbc-Anweisungen wie diesen ausführen

Connection conn = conn.getConnection(); //just to make sure its on single connection
conn.createStatement("SELECT INTO #temp_table").executeUpdate();
conn.createStatement("UPDATE #temp_table").executeUpdate();
conn.createStatement("SELECT ...").executeQuery();

Beachten Sie, dass Sie Ressourcen schließen müssen, und für eine bessere Leistung können Sie die Methoden addBatch und executeBatch verwenden

3
Antanas

JDBC wird durch die Anzahl der Zeilen verwirrt.

Sie müssen SET NOCOUNT ON verwenden.

25
John Gietzen

Verwenden Sie die execute-Anweisung für Datenmanipulation wie Einfügen, Aktualisieren und Löschen und executeQuery für Datenabruf wie select

Ich empfehle Ihnen, Ihr Programm in zwei Anweisungen zu teilen: eine execute und eine executeQuery.

Wenn Sie dies nicht möchten, trennen Sie die Anweisungen mit Semikolon. Ich bin mir jedoch nicht sicher, ob dies zu einer Ergebnismenge führt oder nicht.

17

in ms sql müssen Sie auch nocount direkt zu Beginn der gespeicherten Prozedur setzen und die select/update/insert Blockanweisung mit ";" beenden.

1