`

Mybatis调用Oracle存储过程,Oracle创建存储过程,Mybatis调用procedure

阅读更多

Mybatis调用Oracle存储过程,Oracle创建存储过程,Mybatis调用procedure

 

================================

©Copyright 蕃薯耀 2020-10-30

http://fanshuyao.iteye.com/

 

 一、Oracle创建存储过程

1、Oracle创建无参数的存储过程procedure

复制代码
--Oracle 创建无参数的存储过程
create or replace procedure csgx_proc_cmm_code_none
as 
begin
  update CMM_CODE l set l.code_value='dd' where l.code_id='proc_01';
  commit;
end;
/

--建立同义词
create or replace public synonym csgx_proc_cmm_code_none for aaaUser.csgx_proc_cmm_code_none;

--授权给用户bbbUser
grant execute on csgx_proc_cmm_code_none to bbbUser;

--PL/SQL调用存储过程
begin
csgx_proc_cmm_code_none;
end;
复制代码

 

2、Oracle 创建有参数的存储过程

复制代码
--Oracle 创建有参数的存储过程
--存储过程的参数名称不能和表的字段同名
create or replace procedure csgx_proc_cmm_code(p_code_id in varchar2, p_code_value in varchar2)
as 
begin
  update CMM_CODE l set l.code_value=p_code_value where l.code_id=p_code_id;
  commit;--新增、修改、删除需要提交
end;
/

--建立同义词
create or replace public synonym csgx_proc_cmm_code for aaaUser.csgx_proc_cmm_code;

--授权给用户
grant execute on csgx_proc_cmm_code to bbbUser;

--PL/SQL调用存储过程
begin
csgx_proc_cmm_code('proc_01', '4444');
end;
复制代码

 

3、Oracle创建select查询的存储过程,Oracle创建带参数的游标存储过程(即创建select的存储过程,并返回查询结果)

复制代码
--Oracle创建带参数的游标存储过程(即创建select的存储过程,并返回查询结果)
--存储过程的参数名称不能和表的字段同名
create or replace procedure csgx_proc_cmm_code_select(p_class_type in varchar2, cur_result out Sys_Refcursor)
as 
begin
  open cur_result for select * from  CMM_CODE l where l.class_type=p_class_type;
end;
/
--创建同义词 create or replace public synonym csgx_proc_cmm_code_select for aaaUser.csgx_proc_cmm_code_select; --授权给别的用户bbbUser grant execute on csgx_proc_cmm_code_select to bbbUser; --PL/SQL调用存储过程 暂时还不知道在PL/SQL如何调用
复制代码

 

二、Mybatis调用存储过程

1、Mybatis调用无参数的存储过程

<update id="callProc" statementType="CALLABLE">
    {call csgx_proc_cmm_code_none}
</update>

statementType="CALLABLE":表示该调用是存储过程,使用select、update、delete标签都可以,但建议根据业务的实际使用标签。

 

2、Mybatis调用有参数的存储过程

复制代码
<update id="callProcParams" statementType="CALLABLE" parameterType="map">
    {call csgx_proc_cmm_code_none(
        #{aaa},
        #{bbb},
        #{bbb}
    )}
</update>
复制代码

参数可以设置成map,这样方便

 

3、Mybatis调用select查询的存储过程,Mybatis调用有参数且返回查询结果的存储过程

复制代码
<resultMap id="myMap" type="java.util.Map">
</resultMap>


带游标的存储过程
<!-- 
javaType=ResultSet时,必须要有resultMap,不然会报错:
Caused by: java.lang.IllegalStateException: Missing resultmap in property 'cur_result'.
Parameters of type java.sql.ResultSet require a resultmap.
--> <select id="callProcSelect" statementType="CALLABLE" parameterType="map"> {call csgx_proc_cmm_code_select( #{p_class_type, jdbcType=VARCHAR}, #{cur_result, jdbcType=CURSOR, mode=OUT, javaType=ResultSet, resultMap=myMap} )} </select>
复制代码

 

下面为对应的存储过程:

create or replace procedure csgx_proc_cmm_code_select(p_class_type in varchar2,cur_result out Sys_Refcursor)

parameterType="map":表示Dao类中的接口方法callProcSelect传进来的参数是一个map对象。注:map是简写,Mybatis自带的,实际是:java.util.Map

#{p_class_type, jdbcType=VARCHAR}:查询条件的参数,可以多个,看实际

#{cur_result, jdbcType=CURSOR, mode=OUT, javaType=ResultSet, resultMap=myMap}:查询返回的结果,查询返回的数据会被放到这个参数,其中:

jdbcType=CURSOR:表示使用游标

mode=OUT:表示输出

javaType=ResultSet:返回结果集

resultMap=myMap:返回结果集转换对应的resultMap,可以配置一个空的,不用映射,直接返回Map对象

 

三、Dao接口调用

Map<String, Object> callProcSelect(Map<String, Object> result);

Map<String, Object> result参数是没有@Param注解的。

如果加了这个注解,如:@Param("map") Map<String, Object> result,xml的参数就要变成map.p_class_type,map.cur_result,不然没有结果返回。

如果参数是map,参数就不要用@Param注解标识,尽量避免问题(反正我折腾了很久才发现这个问题,调用成功了,返回的结果是Null)

 

四、Service调用

1、普通的存储过程调用

procDao.callProc();

 

2、Java带select查询的存储过程调用,带游标的存储过程调用:

复制代码
//声明map对象参数
Map<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put("p_class_type", "proc");

//调用存储过程,将传map参数
procService.callProcSelect(resultMap);

//接收返回的结果集,cur_result这个变量,对应的就是xml配置文件配置的参数
Object o = resultMap.get("cur_result");

//打印输出
log.info("ResultSet===" + JsonUtil.obj2String(o));
复制代码

 

 

================================

©Copyright 蕃薯耀 2020-10-30

http://fanshuyao.iteye.com/

1
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics