java代码使存储过程在DAO层中返回结果集

时间:2016-02-24 20:36:49

标签: java sql-server stored-procedures

我有一个在MS SQL Server上运行的存储过程。它需要一个参数作为输入。基本上,它返回多行。 我使用 CallableStatement 从我的java应用程序调用SP。

我想知道是否有可能在我的DAO层中以ResultSet的形式获取存储过程返回的行?[就像我们从EmployeeTable select *中获取结果集一样]。如果是,我们该怎么做?

P.S:我没有权限修改存储过程。

1 个答案:

答案 0 :(得分:2)

SQL Server知道返回结果的两种类型的过程:

批次

程序看起来像这样:

CREATE PROCEDURE p_results(
  @p_result_sets INT
)
AS
BEGIN
  IF @p_result_sets = 1 BEGIN
    SELECT 1 a;
  END
  ELSE IF @p_result_sets = 2 BEGIN
    SELECT 1 a;
    SELECT 1 b UNION SELECT 2 b;
  END
END;

在这种情况下,您事先不知道结果集的样子,以及您将获得多少结果集。您必须使用Statement.execute()运行该过程,如下所示:

try (CallableStatement stmt = con.prepareCall("...")) {
    boolean results = stmt.execute();

    for (;;) {
        if (results)
            try (ResultSet rs = stmt.getResultSet()) {
                // ... Fetch your results here
            }
        else if (stmt.getUpdateCount() != -1) {}
        else
            break;

        results = stmt.getMoreResults();
    }

    // After all results are fetched, you can also retrieve OUT parameters, if applicable
}

表值函数

该功能如下所示:

CREATE FUNCTION f_tables1 ()
RETURNS @out_table TABLE (
  column_value INTEGER
)
AS
BEGIN
  INSERT @out_table
  VALUES (1)
  RETURN
END

在这种情况下,您实际上并不需要CallableStatement。普通的SELECT语句将执行:

try (PreparedStatement stmt = con.prepareStatement("SELECT * FROM f_tables1()");
     ResultSet rs = stmt.executeQuery()) {
    // ... Fetch your results here
}