web-dev-qa-db-fra.com

Requêtes renvoyant plusieurs jeux de résultats

J'ai une base de données MSSQL et j'exécute la requête suivante:

select * from projects; select * from user

La requête ci-dessus renvoie deux ensembles de résultats à la fois, et je ne peux pas déclencher les deux requêtes séparément. Comment puis-je gérer simultanément le jeu de résultats dans une classe Java?

18
Vishu Singhvi

Code correct pour traiter plusieurs ResultSets renvoyés par une instruction JDBC:

PreparedStatement stmt = ...;
boolean isResultSet = stmt.execute();

int count = 0;
while(true) {
    if(isResultSet) {
        rs = stmt.getResultSet();
        while(rs.next()) {
            processEachRow(rs);
        }

        rs.close();
    } else {
        if(stmt.getUpdateCount() == -1) {
            break;
        }

        log.info("Result {} is just a count: {}", count, stmt.getUpdateCount());
    }

    count ++;
    isResultSet = stmt.getMoreResults();
}

Bits importants:

  • getMoreResults() et execute() retournent false pour indiquer que le résultat de l'instruction est juste un nombre et non une ResultSet.
  • Vous devez vérifier stmt.getUpdateCount() == -1 pour savoir s’il ya plus de résultats.
  • Assurez-vous de fermer les ensembles de résultats ou d'utiliser stmt.getMoreResults(Statement.CLOSE_CURRENT_RESULT).
21
Aaron Digulla

Vous pouvez utiliser Statement.execute (), getResultSet ();

PreparedStatement stmt = ... prepare your statement result
boolean hasResults = stmt.execute();
while (hasResults) {
    ResultSet rs = stmt.getResultSet();
    ... your code parsing the results ...
    hasResults = stmt.getMoreResults();
}
12
Honza

Oui, vous pouvez. Voir cet article MSDN https://msdn.Microsoft.com/en-us/library/ms378758(v=sql.110).aspx

public static void executeStatement(Connection con) {
   try {
      String SQL = "SELECT TOP 10 * FROM Person.Contact; " +
                   "SELECT TOP 20 * FROM Person.Contact";
      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()) {
              System.out.println(rs.getString("LastName") + ", " + rs.getString("FirstName"));
           }
           rs.close();
        }
        System.out.println();
        results = stmt.getMoreResults();
        } while(results);
      stmt.close();
      }
   catch (Exception e) {
      e.printStackTrace();
   }
}

J'ai testé ça et ça marche bien.

3
Dmitry
public static void executeProcedure(Connection con) {
   try {
      CallableStatement stmt = con.prepareCall(...);
      .....  //Set call parameters, if you have IN,OUT, or IN/OUT parameters

      boolean results = stmt.execute();
      int rsCount = 0;

      //Loop through the available result sets.
     while (results) {
           ResultSet rs = stmt.getResultSet();
           //Retrieve data from the result set.
           while (rs.next()) {
        ....// using rs.getxxx() method to retieve data
           }
           rs.close();

        //Check for next result set
        results = stmt.getMoreResults();
      } 
      stmt.close();
   }
   catch (Exception e) {
      e.printStackTrace();
   }
}
0
Ritesh Chiddarwar

Avant d'utiliser Java, vous devez consulter la clause RESULT SETS.

MSSQL possède cette fonctionnalité qui peut vous aider avec votre code Java, de manière plus pratique. 

Cet exemple va exécuter deux requêtes:

EXEC('SELECT id_person, name, age FROM dbo.PERSON; SELECT id_url, url FROM dbo.URL;')
WITH RESULT SETS
(
  (
    id_person BIGINT,
    name VARCHAR(255),
    age TINYINT
  ),
  (
    id_url BIGINT,
    url VARCHAR(2000)
  )
);

Vous pouvez également utiliser des procédures stockées avec RESULT SETS.

En savoir plus sur: https://technet.Microsoft.com/en-us/library/ms188332(v=sql.110).aspx

0
John Medeiros