Eu queria saber se é possível executar algo assim usando JDBC.
"SELECT FROM * TABLE;INSERT INTO TABLE;"
Sim, é possível. Existem duas maneiras, até onde eu sei. Eles estão
- Configurando a propriedade de conexão do banco de dados para permitir várias consultas, separadas por 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 várias consultas):
Ao enviar uma solicitação de conexão, você precisa anexar uma propriedade de conexão
allowMultiQueries=true para o URL do banco de dados. Esta é uma propriedade de conexão adicional àquelas que já existem, como autoReConnect=true , etc. Valores aceitáveis para allowMultiQueries propriedade 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, uma
SQLException é lançado. Você precisa usar
execute( String sql )
ou suas outras variantes para buscar 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 :Passos a seguir:
- Crie um procedimento com um ou mais
selecteDMLconsultas. - Chame-o de java usando
CallableStatement. - Você pode capturar vários
ResultSets executados no procedimento.
Os resultados DML não podem ser capturados, mas podem emitir outroselect
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)
Chamada de procedimento 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