Me preguntaba si es posible ejecutar algo como esto usando JDBC.
"SELECT FROM * TABLE;INSERT INTO TABLE;"
Sí, es posible. Hay dos formas, hasta donde yo sé. Son
- Estableciendo la propiedad de conexión de la base de datos para permitir múltiples consultas, separadas por un punto y coma por defecto.
- Llamando a un procedimiento almacenado que devuelve cursores implícitos.
Los siguientes ejemplos demuestran las dos posibilidades anteriores.
Ejemplo 1 : (para permitir múltiples consultas):
Al enviar una solicitud de conexión, debe agregar una propiedad de conexión allowMultiQueries=true
a la URL de la base de datos. Esto es propiedad de conexión adicionales a los que ya existe, si algunos, como autoReConnect=true
, etc .. Los valores aceptables para allowMultiQueries
la propiedad son true
, false
, yes
, y no
. Cualquier otro valor se rechaza en tiempo de ejecución con un SQLException
.
String dbUrl = "jdbc:mysql:///test?allowMultiQueries=true";
A menos que se apruebe tal instrucción, SQLException
se lanza un.
Debe usar execute( String sql )
o sus otras variantes para obtener resultados de la ejecución de la consulta.
boolean hasMoreResultSets = stmt.execute( multiQuerySqlString );
Para iterar y procesar los resultados, necesita los siguientes pasos:
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
Ejemplo 2 : Pasos a seguir:
- Cree un procedimiento con una o más consultas
select
y DML
.
- Llámelo desde java usando
CallableStatement
.
- Puede capturar varios mensajes de correo
ResultSet
electrónico ejecutados en el procedimiento.
Los resultados de DML no se pueden capturar, pero pueden emitir otro select
para averiguar cómo se ven afectadas las filas en la tabla.
Tabla de muestra y procedimiento :
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)
Procedimiento de llamada desde 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