gpt4 book ai didi

java - Sybase 存储过程返回多结果集

转载 作者:行者123 更新时间:2023-12-01 15:14:27 26 4
gpt4 key购买 nike

我有一个问题,我使用 jdbcTemplate 执行 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

最佳答案

您不断循环调用 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 对象会告诉您有关当前 resultset 的几乎所有信息。 ,这样您就可以真正了解返回的内容。

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();

关于java - Sybase 存储过程返回多结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11827976/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com