web-dev-qa-db-ja.com

複数の結果セットを返すクエリ

MSSQLデータベースがあり、次のクエリを実行しています。

select * from projects; select * from user

上記のクエリは2つの結果セットを一度に返します。両方のクエリを個別に起動することはできません。 Javaクラスで両方の結果セットを一度に処理するにはどうすればよいですか?

20
Vishu Singhvi

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)を使用してください
23
Aaron Digulla

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

はい、できます。この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
Dmitry
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();
   }
}
0

Javaを使用する前に、RESULT SETS句を確認する必要があります。

MSSQLにはこの機能があり、Javaコードをより実用的な方法で支援します。

この例では、2つのクエリを実行します。

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

0
John Medeiros