2012-03-14 11 views
16

Ho un database MSSQL e sto facendo funzionare la seguente query:query che restituiscono risultato più set

select * from projects; select * from user 

La query sopra restituisce due set di risultati in una sola volta, e non posso sparare entrambe le query separatamente. Come posso gestire entrambi i risultati contemporaneamente in una classe Java?

risposta

19

codice corretto per elaborare più ResultSet s restituito da una dichiarazione JDBC:

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(); 
} 

pezzi importanti:

  • getMoreResults() e execute() ritorno false per indicare che il risultato di la dichiarazione è solo un numero e non a ResultSet.
  • È necessario verificare stmt.getUpdateCount() == -1 per sapere se ci sono più risultati.
  • Assicurarsi di chiudere il set di risultati o utilizzare stmt.getMoreResults(Statement.CLOSE_CURRENT_RESULT)
+0

In questa risposta mi manca la provenienza di stmt. Mi rendo conto che stmt è una dichiarazione preparata, ma non è chiaro. –

-3

La query UNION ALL consente di combinare i gruppi di risultati di 2 o più query "selezionate". Restituisce tutte le righe (anche se la riga esiste in più di una delle istruzioni "select").

Ogni istruzione SQL all'interno della query UNION ALL deve avere lo stesso numero di campi nel set di risultati con tipi di dati simili .........

select * from projects 
UNION ALL 
select * from user 
+0

Ciao a tutti, Fondamentalmente quello che voglio è: "Proprio non v'è alcun modo per gestire due ResultsSets contemporaneamente in una query o no". ?? –

+0

Ciao a tutti, Fondamentalmente quello che voglio è: "Basta non v'è alcun modo per gestire due ResultsSets contemporaneamente in una query o no". ?? si o no. . se sì allora come nel codice java. . ??. . –

-1

L'approccio suggerito da UNION Akash e Juergen è vitale, ma richiede un po 'più di lavoro:

  • Identificare quali colonne sono condivise da entrambe le tabelle.
  • Identificare quali colonne sono specifiche per una delle tabelle.
  • Scrivere una query che unisce tutte le colonne di entrambe le tabelle, con le colonne comuni che appaiono nelle stesse posizioni in entrambe le clausole di selezione e valori nulli che sostituiscono le colonne specifiche della tabella. Probabilmente vorrai anche una colonna per indicare quali file provengono da quali tabelle.

Così, per esempio, prendere in considerazione le tabelle con le seguenti strutture:

Projects 
-------- 
ID 
Name 
Budget 

Users 
----- 
ID 
Name 
PhoneNo 

alla lista dei risultati da entrambe le tabelle, si potrebbe utilizzare una query come:

select 'Projects' table_name, ID, Name, null as PhoneNo, Budget from Projects 
union all 
select 'Users' table_name, ID, Name, PhoneNo, null as Budget from Users 

seconda del RDBMS , potrebbe essere necessario convertire esplicitamente i valori null nel tipo di dati richiesto.

+0

Ciao a tutti, Fondamentalmente quello che voglio è: "Basta non v'è alcun modo per gestire due ResultsSets contemporaneamente in una query o no". ?? si o no. . se sì allora come nel codice java. . ??. . –

+0

@VishuSinghvi: tutte le risposte fornite danno la stessa risposta: non come due ResultSet separati, ma come un singolo ResultSet composto dai risultati uniti di entrambe le query. La mia risposta fornisce ulteriori dettagli su come costruire quella query unita. –

-22

La risposta: è NON possibile. L'unico modo: eseguili come query separate.

+16

JDBC supporta più set di risultati – Honza

+0

Mi viene in mente che questa è la risposta accettata. –

12

È possibile utilizzare 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(); 
} 
+6

Questo errore interpreta il significato del valore di ritorno 'booleano':' true' significa che il risultato successivo è un 'ResultSet', mentre' false' significa che il risultato successivo è un conteggio di aggiornamento (o, quando il conteggio degli aggiornamenti è '-1' , che non ci sono più risultati). Ciò può verificarsi in particolare su SQL Server (e Sybase), in cui i set di risultati e i conteggi degli aggiornamenti possono essere emessi da una stored procedure. –

0
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(); 
    } 
} 
+1

Questo errore interpreta il significato del valore di ritorno 'booleano':' true' significa che il risultato successivo è un 'ResultSet', mentre' false' significa che il risultato successivo è un conteggio di aggiornamento (o, quando il conteggio degli aggiornamenti è '-1' , che non ci sono più risultati). Ciò può verificarsi in particolare su SQL Server (e Sybase), in cui i set di risultati e i conteggi degli aggiornamenti possono essere emessi da una stored procedure. –

2

sì, è possibile.Vedere questo articolo di 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(); 
    } 
} 

ho provato che e funziona benissimo.

0

Prima dell'utilizzo di Java, è necessario guardare la clausola di set di risultati.

MSSQL ha questa funzione che può aiutarti con il tuo codice java, in un modo più pratico.

Questo esempio exec due query:

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) 
) 
); 

È possibile utilizzare le stored procedure con set di risultati pure.

Ulteriori informazioni: https://technet.microsoft.com/en-us/library/ms188332(v=sql.110).aspx

Problemi correlati