2012-03-14 37 views
16

Tôi có một cơ sở dữ liệu MSSQL và đang chạy các truy vấn sau đây:Queries trở về kết quả nhiều bộ

select * from projects; select * from user 

Truy vấn trên trả về hai bộ kết quả cùng một lúc, và tôi không thể kích hoạt cả các truy vấn riêng biệt. Làm thế nào tôi có thể xử lý cả hai tập hợp kết quả cùng một lúc trong một lớp Java?

Trả lời

19

mã chính xác để xử lý nhiều ResultSet s trả về bởi một tuyên bố 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(); 
} 

bit Chú ý:

  • getMoreResults()execute() trở false để cho biết rằng kết quả của tuyên bố chỉ là một con số chứ không phải là ResultSet.
  • Bạn cần phải kiểm tra stmt.getUpdateCount() == -1 để biết liệu có nhiều kết quả hơn không.
  • Hãy chắc chắn rằng bạn có đóng bộ kết quả hoặc sử dụng stmt.getMoreResults(Statement.CLOSE_CURRENT_RESULT)
+0

Trong câu trả lời này, tôi thiếu điểm xuất phát từ đó. Tôi nhận ra stmt là một tuyên bố chuẩn bị, nhưng nó không rõ ràng. –

-3

Truy vấn UNION ALL cho phép bạn kết hợp các tập hợp kết quả của 2 hoặc nhiều truy vấn "chọn". Nó trả về tất cả các hàng (ngay cả khi hàng tồn tại trong nhiều câu lệnh "chọn").

Mỗi câu lệnh SQL trong UNION ALL truy vấn phải có cùng một số lĩnh vực trong các bộ kết quả với các loại dữ liệu tương tự .........

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

Hi All, Về cơ bản những gì tôi muốn là: "Chỉ cần là có cách nào để xử lý hai ResultsSets đồng thời trong một truy vấn hay không". ?? –

+0

Xin chào tất cả, Về cơ bản những gì tôi muốn là: "Chỉ có cách nào để xử lý hai ResultSets đồng thời trong một truy vấn hay không". ?? có hay không. . nếu có thì làm thế nào trong mã java. . ??. . –

-1

Cách tiếp cận UNION được đề xuất bởi Akash và Juergen là khả thi, nhưng cần thêm một chút công việc:

  • Xác định cột nào được chia sẻ bởi cả hai bảng.
  • Xác định cột nào cụ thể cho một trong các bảng.
  • Viết truy vấn liên kết tất cả các cột từ cả hai bảng, với các cột chung xuất hiện trong cùng một vị trí trong cả hai mệnh đề lựa chọn và giá trị null thay thế các cột theo bảng cụ thể. Bạn cũng có thể muốn một cột để chỉ ra những hàng nào đến từ những bảng nào.

Vì vậy, ví dụ, hãy xem xét bảng với các cấu trúc sau:

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

Users 
----- 
ID 
Name 
PhoneNo 

Để liệt kê kết quả từ hai bảng, bạn có thể sử dụng một truy vấn như:

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 

Tùy thuộc vào RDBMS của bạn , bạn có thể cần phải chuyển đổi một cách rõ ràng các giá trị rỗng thành kiểu dữ liệu được yêu cầu.

+0

Xin chào tất cả, Về cơ bản những gì tôi muốn là: "Chỉ cần có cách nào để xử lý hai ResultsSets đồng thời trong một truy vấn hay không". ?? có hay không. . nếu có thì làm thế nào trong mã java. . ??. . –

+0

@VishuSinghvi: Tất cả các câu trả lời được cung cấp cho bạn cùng một câu trả lời: không phải là hai ResultSet riêng biệt, nhưng là một ResultSet đơn bao gồm các kết quả được kết hợp của cả hai truy vấn. Câu trả lời của tôi cung cấp thêm chi tiết về cách xây dựng truy vấn được kết hợp đó. –

-22

Câu trả lời: đó là KHÔNG có thể. Cách duy nhất: Chạy chúng dưới dạng truy vấn riêng biệt.

+16

JDBC hỗ trợ nhiều bộ kết quả – Honza

+0

Nó làm tôi nhớ rằng đây là câu trả lời được chấp nhận. –

12

Bạn có thể sử dụng 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

Điều này giải thích sai ý nghĩa của giá trị trả về 'boolean':' true' có nghĩa là kết quả kế tiếp là 'ResultSet', trong khi' false' có nghĩa là kết quả tiếp theo là số đếm cập nhật (hoặc, khi đếm cập nhật là '-1' , rằng không có kết quả nào khác). Điều này có thể xảy ra đặc biệt là trên SQL Server (và Sybase), nơi tập hợp kết quả và số lượng cập nhật có thể được phát ra từ một thủ tục được lưu trữ. –

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

Điều này giải thích sai ý nghĩa của giá trị trả về 'boolean':' true' có nghĩa là kết quả kế tiếp là 'ResultSet', trong khi' false' có nghĩa là kết quả kế tiếp là số đếm cập nhật (hoặc, khi đếm cập nhật là '-1' , rằng không có kết quả nào khác). Điều này có thể xảy ra đặc biệt là trên SQL Server (và Sybase), nơi tập hợp kết quả và số lượng cập nhật có thể được phát ra từ một thủ tục được lưu trữ. –

0

Trước khi sử dụng java, bạn cần xem mệnh đề RESULT SETS.

MSSQL có tính năng này có thể giúp bạn với mã java của bạn, một cách thực tế hơn.

Ví dụ này sẽ exec hai truy vấn:

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

Bạn có thể sử dụng thủ tục lưu trữ với KẾT QUẢ SETS là tốt.

Thông tin thêm về: https://technet.microsoft.com/en-us/library/ms188332(v=sql.110).aspx

Các vấn đề liên quan