700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > spring+springMvc+mybatis 调用oracle 存储过程

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

时间:2018-11-10 11:24:42

相关推荐

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 interfacegetMapper(){

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" >

{callgetSequence(?,?)}

</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存储过程返回多条数据的还在研究中,先整理这么多

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。