【问题标题】:Getting ResultSet from stored procedure within another stored procedure从另一个存储过程中的存储过程获取 ResultSet
【发布时间】:2018-03-04 03:42:10
【问题描述】:

我有一个调用另一个存储过程的存储过程。内部存储过程返回一个结果集。使用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

【问题讨论】:

    标签: java sql-server stored-procedures jdbc


    【解决方案1】:

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

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

    您需要调用.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

    【讨论】:

    • 已经试过了。当一个过程调用另一个过程时,getMoreResults() 不起作用。
    • @Jayant - 它对我有用。我的答案中的代码在发布之前已经过测试。
    【解决方案2】:

    您不能直接在 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 存储过程中执行的各种插入和更新语句返回的行数弄糊涂。您的原始程序如下所示:

    ALTER PROC [User].[Get_Data]
    (
        @UserID NVARCHAR(20)
    )
    AS
    BEGIN
    
        SET NOCOUNT ON
    
        SELECT 'User Data'
        EXEC [Order].[Get_Order] @UserID
    
    END
    

    【讨论】:

    • 抱歉,不,不需要临时表。
    • @Jayant 再次查看您的问题后,我想到您的问题可能只是您的存储过程中未设置 NOCOUNT 选项的情况。我已经用更多信息更新了我的答案。
    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    相关资源
    最近更新 更多