Mybatis调用Oracle存储过程,Oracle创建存储过程,Mybatis调用procedure
================================
©Copyright 蕃薯耀 2020-10-30
https://www.cnblogs.com/fanshuyao/
一、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
https://www.cnblogs.com/fanshuyao/