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());
это потому, что я не могу выполнить несколько SQL-запросов в одном операторе (т. е., Создание #temp_table
, обновляя его, а затем используя для него мой оператор select)?
4 ответов
Я нашел аналогичный вопрос в StackOverflow здесь. Вы должны включить соединение для поддержки нескольких операторов и разделить их с помощью ;
. Конкретные примеры см. В этом ответе. Однако это только для 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
другой вариант-переместить операторы в хранимую процедуру и вызвать ее из JDBC с помощью CallableStatement
или может быть, вы должны попробовать выполнение его с несколькими операторами 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
на сбор данных как выберите
Я предлагаю вам разделить вашу программу на два заявления одно execute
и executeQuery
.
если вы не хотите этого делать, попробуйте разделить операторы с запятой. Но я не уверен в этом действии, если это дает вам resultset или нет.
в ms sql вам также нужно установить nocount справа в начале хранимой процедуры вместе с завершением инструкции select / update/ insert block С помощью ";"