2012-03-14 23 views
16

Bir MSSQL veritabanına sahip ve aşağıdaki sorguyu çalıştırıyorum ayarlar:Sorgular

select * from projects; select * from user 

Yukarıdaki sorgu aynı anda iki sonuç kümelerini döndürür ve ben ayrı ayrı her iki sorguları ateş edemezler. Hem sonuç kümesini hem de bir Java sınıfında nasıl ele alabilirim?

cevap

19

Doğru kod, bir JDBC deyim tarafından döndürülen s ResultSet birden işlemek için:

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

Önemli bitleri:

  • getMoreResults() ve execute() dönüş false sonucu olduğunu belirtmek için ifade sadece bir sayı değil, bir ResultSet.
  • Daha fazla sonuç olup olmadığını öğrenmek için stmt.getUpdateCount() == -1 numarasını kontrol etmeniz gerekir.
  • ya Evet, yapabilirsiniz stmt.getMoreResults(Statement.CLOSE_CURRENT_RESULT)
+0

Bu cevapta stmt'nin nereden geldiğine bakıyorum. Stmt'nin Hazırlanmış bir Açıklama olduğunu anlıyorum, ancak net değil. –

-3

UNION ALL sorgusu, 2 veya daha fazla "select" sorgusunun sonuç kümelerini birleştirmenizi sağlar. Tüm satırları döndürür (satır "select" ifadelerinden daha fazlasında mevcut olsa bile).

TÜM sorgu benzer veri türleri ile sonuç kümesi alanların aynı sayıda olması gerekir BİRLİĞİ içindeki her SQL deyimi .........

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

Hi All, Temelde ne istediğim şudur: "Sadece aynı anda sorguda veya olmasın iki ResultsSets işlemek için herhangi bir yolu yoktur". ?? –

+0

Herkese selam, Temel olarak ne istiyorum: "Bir sorguda eşzamanlı olarak iki ResultsSets işlemek için herhangi bir yol var mı". ?? Evet veya Hayır. . eğer evet ise o zaman java kodunda. . ??. . –

-1

BİRLİĞİ yaklaşımı Akaşanın önerdiği ve Juergen uygulanabilir, ancak biraz daha fazla çalışmaya gereksinim duyar:

  • Her iki tablo tarafından hangi sütunların paylaşıldığını belirleyin.
  • Tablolardan birine özgü olan sütunları tanımlayın.
  • Her iki tablonun tüm sütunlarını, her iki seçim nesnesinde aynı yerlerde görünen ortak sütunlarla ve tabloya özgü sütunları değiştirerek boş değerlerle birleştiren bir sorgu yazın. Muhtemelen hangi sıraların hangi tablolardan geldiğini gösteren bir sütun da isteyeceksiniz.

Yani, örneğin, aşağıdaki yapılarda tablolar düşünün:

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

Users 
----- 
ID 
Name 
PhoneNo 

iki tablodan sonuçlarını listelemek için, böyle bir sorgu kullanabilirsiniz: RDBMS'niz bağlı

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 

null'ları gereken veri türüne açıkça dönüştürmeniz gerekebilir.

+0

Herkeseum Merhaba, Temel olarak ne istiyorum: "Bir sorguda eşzamanlı olarak iki ResultsSets işlemek için herhangi bir yol var mı". ?? Evet veya Hayır. . eğer evet ise o zaman java kodunda. . ??. . –

+0

@VishuSinghvi: Sağlanan yanıtların tümü size aynı cevabı verir: iki ayrı Sonuç Olarak değil, her iki sorgunun da birleştirilmiş sonuçlarından oluşan tek bir ResultSet olarak. Cevabım, bu birleşik sorgunun nasıl oluşturulacağı hakkında daha fazla ayrıntı sağlar. –

-22

Yanıt: değil. Tek yol: Bunları ayrı sorgular olarak çalıştırın.

+16

JDBC, birden çok sonuç kümesini destekler – Honza

+0

Bu, kabul edilen yanıtın bu olduğunu aklımı karıştırır. –

12

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

Bu, "boolean" dönüş değerinin anlamını yanlış yorumluyor: "true", bir sonraki sonuç "ResultSet", "false" ise bir sonraki sonucun bir güncelleme sayısı olduğu anlamına gelir (veya güncelleme sayısı "-1" olduğunda , daha fazla sonuç yok). Bu özellikle, sonuç kümeleri ve güncelleştirme sayımlarının saklı yordamdan yayılabildiği SQL Server (ve Sybase) üzerinde gerçekleşebilir. –

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

Bu, "boole" dönüş değerinin anlamını yanlış yorumluyor: "true", bir sonraki sonuç "ResultSet", "false" ise bir sonraki sonucun bir güncelleme sayısı olduğu anlamına gelir (veya güncelleme sayısı -1 olduğunda , daha fazla sonuç yok). Bu özellikle, sonuç kümeleri ve güncelleştirme sayımlarının saklı yordamdan yayılabildiği SQL Server (ve Sybase) üzerinde gerçekleşebilir. –

2

sonuç kümelerini kapatın veya kullandığınızdan emin olun.Bunu test ettik 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(); 
    } 
} 

bu MSDN makalesine bakın ve iyi çalışıyor.

0

Java kullanmadan önce, SONUÇ SETLER maddesine bakmanız gerekir.

MSSQL, java kodunuzla daha pratik bir şekilde yardımcı olabilecek bu özelliğe sahiptir. SONUÇ yanı TAKIMLARI ile Saklanan prosedürleri kullanabilirsiniz

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

:

Bu örnek iki sorgu exec olacak.

hakkında

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