zoukankan      html  css  js  c++  java
  • 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/

    今天越懒,明天要做的事越多。
  • 相关阅读:
    MVVM模式下,ViewModel和View,Model有什么区别
    数据结构与算法JavaScript (三) 链表
    数据结构与算法JavaScript (二) 队列
    数据结构与算法JavaScript (一) 栈
    2014总结
    模拟jsonp的实现
    模拟ajax的 script请求
    四种常见的 POST 提交数据方式
    jQuery尺寸算法
    元素尺寸的获取
  • 原文地址:https://www.cnblogs.com/fanshuyao/p/13903413.html
Copyright © 2011-2022 走看看