Obtenir plusieurs sets de résultats avec JDBC ne fonctionne pas

Je devrais appeler la procédure stockée de la database de SQL Server de tiers (ayez des droits pour la lecture seulement ). Aussi, quand j'ai essayé d'exécuter cette procédure par exemple dans DataGrip:

EXEC Web.example_procedure 2, 3, 4

J'ai reçu deux résultats:

sapins:

 <anonymous> ----------- 3 

seconde:

 column_1 | column_2 ------------------ k1 | v1 k2 | v2 k3 | v3 ... 

J'ai besoin d'une seconde table.

Maintenant, je fais le prochain en raison de cet article

 private static void executeStatement(Connection con) { try { Ssortingng SQL = "EXEC Web.example_procedure 2, 3, 4"; Statement stmt = con.createStatement(); boolean results = stmt.execute(SQL); int rsCount = 0; //Loop through the available result sets. do { if (results) { ResultSet rs = stmt.getResultSet(); rsCount++; //Show data from the result set. System.out.println("RESULT SET #" + rsCount); while (rs.next()) { // something will be here } rs.close(); } results = stmt.getMoreResults(); } while (results); stmt.close(); } catch (Exception e) { e.printStackTrace(); } } 

La sortie est:

RESULT SET #1

En d'autres termes, je n'obtiens que le premier résultat. Comment get la deuxième table?

  • puis-je modifier une requête SQL? (Qui returnnera une seule table sans le premier résultat int)
  • JDBC?
  • Hiberner?

Je serai heureux de toute variante de travail.

Mettre à jour

Merci à @MarkRotteveel et sa réponse – j'ai résolu le problème

 Ssortingng sql = "EXEC Web.example_procedure 2, 3, 4"; PreparedStatement stmt = con.prepareStatement(sql); boolean result = stmt.execute(); while (true) { if (result) { ResultSet rs = stmt.getResultSet(); // in my case first table has only one column, // and I need the second table, which has 9 columns if (rs.getMetaData().getColumnCount() > 1) { // go through the rows while (rs.next()) { // for example what we can do rs.getMetaData().getColumnCount(); // return column count in the current result set rs.getObject(int columnIndex); // get value for column index. Must be not greater than .getColumnCount() } } } else { int updateCount = stmt.getUpdateCount(); if (updateCount == -1) { // no more results break; } } result = stmt.getMoreResults(); } 

Utilisez JDBC CallableStatement:

cstmt.registerOutParameter ()
cstmt.getObject ()

  Ssortingng sql = "{call getEmpName (?, ?)}"; cstmt = conn.prepareCall(sql); //Bind IN parameter first, then bind OUT parameter int empID = 102; cstmt.setInt(1, empID); // This would set ID as 102 // Because second parameter is OUT so register it cstmt.registerOutParameter(2, OracleTypes.CURSOR); //Use execute method to run stored procedure. System.out.println("Executing stored procedure..." ); cstmt.execute(); //Resortingeve data rs = (ResultSet) cstmt.getObject(1); 

https://docs.oracle.com/cd/E17952_01/connector-j-en/connector-j-usagenotes-statements-callable.html

Vous pouvez définir le jeu de résultats pouvant être mis à jour pour exécuter plusieurs commands.

 Statement stmt = conn1.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); Ssortingng insert1="insert into data values('******','*********')"; Ssortingng insert2="insert into data values('*******','******')"; conn1.setAutoCommit(false); ResultSet rs = stmt.executeQuery("select * from data"); rs.last();