mybatis之調(diào)用帶輸出參數(shù)的存儲過程(Oracle)
創(chuàng)建一個存儲過程
CREATE OR REPLACE PROCEDURE GET_QUESTIONNAIRE_CONTENT(QUESTIONNAIRE_ID_IN IN VARCHAR2, resultOut OUT CLOB) begin # 處理邏輯 resultOut = 'result....' end
SQL工具中調(diào)用存儲過程
我使用的工具是navicat
在Navicat工具中調(diào)用存儲過程。
declare
V_questionid VARCHAR2(100) ; --輸入?yún)?shù)
V_replay clob; --輸出參數(shù)
BEGIN
DBMS_OUTPUT.ENABLE(buffer_size => null) ; --設置緩存大小
V_questionid := '2079439a1d0a4287999e1f0c3cffade12'; --賦值
--調(diào)用存儲過程,GET_QUESTIONNAIRE_CONTENT 為存儲過程的名字
GET_QUESTIONNAIRE_CONTENT(V_questionid,V_replay);
dbms_output.put_line(V_replay); --輸出結(jié)果
end;
錯誤 [Err] ORA-20000: ORU-10027: buffer overflow, limit of 20000 bytes
緩存溢出。使用dbms_output.put_line(變量)時報出的錯誤,從上面也可以知道dbms_output.put_line默認的緩存大小20000bytes 。
解決方法:
在調(diào)用Oracle輸出語句之前,先調(diào)用 DBMS_OUTPUT.ENABLE(buffer_size => null),表示輸出buffer不受限制。
Mybatis調(diào)用存儲過程
Mapper中定義方法
【QuestionMapper.java】
void callProcedureContent(Map<String,Object> args);
Service中調(diào)用
// 使用Map 來傳參并接受返回結(jié)果
Map<String,Object> args=new HashMap<>();
args.put("questionnaireId","q121231123123");//問卷id
args.put("sqlStr",null);//接受返回結(jié)果
// 對于此存儲過程而言,不需要指定返回結(jié)果。 sqlStr 會被賦予 存儲過程的out類型參數(shù)值
questionMapper.callProcedureContent(args);
String result = (String)args.get("sqlStr"); //從map 中獲取結(jié)果
配置映射文件
Oracle腳本
<!--問卷導出 存儲過程 答案 -->
<update id="callProcedureContent" statementType="CALLABLE" parameterType="map">
CALL GET_QUESTIONNAIRE_CONTENT( #{questionnaireId,mode=IN,jdbcType=VARCHAR},#{sqlStr,mode=OUT,jdbcType=CLOB,javaType=string})
</update>
SQLServer腳本
<!--問卷導出 存儲過程 答案 -->
<update id="callProcedureContent" statementType="CALLABLE" parameterType="map">
{ CALL GET_QUESTIONNAIRE_CONTENT( #{questionnaireId,mode=IN,jdbcType=VARCHAR},#{sqlStr,mode=OUT,jdbcType=CLOB,javaType=string}) }
</update>
調(diào)用存儲過程和執(zhí)行普通的sql文件大致相同,
需要注意一下幾點:
1.statementType: 必須設置為 CALLABLE。默認值是 PREPARED 不需要設置
2.調(diào)用帶 輸出參數(shù)的存儲過程時,參數(shù)必須存在以下額外屬性。
mode:必須設置( mode=OUT、mode=INOUT)jdbcType:必須設置 (jdbcType=VARCHAR、jdbcType=INTEGER。。。。。。。)
3.使用 CALL 來調(diào)用存儲過程
4.調(diào)用SQLserver的存儲過程,必須使用{} 包裹起來,使用Oracle沒有這個限制。
5.parameterType : 可以省略
存儲過程傳參不同,mybatis對應接受返回結(jié)果的方式也是各不相同。
如果存儲過程中 沒有使用 OUT 或者INOUT 參數(shù)。接受返回結(jié)果和普通的查詢 Sql寫法一致。
對于查詢語句(select)語句可以使用實體類來接受返回結(jié)果,mybatis會自動進行字段映射。
<select id="id" statementType="CALLABLE" resultType="map">
CALL SELECT_PROCEDURE(#{id,mode=IN,jdbcType=VARCHAR})
</update>
如果開啟了配置下劃線映射駝峰標記的配置,會將數(shù)據(jù)庫字段(下劃線)映射為駝峰寫法的字段(USER_NAME—>userName)
<setting name="mapUnderscoreToCamelCase" value="true" />
存儲過程中使用了 OUT、INOUT類型的參數(shù)。即使使用 select 元素查詢,實際上返回結(jié)果也是null (存儲過程腳本就沒有必要寫在 select 元素中,可以使用update、delete 等元素)。
通常使用實體類或者map作為傳入?yún)?shù)并接受返回結(jié)果。
<update id="id" statementType="CALLABLE" parameterType="map">
{ CALL PROCEDURE_NAME( #{id,mode=IN,jdbcType=VARCHAR}) }
</update>
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Maven pom的distributionManagement配置方式
文章主要介紹了Maven的distributionManagement配置方式,以及它的作用、配置方法和重要性,distributionManagement用于指定構(gòu)件的發(fā)布位置,包括下載URL、狀態(tài)等,文章還詳細解釋了如何配置repository和snapshotRepository,以及它們的用途和區(qū)別2025-01-01
SpringBoot監(jiān)控模塊Actuator的用法詳解
Spring?Boot?Actuator?是?Spring?Boot?自帶的一個功能模塊,提供了一組已經(jīng)開箱即用的生產(chǎn)環(huán)境下常用的特性和服務,比如應用程序的健康檢查、信息暴露、度量收集、日志記錄等,本文將給大家詳細SpringBoot監(jiān)控模塊Actuator的用法2023-06-06
Spring Cloud Gateway Hystrix fallback獲取異常信息的處理
這篇文章主要介紹了Spring Cloud Gateway Hystrix fallback獲取異常信息的處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
Security框架:如何使用CorsFilter解決前端跨域請求問題
這篇文章主要介紹了Security框架:如何使用CorsFilter解決前端跨域請求問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
基于Java代碼實現(xiàn)游戲服務器生成全局唯一ID的方法匯總
我們在做服務器系統(tǒng)開發(fā)的時候,為了適應數(shù)據(jù)大并發(fā)的請求,需要插入數(shù)據(jù)庫之前生成一個全局的唯一id,糾結(jié)全局唯一id怎么生成呢?下面小編給大家分享Java代碼實現(xiàn)游戲服務器生成全局唯一ID的方法匯總,涉及到優(yōu)劣勢方面的知識點,對此感興趣的朋友一起看看吧2016-10-10

