Mybatis調用Oracle存儲過程,Oracle創建存儲過程,Mybatis調用procedure


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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM