spring+springMvc+mybatis 调用oracle 存储过程

   最近在项目中遇到在mybatis中调用oracle存储过程的问题,网上各种查询,最终解决了问题,在我们项目中我只需要oracle 的存储过程返回一个字符串用来存入数据库作为表数据的主键,

接下来整理代码:

   首先构建存储过程getSequence,一个输入,输出参数。

省略数据库表的创建。

 create or replace 

procedure getSequence(tableName in varchar2, outId out varchar2)
is

PRAGMA AUTONOMOUS_TRANSACTION; --自治事务 

ls_year varchar2(4); --年度
ls_month varchar2(2); --月度
ls_day varchar2(2); --日

--自治事务: 防止外层事务调用内层事务时被内层事务中的commit提交了不该提交的内容 
--version: 2.0

begin
ld_date := sysdate;
ls_table := lower(as_table_code);
ls_year := To_char(ld_date, 'yyyy' );
ls_month := To_char(ld_date, 'mm' );
ls_day := To_char(ld_date, 'dd' );
select nvl(max(sequence_value),0)
into ld_value
from sm_sequence
where sequence_code = ls_table ;

If ld_value = 0 then

ld_value := 1;
insert into sm_sequence
(sequence_code,
sequence_year,
sequence_month,
sequence_day,
sequence_value )
values
(ls_table,
to_char( sysdate, 'yyyy' ),
to_char( sysdate, 'mm' ),
to_char( sysdate, 'dd' ),
ld_value );

else
select sequence_year, sequence_month, sequence_day, sequence_value
into ln_year, ln_month, ln_day, ld_value
from sm_sequence
where sequence_code = ls_table;
if ln_year <> to_number(to_char(sysdate, 'yyyy')) or
ln_month <> to_number(to_char(sysdate, 'mm')) or
ln_day <> to_number(to_char(sysdate, 'dd')) then
ld_value := 1;
else
ld_value := ld_value + 1;
end if;
update sm_sequence
set sequence_value = ld_value,
sequence_year = ls_year,
sequence_month = ls_month,
sequence_day = ls_day
where sequence_code = ls_table ;

End If;
commit;
as_id := ls_year ||ls_month||ls_day||ltrim(to_char(ld_value, '00000000' ));
end ;

函数构建完成;

在pl/sql 中调用:

 

SQL> set serveroutput on
SQL> DECLARE
2 tableName varchar2(20);
3 row_id varchar2(10);
4 BEGIN
5 getSequence(tableName,row_id);
6
7 dbms_output.put_line(row_id);
  8  END;
9 /
ename

 

 

在Spring+springMVC+myBatis项目中调用,

java调用:

dao层:  

  public interface getMapper(){

    public void getSequence(HashMap<String,Object> params);

   }

mybatis 层xml 配置:

<parameterMap type="java.util.Map" id="getUserCountMap">
<parameter property="tableName" mode="IN" jdbcType="VARCHAR"/>
<parameter property="rowId" mode="OUT" jdbcType="VARCHAR"/>
</parameterMap>
<select id="getSequence" statementType="CALLABLE"
parameterMap="getUserCountMap" >
{call getSequence (?,?)}
</select>

service层调用:

HashMap<String,Object> param =new HashMap<String,Map>();

param.put("tableName","表名");

getMapper.getSequence(param);//此处特别注意调用时不需要返回类型,一旦执行完存储过程map中就已经存在值

System.out.print(param.get("rowId"));

以上是这次项目开发中遇到的问题,另外spring+springMVC+mybatis调用oracle存储过程返回多条数据的还在研究中,先整理这么多

 

转载于:https://www.cnblogs.com/zhencode666/p/6063536.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值