Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Sybase存储过程返回了多个结果集_Java_Stored Procedures_Sybase_Jdbctemplate - Fatal编程技术网

Java Sybase存储过程返回了多个结果集

Java Sybase存储过程返回了多个结果集,java,stored-procedures,sybase,jdbctemplate,Java,Stored Procedures,Sybase,Jdbctemplate,我有一个问题,我使用jdbcTemplate exec一个Sybase存储过程返回mulit ResultSet,如何获得所有ResultSet 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) --- 订单状态

我有一个问题,我使用jdbcTemplate exec一个Sybase存储过程返回mulit ResultSet,如何获得所有ResultSet

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
这是调试结果

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 

您一直在循环中调用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();


你并不真的需要循环,如果你知道你有一个固定的结果集,你可以调用getMoreResults()。首先谢谢,但是有些更新正在进行中,我不熟悉sp,所以我不知道如何处理,这让我头疼。我粘贴了sp,你能帮我吗@MikeI让你说,在网上找些东西,粘贴一些新代码up@Mike. 我调试它,发现一些东西让我困惑。我还显示了调试的结果。我想如果grant命令与此有关?有什么想法吗?嗨@Mike,你应该调用cstmt.getMoreResults()方法到下一个ResultSet,但是你提醒我调用rs.close(),非常感谢,我解决了这个困扰我两天的问题。你太好了。我还粘贴了代码。
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();