0

我有一个问题,我使用 jdbcTemplate exec 一个 Sybase 存储过程返回多个结果集,我怎样才能得到所有的结果集?

if object_id('p_if_pms_spyh_upload') <> null 
    drop proc p_if_pms_spyh_upload
go
create procedure p_if_pms_spyh_upload
@status          char(1)                ---  订单状态  A/D
as
begin

    declare @rq char(8) , @errcode int, @errmsg varchar(60)     

    create table #head (
        op_type   char(2) not null,                     -- 操作类型 A 表示新建  D 表示删除
        xyqrid   varchar(30) not null,                --  确认函编号
        dh        varchar(20) not null,                -- 优惠单编号 
        yhdmc   varchar(30) not null,               -- 优惠单名称
        type      varchar(18) not null,                -- 直降种类  04表示10有函              
        qsrq     char(8) not null,                           --  起始日期
        jzrq         char(8) not null,                          -- 截止日期 
        qssj     char(8) not null,                      -- 起始时间 
        jzsj      char(8) not null,                             -- 截止时间
        jsfs      varchar(8) not null,                      ---结算方式
        oano    varchar(30) not null,                   -- OA公文号
        description   varchar(200)  not null,      -- 优惠单描述
        oprrq   char(8) not null,             -- 审批删除日期
        oprsj   char(6) not null               -- 审批删除时间    
    )     
    create table #detail (
        op_type   char(2) not null,                     -- 操作类型 A 表示新建  D 表示删除
        xyqrid   varchar(30) not null,                --  确认函编号
        dh        varchar(20) not null,                -- 优惠单编号 
        gdsid    varchar(20) not null,               --  优惠商品名称
        orgid    varchar(10)  not null,               -- 销售组织编码
        qdid     char(4) not null,                      -- 渠道编码
        tjlb        varchar(20)  not null,              -- 商品组
        pp        varchar(20)   not null,              -- 品牌编码
        gys       varchar(20)   not null,              -- 供应商编码
        fmid      varchar(10)   not null,             -- 库位编码
        yhed     numeric(16,4)  not null,            -- 优惠额度
        yhsl      numeric(16,4)   not null,            -- 优惠数量
        unit       varchar(3)  not null                 -- 销售单位
    ) 

    -- 删除1个月之前已成功发送的数据
    select @rq=convert(char(8),dateadd(month,-1,getdate()),112) 
    select @errcode=0
    select @errmsg = ''

    begin tran

        delete from IV_YHD_HEAD_SPYH_TO_PMS where  processflag = 'S' and convert(char(8),lastmodified,112)  = @rq
        if @@transtate = 2 or @@transtate = 3 or @@error != 0        
        begin       
                select @errcode=-1  
            select @errmsg = '删除IV_YHD_HEAD_SPYH_TO_PMS一月之前的数据失败!'                                     
                     goto procfail        
        end  

       delete from IV_YHD_DETAIL_SPYH_TO_PMS where  processflag = 'S' and convert(char(8),lastmodified,112)  = @rq
        if @@transtate = 2 or @@transtate = 3 or @@error != 0        
        begin     
                select @errcode=-1      
           select @errmsg = '删除IV_YHD_DETAIL_SPYH_TO_PMS一月之前的数据失败!'                                     
                     goto procfail        
        end  

        insert into #head 
        select op_type, xyqrid, dh, yhdmc, type, qsrq,jzrq, qssj, jzsj, jsfs, oano, description, oprrq, oprsj
        from IV_YHD_HEAD_SPYH_TO_PMS where processflag = 'Y' and op_type = @status

        update IV_YHD_HEAD_SPYH_TO_PMS set processflag = 'R'
        from IV_YHD_HEAD_SPYH_TO_PMS a, #head b
        where a.dh = b.dh and a.processflag = 'Y' and a.op_type = @status
      if @@transtate = 2 or @@transtate = 3 or @@error != 0        
        begin   
                select @errcode=-1       
           select @errmsg = '更新IV_YHD_HEAD_SPYH_TO_PMS表数据出错!'                                     
                     goto procfail        
        end  

        insert into #detail
        select a.op_type,a.xyqrid,a.dh,a.gdsid,a.orgid,a.qdid,a.tjlb,a.pp,a.gys,a.fmid,a.yhed,a.yhsl,a.unit
        from IV_YHD_DETAIL_SPYH_TO_PMS a,#head b
        where a.dh = b.dh and a.processflag = 'Y' and  a.op_type = @status

        update IV_YHD_DETAIL_SPYH_TO_PMS set processflag = 'R'
        from IV_YHD_DETAIL_SPYH_TO_PMS a, #head b
        where a.dh = b.dh and a.processflag = 'Y' and a.op_type = @status
      if @@transtate = 2 or @@transtate = 3 or @@error != 0        
        begin   
                select @errcode=-1       
           select @errmsg = '更新IV_YHD_DETAIL_SPYH_TO_PMS表数据出错!'                                     
                     goto procfail        
        end  


    procsuccess:
         commit trans
         goto myexit

    procfail:
         rollback trans
         goto myexit

       myexit:
          select  @errcode,@errmsg  
          select  op_type, xyqrid, dh, yhdmc, type, qsrq, jzrq,qssj, jzsj, jsfs, oano, description, oprrq, oprsj from #head
          select op_type,xyqrid,dh,gdsid,orgid,qdid,tjlb,pp,gys,fmid,yhed,yhsl,unit from #detail

