Multiple queries executed in java in single statement
Несколько запросов, выполняемых на Java в одном операторе
Привет, мне было интересно, возможно ли выполнить что-то подобное с помощью JDBC, поскольку в настоящее время он предоставляет исключение, хотя это возможно в браузере запросов MySQL.
"SELECT FROM * TABLE;INSERT INTO TABLE;"
Хотя я понимаю, что это возможно при разделении строки SQL-запроса и выполнении оператора дважды, но мне было интересно, существует ли одноразовый подход для этого.
Мне было интересно, возможно ли выполнить что-то подобное с помощью JDBC.
"SELECT * FROMTABLE;INSERT INTO TABLE;"
Да, это возможно. Насколько я знаю, есть два способа. Они
Установив свойство подключения к базе данных так, чтобы разрешать выполнение нескольких запросов, по умолчанию разделяемых точкой с запятой.
Путем вызова хранимой процедуры, которая неявно возвращает курсоры.
Следующие примеры демонстрируют две вышеупомянутые возможности.
Пример 1: ( Чтобы разрешить несколько запросов ):
При отправке запроса на подключение вам необходимо добавить свойство connection allowMultiQueries=true к URL-адресу базы данных. Это дополнительное свойство подключения к тем, которые уже существуют, например, autoReConnect=true, и т.д. Допустимыми значениями для allowMultiQueries свойства являются true, false, yes, и no. Любое другое значение отклоняется во время выполнения с помощью SQLException.
Для перебора и обработки результатов вам потребуются следующие шаги:
READING_QUERY_RESULTS: // label while ( hasMoreResultSets || stmt.getUpdateCount() != -1 ) { if ( hasMoreResultSets ) { Resultsetrs= stmt.getResultSet(); // handle your rs here } // if has rs else { // if ddl/dml/... intqueryResult= stmt.getUpdateCount(); if ( queryResult == -1 ) { // no more queries processed break READING_QUERY_RESULTS; } // no more queries processed // handle success, failure, generated keys, etc here } // if ddl/dml/...
// check to continue in the loop hasMoreResultSets = stmt.getMoreResults(); } // while results
Пример 2: шаги, которым следует следовать:
Создайте процедуру с одним или несколькими select, и DML запросы.
Вызовите его из java с помощью CallableStatement.
Вы можете записывать несколько ResultSetзапросов, выполняемых в процедуре. Результаты DML не могут быть записаны, но могут выдавать другие select чтобы определить, как изменяются строки в таблице.
Пример таблицы и процедуры:
mysql> create table tbl_mq( i int not null auto_increment, name varchar(10), primary key (i) ); Query OK, 0 rows affected (0.16 sec)
mysql> delimiter // mysql> create procedure multi_query() -> begin -> select count(*) as name_count from tbl_mq; -> insert into tbl_mq( names ) values ( 'ravi' ); -> select last_insert_id(); -> select * from tbl_mq; -> end; -> // Query OK, 0 rows affected (0.02 sec) mysql> delimiter ; mysql> call multi_query(); +------------+ | name_count | +------------+ | 0 | +------------+ 1 row in set (0.00 sec)
+------------------+ | last_insert_id() | +------------------+ | 3 | +------------------+ 1 row in set (0.00 sec)
+---+------+ | i | name | +---+------+ | 1 | ravi | +---+------+ 1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Процедура вызова из Java:
CallableStatementcstmt= con.prepareCall( "call multi_query()" ); booleanhasMoreResultSets= cstmt.execute(); READING_QUERY_RESULTS: while ( hasMoreResultSets ) { Resultsetrs= stmt.getResultSet(); // handle your rs here } // while has more rs
Ответ 2
Вы можете использовать пакетное обновление, но запросы должны быть запросами действия (т. Е. Вставки, обновления и удаления)
Statements= c.createStatement(); Strings1="update emp set name='abc' where salary=984"; Strings2="insert into emp values ('Osama',1420)"; s.addBatch(s1); s.addBatch(s2); s.executeBatch();
Ответ 3
Подсказка: если у вас есть более одного свойства connection, разделите их с помощью: