Eu queria saber se é possível executar algo assim usando JDBC.
"SELECT FROM * TABLE;INSERT INTO TABLE;"
Sim, é possível. Existem duas maneiras, pelo que eu sei. Eles são
- Definindo a propriedade de conexão do banco de dados para permitir várias consultas, separadas por um ponto e vírgula por padrão.
- Chamando um procedimento armazenado que retorna cursores implícitos.
Os exemplos a seguir demonstram as duas possibilidades acima.
Exemplo 1 : (para permitir consultas múltiplas):
Ao enviar uma solicitação de conexão, você precisa anexar uma propriedade de conexão allowMultiQueries=trueao url do banco de dados. Este é propriedade de conexão adicional para aqueles que já existe alguns, como autoReConnect=true, etc .. Os valores aceitáveis para allowMultiQueriespropriedade são true, false, yes, e no. Qualquer outro valor é rejeitado em tempo de execução com um SQLException.
String dbUrl = "jdbc:mysql:///test?allowMultiQueries=true";
A menos que tal instrução seja passada, um SQLExceptioné lançado.
Você tem que usar execute( String sql )ou suas outras variantes para buscar os resultados da execução da consulta.
boolean hasMoreResultSets = stmt.execute( multiQuerySqlString );
Para iterar e processar os resultados, você precisa das seguintes etapas:
READING_QUERY_RESULTS: // label
while ( hasMoreResultSets || stmt.getUpdateCount() != -1 ) {
if ( hasMoreResultSets ) {
Resultset rs = stmt.getResultSet();
// handle your rs here
} // if has rs
else { // if ddl/dml/...
int queryResult = 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
Exemplo 2 : etapas a seguir:
- Crie um procedimento com um ou mais
select, e DMLconsultas.
- Chame de java usando
CallableStatement.
- Você pode capturar vários
ResultSets executados no procedimento.
Os resultados de DML não podem ser capturados, mas podem emitir outro select
para descobrir como as linhas são afetadas na tabela.
Tabela de amostra e procedimento :
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)
Procedimento de chamada de Java :
CallableStatement cstmt = con.prepareCall( "call multi_query()" );
boolean hasMoreResultSets = cstmt.execute();
READING_QUERY_RESULTS:
while ( hasMoreResultSets ) {
Resultset rs = stmt.getResultSet();
// handle your rs here
} // while has more rs