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
、それを更新し、それを使用して私の選択ステートメント)?
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メソッドを使用できます。
JDBCは行数によって混乱しています。
SET NOCOUNT ON
を使用する必要があります。
データ操作のようにexecute
ステートメントを使用挿入、更新、削除とデータの取得のようにexecuteQuery
を使用- 選択
プログラムを2つのステートメントに1つexecute
と1つexecuteQuery
に分けることをお勧めします。
そうしたくない場合は、ステートメントをセミコロンで区切ります。しかし、これにより結果セットが得られるかどうかはわかりません。
ms sqlでは、ストアドプロシージャの先頭でnocountを設定し、select/update/insert blockステートメントを「;」で終了する必要があります。