end
go
grant all on p_if_pms_spyh_upload to ws
go

我明白了你所说的并尝试其他方法。我向您展示代码:

                        ResultSet rs = null;
                        int updateCount = -1;
                        int index = 1;

                        do {
                            updateCount = cs.getUpdateCount();
                            if (updateCount != -1) {      // it means it's a updateConut
                                cs.getMoreResults();
                                System.out.println("updateCount:" + updateCount);
                                continue;
                                }

                            rs = cs.getResultSet();
                            System.out.println(rs);
                            if (rs != null) {// it means updateCount == -1 and returns a resultSet

                                if (1 == index) {
                                    index++ ;
                                    if(rs.next()) {
                                        int errCode = rs.getInt(1);
                                        String errMsg = rs.getString(2);
                                        System.out.println("errCode:" + errCode + "    errMsg:" + errMsg);
                                        if (!(Constants.PROC_ERRORCODE_SUCC == errCode)) {
                                            logger.error("call sp errror:" + errMsg);
                                        }
                                    }
                                } else if (2 == index) {
                                    index++ ;
                                    rs = cs.getResultSet();
                                    while (rs.next()) {
                                         //proc resultSet                                               
                                    }

                                } else if (3 == index) {
                                    index++ ;
                                    rs = cs.getResultSet();
                                      // proc resultSet

                                    }

                                } else {
                                    break;
                                }

                                cs.getMoreResults();
                                continue;
                                                             }
                            // it means updateCount == -1 && rs == null nothing left to return    
                        } while (!(updateCount == -1 && rs == null));

这是调试结果

updateCount:1
updateCount:1
updateCount:1
updateCount:0
updateCount:0
updateCount:1
updateCount:1
updateCount:1
updateCount:1
org.apache.commons.dbcp.DelegatingResultSet@bd4e3c
errCode:0    errMsg: 
updateCount:1
updateCount:1
updateCount:1
null

这是正确的代码

                        ResultSet rs = null;
                        int updateCount = -1;
                        int index = 1;

                        do {
                            updateCount = cs.getUpdateCount();
                            if (updateCount != -1) {// it means it returns a updateCount
                                cs.getMoreResults();
                                continue;
                            }

                            rs = cs.getResultSet();
                            if (rs != null) {// it means it returns a ResultSet
                                if (1 == index) {
                                    index++;
                                    if(rs.next()) {
                                        int errCode = rs.getInt(1);
                                        String errMsg = rs.getString(2);
//                                        System.out.println("errCode:" + errCode + "    errMsg:" + errMsg);
                                        if (!(Constants.PROC_ERRORCODE_SUCC == errCode)) {
                                            logger.error("call sp execute error:" + errMsg);
                                        }
                                    }
                                    rs.close();  // it should call close() here 
                                } else if (2 == index) {

                                    index++;
                                    while (rs.next()) {
                                          //proc the second resultSet
                                    }
                                    rs.close();     // it should call close() here 
                                } else if (3 == index) {
                                    index++;
                                    while (rs.next()) {
                                        //proc the second resultSet                                         
                                    }

                                    rs.close();  // it should call close() here 
                                } else {
                                    break;
                                }

                                cs.getMoreResults();
                                continue;                                 
                            }


                        } while (!(updateCount == -1 && rs == null)); //nothing to return 
4

1 回答 1

1

您不断在循环中调用 getMoreResults

CallableStatement cstmt;
ResultSet rs;
int i;
...
cstmt.execute();                            // Call the stored procedure 

while (cstmt.getMoreResults()){             // If we have more Results

    rs = cstmt.getResultSet();              // Get the result set

    while (rs.next()) {                     
        i = rs.getInt(1);                      
        System.out.println("Value from result set = " + i);  

    }
}

rs.close();
cstmt.close();

对于您的存储过程,看起来您总是返回三个结果集

代码应该让你接近,但如果你想调试它,你可以像我展示的那样做循环,在循环内,调用 ResultSetMetaData rsmd = rs.getMetaData(); 并且 rsmd 对象将告诉您有关当前结果集的几乎所有信息,这样您就可以真正了解返回的内容。

CallableStatement cstmt;
ResultSet rs;
int i;
...
cstmt.execute();                            // Call the stored procedure 

    // select  @errcode,@errmsg

    rs = cstmt.getResultSet();              // Get the result set

    while (rs.next()) {                     
        // Process the resultset   

    }

    rs.close();

    // select  op_type, xyqrid, dh, yhdmc, type, qsrq, jzrq,qssj, jzsj, jsfs, oano, description, oprrq, oprsj from #head

    rs = cstmt.getResultSet();              // Get the result set

    while (rs.next()) {                     
        // Process the resultset   

    }

    rs.close();

    // select op_type,xyqrid,dh,gdsid,orgid,qdid,tjlb,pp,gys,fmid,yhed,yhsl,unit from #detail

    rs = cstmt.getResultSet();              // Get the result set

    while (rs.next()) {                     
        // Process the resultset   

    }

    rs.close();

cstmt.close();
于 2012-08-06T14:14:53.673 回答