LINUX.ORG.RU

DDL-запрос и select в одном Statement

 ,


0

1

Есть пара запросов, примерно таких:

drop table if exists temp_table ;
select * into temp table temp_table
	from real_table ;
select * from temp_table ;
create extension if exists dblink ;
select * from some_table ;

и соответственно примерно такой код:

try (Statement stmt = dataSource.getConnection().createStatement()) {
	boolean results = stmt.execute(request.query);
	while (results) {
		try (ResultSet rs = stmt.getResultSet()) {
			// process
		}
		results = stmt.getMoreResults();
	}
}

В результате Statement не возвращает ни одного ResultSet'а, хотя, если в запросе просто несколько select'ов, типа

select * from some_table ;
select * from another_table ;

Вопрос: почему statement не возвращает ResultSet('ы) и можно ли как-то эти запросы выполнить, чтобы возвращал?

// PostgreSQL 9.5

★★★★★

Последнее исправление: korvin_ (всего исправлений: 1)
Ответ на: комментарий от Deleted

зачем это выполнять при каждом селекте?

Конкретно это не обязательно. Первый пример, с временной таблицей, тоже не возвращает ResultSet'ов.

korvin_ ★★★★★
() автор топика
Ответ на: комментарий от korvin_

Ну ок:

Temporary tables are automatically dropped at the end of a session, or optionally at the end of the current transaction (see ON COMMIT below).

То бишь дропакть временную таблицу, это какой-то изврат.

Deleted
()
Ответ на: комментарий от Deleted

То бишь дропакть временную таблицу, это какой-то изврат.

Да г-ди, забей на drop. Вот это тоже не работает:

select * into temp table temp_table
	from real_table ;
select * from temp_table ;
korvin_ ★★★★★
() автор топика
Ответ на: комментарий от looper

Надо вместо stmt.execute использовать executeQuery

Как ты тогда предлагаешь читать несколько ResultSet'ов? executeQuery возвращает один, а если в запросе несколько select'ов, то вылетит исключение «statement didn't return result set» или типа того.

korvin_ ★★★★★
() автор топика

Не знаю что ты пытаешься тут сделать, но смешивать DML и DDL нельзя. DDL не транзакционные, а еще во многих СУБД выполнение DDL вызывает неявный коммит.

Aber ★★★★★
()
Последнее исправление: Aber (всего исправлений: 1)

А зачем?

anonymous
()
Ответ на: комментарий от Deleted

а тут ты делаешь инсерт. для него есть executeUpdate

Ок, попробую.

korvin_ ★★★★★
() автор топика
Ответ на: комментарий от looper

Обьедини два запроса в помощью union

Э-м… А то, что у них разные наборы колонок — это ничего? Насколько я помню, для union'ов набор колонок должен быть одинаковым. И вообще как ты предлагаешь union'ом объединить insert и последующий select?

korvin_ ★★★★★
() автор топика
Ответ на: комментарий от Aber

Не знаю что ты пытаешься тут сделать, но смешивать DML и DDL нельзя. DDL не транзакционные, а еще во многих СУБД выполнение DDL вызывает неявный коммит.

Что-то а ля pgAdmin'ского Query executor или как он там называется, только крайне простого, нужно только выполнять запросы.

korvin_ ★★★★★
() автор топика

Непонятно, чего ты хочешь добиться. В execute обычно передаётся ровно один запрос, в твоём случае это select (без точки с запятой в конце), который выполняется и его результат можно считать через ResultSet. Если тебе надо выполнить несколько запросов, просто выполняй из по очереди.

Legioner ★★★★★
()
Ответ на: комментарий от Aber

Не знаю что ты пытаешься тут сделать, но смешивать DML и DDL нельзя.

Можно.

DDL не транзакционные,

Транзакционные.

а еще во многих СУБД выполнение DDL вызывает неявный коммит.

Если «многие СУБД» = Oracle (может, MySQL ещё, не помню), то да. ;)

anonymous
()
Ответ на: комментарий от Legioner

Если тебе надо выполнить несколько запросов, просто выполняй из по очереди.

+1. Зачем Вам несколько запросов за один раз?

Вообще PostgreSQL это может (см. https://www.postgresql.org/docs/current/static/protocol-flow.html#idm46428663... ), но не без заморочек/ограничений, насколько я помню.

Плюс, Ваше клиентское API должно это поддерживать... т.е. проблема здесь вообще не в PostgreSQL.

anonymous
()
Ответ на: комментарий от Legioner

Непонятно, чего ты хочешь добиться. В execute обычно передаётся ровно один запрос, в твоём случае это select (без точки с запятой в конце), который выполняется и его результат можно считать через ResultSet. Если тебе надо выполнить несколько запросов, просто выполняй их по очереди.

Это несколько менее удобно, но, видимо так и придётся сделать.

korvin_ ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.