Je me demandais s'il était possible d'exécuter quelque chose comme ça en utilisant JDBC.
"SELECT FROM * TABLE;INSERT INTO TABLE;"
Oui c'est possible. Pour autant que je sache, il y a deux façons. Elles sont
- En définissant la propriété de connexion à la base de données pour autoriser plusieurs requêtes, séparées par un point-virgule par défaut.
- En appelant une procédure stockée qui renvoie des curseurs implicites.
Les exemples suivants illustrent les deux possibilités ci-dessus.
Exemple 1 : (Pour autoriser plusieurs requêtes):
Lors de l'envoi d'une demande de connexion, vous devez ajouter une propriété de connexion allowMultiQueries=true
à l'URL de la base de données. C'est une propriété de connexion supplémentaire à ceux si existe déjà certains, comme autoReConnect=true
, etc .. Les valeurs acceptables pour la allowMultiQueries
propriété sont true
, false
, yes
et no
. Toute autre valeur est rejetée lors de l'exécution avec un SQLException
.
String dbUrl = "jdbc:mysql:///test?allowMultiQueries=true";
À moins qu'une telle instruction ne soit passée, un SQLException
est lancé.
Vous devez utiliser execute( String sql )
ou ses autres variantes pour récupérer les résultats de l'exécution de la requête.
boolean hasMoreResultSets = stmt.execute( multiQuerySqlString );
Pour parcourir et traiter les résultats, vous devez suivre les étapes suivantes:
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
Exemple 2 : étapes à suivre:
- Créez une procédure avec une ou plusieurs requêtes
select
et DML
.
- Appelez-le depuis Java en utilisant
CallableStatement
.
- Vous pouvez capturer plusieurs
ResultSet
s exécutés dans la procédure.
Les résultats DML ne peuvent pas être capturés mais peuvent en émettre un autre select
pour déterminer comment les lignes sont affectées dans le tableau.
Exemple de tableau et procédure :
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)
Procédure d'appel depuis 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