Me preguntaba si es posible ejecutar algo como esto usando JDBC.
"SELECT FROM * TABLE;INSERT INTO TABLE;"
Sí, es posible. Hay dos formas, que yo sepa. ellos son
- Configurando la propiedad de conexión de la base de datos para permitir múltiples consultas, separadas por un punto y coma de forma predeterminada.
- Al llamar 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. Esta es una propiedad de conexión adicional a las que ya existen, como autoReConnect=true
, etc. Valores aceptables para allowMultiQueries
propiedad son true
, false
, yes
y no
. Cualquier otro valor se rechaza en tiempo de ejecución con una SQLException
.
String dbUrl = "jdbc:mysql:///test?allowMultiQueries=true";
A menos que se pase dicha instrucción, una SQLException
es arrojado.
Tienes que 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 uno o más
select
yDML
consultas. - Llámalo desde java usando
CallableStatement
. - Puede capturar múltiples
ResultSet
s ejecutados en el procedimiento.
Los resultados de DML no se pueden capturar pero se puede emitir otroselect
para encontrar 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