【问题标题】:Queries returning multiple result sets返回多个结果集的查询
【发布时间】:2012-03-30 14:15:25
【问题描述】:

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

select * from projects; select * from user

上面的查询一次返回两个结果集,我不能分别触发这两个查询。如何在 Java 类中同时处理两个结果集?

【问题讨论】:

    标签: java sql jdbc


    【解决方案1】:

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

    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 是一个 Prepared Statement,但不清楚。
    【解决方案2】:

    可以使用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();
    }
    

    【讨论】:

    • 这误解了boolean 返回值的含义:true 表示下一个结果是ResultSet,而false 表示下一个结果是更新计数(或者,当更新计数为-1,即没有更多结果)。这尤其可能发生在 SQL Server(和 Sybase)上,其中结果集和更新计数可以从存储过程中发出。
    【解决方案3】:

    是的,你可以。请参阅此 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();
       }
    }
    

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

    【讨论】:

      【解决方案4】:

      在使用 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)
        )
      );
      

      您也可以将存储过程与 RESULT SETS 一起使用。

      更多信息:https://technet.microsoft.com/en-us/library/ms188332(v=sql.110).aspx

      【讨论】:

        【解决方案5】:
        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();
           }
        }
        

        【讨论】:

        • 这误解了boolean 返回值的含义:true 表示下一个结果是ResultSet,而false 表示下一个结果是更新计数(或者,当更新计数为-1,即没有更多结果)。这尤其可能发生在 SQL Server(和 Sybase)上,结果集和更新计数可以从存储过程中发出。
        【解决方案6】:

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

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

        select * from projects
        UNION ALL
        select * from user
        

        【讨论】:

        • 大家好,基本上我想要的是:“有没有办法在查询中同时处理两个结果集”。 ??
        • 大家好,基本上我想要的是:“有没有办法在查询中同时处理两个结果集”。 ??是还是不是。 .如果是,那么如何在 java 代码中。 .??。 .
        【解决方案7】:

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

        【讨论】:

        • JDBC 支持多个结果集
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 2010-09-25
        • 2020-10-23
        • 2020-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多