我有一个问题,我使用jdbcTemplate exec一个Sybase存储过程返回多个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
我告诉你你说的话并尝试其他的东西。我告诉你代码打击:
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
答案 0 :(得分: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对象将告诉你关于当前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();