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/