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. Il y a deux façons, à ma connaissance. Ils 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. Il s'agit d'une propriété de connexion supplémentaire à celles qui existent déjà, comme autoReConnect=true
, etc.. Valeurs acceptables pour allowMultiQueries
propriété sont true
, false
, yes
, et no
. Toute autre valeur est rejetée à l'exécution avec une SQLException
.
String dbUrl = "jdbc:mysql:///test?allowMultiQueries=true";
À moins qu'une telle instruction ne soit transmise, une 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 itérer 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éer une procédure avec un ou plusieurs
select
, etDML
requêtes. - Appelez-le depuis Java en utilisant
CallableStatement
. - Vous pouvez capturer plusieurs
ResultSet
s exécuté dans la procédure.
Les résultats DML ne peuvent pas être capturés mais peuvent émettre un autreselect
pour savoir comment les lignes sont affectées dans le tableau.
Exemple de tableau et de 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)
Appel de procédure 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