当前位置: 首页 > 面试题库 >

如何从一个CallableStatement获得多个结果集?

叶华皓
2023-03-14
问题内容

当我从命令行调用存储的proc时,我得到以下信息。

CALL `events`.`get_event_by_id`(10)

+---------+----------+-------------+---------------------+---------------------+---------------------+--------+----------+
| evet_id | name     | description | starttime           | endtime             | last_modified       | active | addre_id |
+---------+----------+-------------+---------------------+---------------------+---------------------+--------+----------+
|      10 | samole 3 | sanely      | 2013-11-27 17:37:00 | 2013-11-27 18:09:00 | 2013-11-27 09:37:42 |      1 |       20 |
+---------+----------+-------------+---------------------+---------------------+---------------------+--------+----------+
1 row in set (0.00 sec)

+---------+------------+---------+
| user_id | username   | picture |
+---------+------------+---------+
|       1 | jamess2000 | NULL    |
|       2 | yferna2012 | NULL    |
+---------+------------+---------+
2 rows in set (0.00 sec)

+----------+------------------------------+---------------------+-------------+--------+
| addre_id | street                       | name                | description | active |
+----------+------------------------------+---------------------+-------------+--------+
|       20 | Schieffelin                  | Manhattan Ville Loc | NULL        |      1 |
+----------+------------------------------+---------------------+-------------+--------+

这是我的Java代码的片段

String SP_GET_EVENT_BY_ID = "CALL `events`.`get_event_by_id`(?)";
String PROC_PARAM_EVENT_ID = "evet_id";
mCallableStatement = mConnection.prepareCall(SP_GET_EVENT_BY_ID);
mCallableStatement.setInt(10, PROC_PARAM_EVENT_ID);

当我执行该语句时,仅返回event_table结果。我阅读以下查询:

ResultSet reader = mCallableStatement.executeQuery();

while(reader.next())
{
   //etc..... here i assign db values to properties. 
}

我试图避免对数据库发出多个请求,因为它非常慢(300毫秒,具体取决于多少结果)

可能吗?


问题答案:

我找到了这篇很棒的文章。http://www.herongyang.com/JDBC/MySQL-CallableStatement-Multiple-
ResulSet.html

这是该文章中的代码。

/**
 * MySqlCallMultipleResultSet.java
 * Copyright (c) 2007 by Dr. Herong Yang. All rights reserved.
 */
import java.sql.*;
public class MySqlCallMultipleResultSet {
  public static void main(String [] args) {
    Connection con = null;
    try {
      com.mysql.jdbc.jdbc2.optional.MysqlDataSource ds 
        = new com.mysql.jdbc.jdbc2.optional.MysqlDataSource();
      ds.setServerName("localhost");
      ds.setPortNumber(3306);
      ds.setDatabaseName("HerongDB");
      ds.setUser("Herong");
      ds.setPassword("TopSecret");
      con = ds.getConnection();

// Create CallableStatement
      CallableStatement cs = con.prepareCall("CALL HeadTail(?)");

// Register OUT parameters
      cs.registerOutParameter(1, java.sql.Types.INTEGER);

// Execute the CALL statement and expecting multiple result sets
      boolean isResultSet = cs.execute();

// First ReulstSet object
      if (!isResultSet) {
        System.out.println("The first result is not a ResultSet.");
        return;
      }

// First ReulstSet object
      System.out.println("Head of the table:");
      ResultSet res = cs.getResultSet();
      while (res.next()) {
        System.out.println("  "+res.getInt("ID")
          +", "+res.getString("FirstName")
          +", "+res.getString("LastName")
          +", "+res.getTimestamp("ModTime"));

      }
      res.close();

// Move to the next result
      isResultSet = cs.getMoreResults();
      if (!isResultSet) {
        System.out.println("The next result is not a ResultSet.");
        return;
      }

// Second ReulstSet object
      System.out.println("Tail of the table:");
      res = cs.getResultSet();
      while (res.next()) {
        System.out.println("  "+res.getInt("ID")
          +", "+res.getString("FirstName")
          +", "+res.getString("LastName")
          +", "+res.getTimestamp("ModTime"));

      }
      res.close();

// Retrieve OUT parameters
      System.out.println("Total number of records: "+cs.getInt(1));

// Close resource
      cs.close();

      con.close();
    } catch (Exception e) {
      System.err.println("Exception: "+e.getMessage());
      e.printStackTrace();
    }
  }
}


 类似资料:
  • 我有两个模型奖学金和水平,他们有多对多的关系。为此,我在数据库中有两个表作为奖学金和级别,还有一个数据透视表级别。我想根据奖学金(头衔、申请截止日期)和级别(姓名)查询是否获得奖学金 柱: 我的级别表有:id、名称、slug、创建时间、更新时间 我的奖学金表有:id,标题,段塞,描述,图像,大学,app_deadline,截止日期,备注,place_id,created_at,updated_at

  • 我有以下表格: 表名称 -----| 表字段 图书--------------------图书id、图书名称 作者 ---------- | author_id、author_name 图书作者-作者id,图书id 用户------------------用户id、用户名 注释----------注释id,注释 评论|用户|评论| id、用户id、图书id、日期 我需要显示书名,它的作者,以及为这

  • 我正在使用hibernate 4和Spring 3。 我有5个表,每个表映射一个实体类。现在,如果我必须从1个表中选择列,我将执行以下操作: 此结果中的此值将为EmployeeEntity类型。 或者我也可以使用标准。 现在我的要求是我必须从所有5个表中得到结果。每个表中有1-2列。 早些时候,它是一个1表,所以我得到了一个实体,现在我得到了5个表的结果,所以如何在实体中映射它。 List res

  • 问题内容: 当我跑步 我懂了 但我认为它应该回来 因为字符串中有3 s,而不是2! 这是为什么? 我希望能够在RegEx中搜索字符串的所有出现并对其进行迭代。 FWIW:我正在使用node.js 问题答案: 仅返回第一个匹配项的捕获集,而不返回您期望的匹配项。因此,您真正看到的是(整个匹配项“ a”)和(第一个捕获项),即长度为2的数组。 同时,它的设计使您可以 再次 调用它以获取 下一个 匹配项

  • 问题内容: 如果我的查询包含一个类,例如: 然后我迭代它,那里是一个类的对象。 那么如何从包含多个类的查询中获取结果呢?例如: 问题答案: for (Object[] result : query.list()) { User user = (User) result[0]; Group group = (Group) result[1]; }