查询返回多个结果集

24

我有一个MSSQL数据库,并运行以下查询:

select * from projects; select * from user

上述查询同时返回两个结果集,我不能分别执行这两个查询。我如何在Java类中同时处理这两个结果集?

7个回答

33

正确处理JDBC语句返回的多个ResultSet的代码:

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

重要提示:

  • getMoreResults()execute() 返回 false 表示语句的结果只是一个数字而不是一个 ResultSet
  • 您需要检查 stmt.getUpdateCount() == -1 来确定是否还有更多的结果。
  • 确保您关闭结果集或使用 stmt.getMoreResults(Statement.CLOSE_CURRENT_RESULT)

在这个答案中,我没有找到stmt的来源。我知道stmt是一个预处理语句,但不是很清楚。 - Mathieu Brouwers

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

7
这个错误地解释了boolean返回值的含义:true表示下一个结果是一个ResultSet,而false表示下一个结果是更新计数(或者当更新计数为-1时,表示没有更多结果)。这种情况尤其容易出现在SQL Server(和Sybase)中,因为存储过程可以发出结果集和更新计数。 - Mark Rotteveel

4

是的,你可以。参考这篇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();
   }
}

我已经测试过了,它能够正常工作。


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 retrieve data
           }
           rs.close();

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

1
这个错误地解释了 boolean 返回值的含义:true 表示下一个结果是一个 ResultSet,而 false 表示下一个结果是一个更新计数(或者当更新计数为 -1 时,表示没有更多的结果)。这种情况在 SQL Server(和 Sybase)中特别容易发生,因为存储过程可以发出结果集和更新计数。 - Mark Rotteveel

0

在使用Java之前,您需要查看RESULT SETS子句。

MSSQL具有此功能,可以更实用地帮助您编写Java代码。

此示例将执行两个查询:

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

您也可以使用带有结果集的存储过程。

更多信息请参见:https://technet.microsoft.com/zh-cn/library/ms188332(v=sql.110).aspx


-4

UNION ALL查询允许您组合2个或更多“select”查询的结果集。它返回所有行(即使该行存在于多个“select”语句中)。

UNION ALL查询中的每个SQL语句必须具有相似数据类型的结果集中相同数量的字段......

select * from projects
UNION ALL
select * from user

大家好,我想知道是否有办法在一个查询中同时处理两个结果集。 - Vishu Singhvi
大家好,我想问的是:在一个查询中是否有办法同时处理两个结果集?是还是不是。如果是,那么在Java代码中如何实现呢?谢谢。 - Vishu Singhvi

-25
答案是:这是不可能的。唯一的方法是将它们作为单独的查询运行。

17
JDBC支持多个结果集。 - Honza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接