Mybatis调用Oracle存储过程与PostgreSql存储过程的差异
DemoService代码
Oracle:
public String callProc()throws Exception {
Map<String, Object> param=new HashMap<>();
param.put("P_UUID", "sid");
param.put("P_CODE", "");
param.put("P_ERROR", "");
demoMapper.callProc(param);
Object perror = param.get("P_CODE");//执行结果获取
return perror.toString();
}
PostgraSql:
public String callProc()throws Exception {
Map<String, Object> param=new HashMap<>();
param.put("P_UUID", "sid");
param.put("P_CODE", "");
param.put("P_ERROR", "");
Map<String, Object> res=demoMapper.callProc(param);
Object perror = res.get("P_CODE");//执行结果获取
return perror.toString();
}
DemoMapper.class
Oracle:
void callProc(Map<String, Object> param);
PostgraSql:
Map<String, Object> callProc(Map<String, Object> param);
DemoMapper.xml
Oracle:
<select id="callProc" parameterType="Map" statementType="CALLABLE">
CALL proc_demo(
#{P_UUID,mode=IN,jdbcType=VARCHAR},
#{P_CODE ,mode=OUT,jdbcType=VARCHAR},
#{P_ERROR,mode=OUT,jdbcType=VARCHAR}
)
</select>
<!--PostgraSql:PostgreSQL数据库mode只有IN类型-->
<select id="callProc" parameterType="Map" statementType="CALLABLE" resultType="map">
CALL proc_demo(
#{P_UUID,mode=IN,jdbcType=VARCHAR},
#{P_CODE ,mode=IN,jdbcType=VARCHAR},
#{P_ERROR,mode=IN,jdbcType=VARCHAR}
)
</select>
存储过程
CREATE OR REPLACE PROCEDURE proc_demo(P_UUID IN VARCHAR2,P_CODE IN OUT varchar2,P_ERROR IN OUT varchar2)
as
begin
........
exception
when others then
rollback;
P_CODE := sqlcode;
P_ERROR:=substr(sqlerrm, 1, 1000);
end;