web-dev-qa-db-ja.com

JDBC SQL SERVER:ステートメントは結果セットを返しませんでした

Microsoft SQL Server Studioから次のクエリを実行しています。これは正常に動作し、結果を表示します。

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 

ただし、Javaで同じクエリを実行すると、次のような例外がスローされます

ステートメントは結果セットを返しませんでした。

Javaコード:

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

それは、1つのステートメントで複数のSQLクエリを実行できないためです(つまり、#temp_table、それを更新し、それを使用して私の選択ステートメント)?

12
user2966439

StackOverflow here で同様の質問を見つけました。接続を有効にして複数のステートメントをサポートし、;を使用してそれらを分離する必要があります。具体的な例については、その回答を参照してください。ただし、MySql専用です。

また、あなたはあなたのSQLを単一のクエリに書き換えることができると思います

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

別のオプションは、ステートメントをストアドプロシージャに移動し、CallableStatementを使用してJDBCからそれを呼び出すことです。

または、次のような複数のjdbcステートメントで実行してみてください

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();

リソースを閉じる必要があることに注意してください。パフォーマンスを向上させるには、addBatchメソッドとexecuteBatchメソッドを使用できます。

2
Antanas

JDBCは行数によって混乱しています。

SET NOCOUNT ONを使用する必要があります。

31
John Gietzen

データ操作のようにexecuteステートメントを使用挿入、更新、削除データの取得のようにexecuteQueryを使用- 選択

プログラムを2つのステートメントに1つexecuteと1つexecuteQueryに分けることをお勧めします。

そうしたくない場合は、ステートメントをセミコロンで区切ります。しかし、これにより結果セットが得られるかどうかはわかりません。

18

ms sqlでは、ストアドプロシージャの先頭でnocountを設定し、select/update/insert blockステートメントを「;」で終了する必要があります。

1