Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回多个结果集的查询_Java_Sql_Jdbc - Fatal编程技术网

Java 返回多个结果集的查询

Java 返回多个结果集的查询,java,sql,jdbc,Java,Sql,Jdbc,我有一个MSSQL数据库,正在运行以下查询: select * from projects; select * from user 上面的查询一次返回两个结果集,我无法分别启动这两个查询。如何在Java类中同时处理两个结果集?UNION ALL查询允许您组合两个或更多“select”查询的结果集。它返回所有行(即使该行存在于多个“select”语句中) UNION ALL查询中的每个SQL语句在具有类似数据类型的结果集中必须具有相同数量的字段 select * from projects UN

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

select * from projects; select * from user

上面的查询一次返回两个结果集,我无法分别启动这两个查询。如何在Java类中同时处理两个结果集?

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

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

select * from projects
UNION ALL
select * from user

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

您可以使用Statement.execute(),getResultSet()


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

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();
}
重要信息:

  • getmoresults()
    execute()
    返回
    false
    ,指示语句的结果只是一个数字,而不是
    ResultSet
  • 您需要检查stmt.getUpdateCount()==-1以了解是否有更多结果
  • 确保关闭结果集或使用
    stmt.getmoresults(Statement.close\u CURRENT\u result)

  • 是的,你可以。请参阅此MSDN文章


    我已经对它进行了测试,效果很好。

    在使用java之前,您需要查看resultsets子句

    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)
      )
    );
    
    您也可以将存储过程用于结果集


    更多信息:

    大家好,我想问的基本问题是:“有没有办法在一个查询中同时处理两个结果集?”??大家好,基本上我想要的是:“有没有办法在一个查询中同时处理两个结果集?”??是或否。如果是,那么如何在java代码中。JDBC支持多个结果集这误解了
    布尔值
    返回值的含义:
    true
    表示下一个结果是
    ResultSet
    ,而
    false
    表示下一个结果是更新计数(或者,当更新计数为
    -1
    时,表示没有更多结果)。特别是在SQL Server(和Sybase)上,结果集和更新计数可以从存储过程中发出。这会误解
    布尔值
    返回值的含义:
    true
    表示下一个结果是
    ResultSet
    ,而
    false
    表示下一个结果是更新计数(或者,当更新计数为
    -1
    时,没有更多的结果)。这种情况可能会发生,特别是在SQL Server(和Sybase)上,结果集和更新计数可以从存储过程发出。在这个答案中,我不知道stmt来自何处。我意识到stmt是一个准备好的语句,但不清楚。
    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();
    }
    
    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();
       }
    }
    
    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)
      )
    );