我有一个在MS SQL Server上运行的存储过程。它需要一个参数作为输入。基本上,它返回多行。 我使用 CallableStatement 从我的java应用程序调用SP。
我想知道是否有可能在我的DAO层中以ResultSet的形式获取存储过程返回的行?[就像我们从EmployeeTable select *中获取结果集一样]。如果是,我们该怎么做?
P.S:我没有权限修改存储过程。
答案 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
}