首先是XML 文件
<select id="procTrainPay" parameterMap="testParameterMap" statementType="CALLABLE" >
{call PROC_TRAIN_PAY(?,?,?,?,?,?,?,?)}
</select>
sql 语句 sql在sql server里面执行成功 得到自己想要的效果
USE [TE_BASE]
GO
/****** Object: StoredProcedure [dbo].[PROC_TRAIN_PAY] Script Date: 01/30/2015 13:15:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].PROC_TRAIN_PAY , @ISSUE VARCHAR(20), @TRAIN NUMERIC, @EXAM NUMERIC, @Billtrain varchar(20),@Billexam varchar(20), @OP13 varchar(20),@PL VARCHAR(30) out )
--@OT是id @ISSUE 期号 @TRAIN 培训金额@EXAM 考试金额 @Billtrain培训发票号 @Billexam考试发票 @OP13收费人
as
declare @PointerPrev int
declare @PointerCurr int
declare @SUUEECE int --记录成功的多少条
declare @SUM int
declare @OT00 int --学员培训申请表ID
declare @OT08 varchar(100) --学员项目名称
declare @OT02 varchar(20) --学员培训期号
declare @COUNT int --该计划一共有多少学员
declare @OT03 varchar(30) --档案号
declare @OP03 NUMERIC --培训金额
declare @OP09 NUMERIC --考试金额
declare @DATE varchar(10) --获取当前日期
declare @OT031 varchar(20) --记录档案号是否重复
declare @X int --自增数
set @PointerCurr=1 --循环字符串用的
set @SUM=0
set @SUUEECE=0
SET @X=0
BEGIN TRANSACTION
BEGIN
while(@PointerCurr<LEN(@OT))
BEGIN
set @OT08=NULL
set @OT02=NULL
set @OT03=NULL
set @OP03=NULL
set @OP09=NULL
set @OT031=NULL
set @PointerPrev=CHARINDEX('`',@OT,@PointerCurr)
--计算出截取的ID
set @OT00=CAST(SUBSTRING(@OT,@PointerCurr,@PointerPrev-@PointerCurr) as int)
set @PointerCurr=@PointerPrev+1
SELECT @OT08=OT08,@OT02=OT02 FROM OA_STUDENT_TRAIN where OT00=@OT00
if(@ISSUE IS NOT NULL)
BEGIN
SET @OT02=@ISSUE
end
if(@OT08 IS NULL or @OT02 IS NULL)
begin
rollback --事物回滚
SET @PL = 'N'
return
end
--获取这期培训多少人,生产档案号
SELECT @COUNT= COUNT(OT03) FROM OA_STUDENT_TRAIN where ot02 = @OT02 and (OT03 IS NOT NULL or OT03 != '')--查询出已经有学员档案号的学员
--生出学员档案号
SET @OT03=@OT02+'000'+@COUNT+@X
SET @X=@X+1
--查询次学员的档案号是否重复
SELECT @OT031=OT03 FROM OA_STUDENT_TRAIN WHERE OT03=@OT03
if(@OT031 IS NOT NULL)
begin
rollback --事物回滚
print '事物回滚了'
SET @PL = 'N'
return
end
--培训期号 档案号 向学员报名里面插入
declare @sql varchar(MAX)
SET @sql='update OA_STUDENT_TRAIN set OT02='+@OT02+', OT03='+@OT03+' where OT00='+cast(@OT00 as varchar)
exec(@sql)
SET @SUM=@@error+@SUM
--取出这个作业项目的收费标准
SELECT @OP03=OS03,@OP09=OS07 FROM OA_FEE_SCALE WHERE OS06=@OT08
select @DATE=convert(varchar(10),getdate(),120)
if(@OP09 IS NULL OR @OP03 IS NULL)
begin
rollback --事物回滚
SET @PL = 'N'
return
end
--金额
if(@TRAIN=0 or @TRAIN is NULL)
begin
set @OP03=@TRAIN
end
if(@EXAM = 0 or @EXAM is NULL )
begin
set @OP09=@EXAM
end
--插入学员缴费记录
insert into OA_STUDENT_PAY(OP01,OP02,OP04,OP03,OP06,OP07,OP09,OP05,OP13)
values( @OT03,'现金',@DATE,@OP03,@Billtrain,@Billexam,@OP09,@OT08,@OP13)
SET @SUM=@@error+@SUM
END
if(@SUM>0)
begin
rollback--事物回滚
SET @PL = 'N'
return
end
else
begin
COMMIT --事物提交
SET @PL ='Y'
end
END
return @SUUEECE
这个是我的DAO层
@Transactional
public Map<String,Object> procTrainPay(Map <String,Object> map){
return baseMapper.procTrainPay(map);
}
这个是我调用的dao
Map<String,Object> map= new HashMap<String,Object>();
map.put("addend1",str[x]+"`" );
map.put("addend2",studentPay.getOp02() );
map.put("addend3",studentPay.getOp03() );
map.put("addend4",studentPay.getOp09() );
map.put("addend5",studentPay.getOp07() );
map.put("addend6",studentPay.getOp08() );
map.put("addend7",user.getSu01() );
Map <String,Object>mapl=baseService.procTrainPay(map);
System.out.println(mapl.get("sum"));
执行的结果是空指针。 mapl得到的是一个空值, procTrainPay方法执行没报错。 这里是我sql返回值写错了?还是我的xml配置写错?
XML 里面还少了
<parameterMap type="java.util.Map" id="testParameterMap">
<parameter property="addend1" jdbcType="VARCHAR" mode="IN"/>
<parameter property="addend2" jdbcType="VARCHAR" mode="IN"/>
<parameter property="addend3" jdbcType="NUMERIC" mode="IN"/>
<parameter property="addend4" jdbcType="NUMERIC" mode="IN"/>
<parameter property="addend5" jdbcType="VARCHAR" mode="IN"/>
<parameter property="addend6" jdbcType="VARCHAR" mode="IN"/>
<parameter property="addend7" jdbcType="VARCHAR" mode="IN"/>
<parameter property="sum" jdbcType="VARCHAR" mode="OUT"/>
</parameterMap>
Map mapl=baseService.procTrainPay(map);
mapl.put("sum",map.get("sum"));
System.out.println(mapl.get("sum"));
需要将paramterMap改为Map类型,我遇到的问题跟你一样,后来是这么解决的
<select id="aaaaa"
statementType="CALLABLE"
parameterType="java.util.Map"
resultType="java.util.Map">
exec ***** @aaa = #{a},@bbb = #{b},@ccc= #{c}
</select>