从另一个存储过程中的存储过程获取ResultSet

时间:2017-09-22 14:09:54

标签: java sql-server stored-procedures jdbc

我有一个调用另一个存储过程的存储过程。内部存储过程返回结果集。使用CallableStatement执行调用存储过程后,我无法获取被调用的存储过程返回的结果集。

我尝试了executeexecuteQuery来执行可调用语句。当我从SQL Server执行调用存储过程时,我得到了正确的结果。

通话程序: -

ALTER PROC [User].[Get_Data]
(@UserID NVARCHAR(20))
AS
BEGIN
Select 'User Data'
Exec [Order].[Get_Order] @UserID
END

被叫程序: -

ALTER PROC [Order].[Get_Order]
(@UserID NVARCHAR(20))
AS
BEGIN
Select * from orders where userId=@UserID
END

2 个答案:

答案 0 :(得分:0)

您无法直接在 SQL Server 本身中选择存储过程的结果。您需要先将结果插入临时表中,如下例所示。

使用示例:

-- Create a tempoary table to store the results.
CREATE TABLE #UserOrderDetail
(
    UserData NVARCHAR(50) -- Your columns here
)

-- Insert result into temp table.
-- Note that the columns returned from procedure has to match columns in your temp table.
INSERT INTO #UserOrderDetail
EXEC [Order].[Get_Order] @UserID

-- Select the results out of the temp table.
SELECT *
FROM    #UserOrderDetail

如果只想将一个或多个结果集返回给客户端应用程序,则应确保将SET NOCOUNT ON语句添加到存储过程的顶部,这将阻止SQL Server将DONE_IN_PROC消息发送到存储过程中每个语句的客户端。 ODBC,JDBC和OLEDB等数据库库可能会被SQL Server存储过程中执行的各种insert和update语句返回的行计数混淆。您的原始程序如下:

ALTER PROC [User].[Get_Data]
(
    @UserID NVARCHAR(20)
)
AS
BEGIN

    SET NOCOUNT ON

    SELECT 'User Data'
    EXEC [Order].[Get_Order] @UserID

END

答案 1 :(得分:0)

您的外部存储过程返回两个结果集:

  1. Select 'User Data'
  2. 的结果
  3. Exec [Order].[Get_Order] @UserID
  4. 的结果

    您需要调用.getMoreResults()才能检索第二个结果集,例如

    CallableStatement cs = connection.prepareCall("{CALL Get_Data (?)}");
    cs.setString(1, "gord");
    ResultSet rs = cs.executeQuery();
    System.out.println("[First result set]");
    while (rs.next()) {
        System.out.printf("(No column name): %s%n", rs.getString(1));
    }
    cs.getMoreResults();
    rs = cs.getResultSet();
    System.out.println();
    System.out.println("[Second result set]");
    while (rs.next()) {
        System.out.printf("userId: %s, orderId: %s%n", 
                rs.getString("userId"), rs.getString("orderId"));
    }
    
    制造

    [First result set]
    (No column name): User Data
    
    [Second result set]
    userId: gord, orderId: order1
    userId: gord, orderId: order2
    

    (使用连接到SQL Server 2014的mssql-jdbc-6.2.1.jre8.jar进行测试。)

    有关详情,请参阅

    How to get *everything* back from a stored procedure using JDBC