一、调用存储过程,返回单个值

方法介绍
以下是一个输入身份证号码,返回对应手机号码的存储过程。先看下oracle中调用该存储过程的流程:

1、plsql测试

①在plsql中找到要调用的存储过程,右键点击测试

②输入身份证号码,再点击左上角的启动调试器按钮,就会返回对应的手机号码

以上就实现了plsql调用存储过程的流程,结果也验证无误。

1、java代码测试

Test文件中举例,入参封装在HashMap里面

//调用存储过程,返回单个值
@Test
void callProcedure() {
    HashMap<String, Object> map = new HashMap<>();
    // 这里的deptNo和 GyBrjbxxkDao.xml中定义的名称 一致!
    map.put("as_sfz","4415812012XXXXXXXX");
    brdaMapper.findDeptNameById(map);
    // 取得返回的内容,其实只要存储过程执行后, map里就有值了
    //    d_Name和Mapper.xml中的变量名一致
    System.out.println(map.get("as_phonenum"));
}

mapper层:

void findDeptNameById(Map<String,Object> map);

mapper.xml 层

<select id="findDeptNameById" statementType="CALLABLE" parameterType="map">
    <!--   <![CDATA[]]> 加不加都可以
    1.传入传出参数要注明mode=IN/OUT
    2.并要注明jdbcType(在网上可以查询mybatis支持哪些jdbcType类型),   jdbcType=INTEGER   jdbcType=VARCHAR 等
    3.返回参数要注明对应的resultMap
    4.注意:这里deptNo,d_Name都是参数map集合的key值.  形参,和过程中的参数名无需一致
    -->
    <![CDATA[
   {call  pkg_for_jkk.sp_jkk_GetPhoneNumber(
                #{as_sfz,mode=IN,jdbcType=VARCHAR},
                #{as_phonenum,mode=OUT,jdbcType=VARCHAR}
            )}
   ]]>
</select>

点击启动按钮:

执行结果如下:

二、调用存储过程,返回多个值, 其中一个是游标

方法介绍
以下是一个输入两个号码,返回是否有缴费记录的存储过程。先看下oracle中调用该存储过程的流程:

①在plsql中找到要调用的存储过程,右键点击测试

②输入2个号码,再点击左上角的启动调试器按钮,就会返回对应的缴费记录结果

以上就实现了plsql调用存储过程的流程,结果也验证无误。

1、java代码测试

Test文件中举例,入参封装在HashMap里面

//调用存储过程,返回多个值, 其中一个是游标
@Test
void callProcedure2() {
    HashMap<String, Object> map = new HashMap<>();
    // 这里的deptNo和 GyBrjbxxkDao.xml中定义的名称 一致!
    map.put("as_patientNo","03XXXX");
    map.put("as_patientID","20XXX");
    brdaMapper.findAllDeptProcedure(map);
    // 取得返回的内容,其实只要存储过程执行后, map里就有值了
    //    d_Name和Mapper.xml中的变量名一致
    System.out.println(map.get("as_result"));
    System.out.println(map.get("as_errorInfo"));
    // 取出返回的结果集,这里变量名“deptList” 和 GyBrjbxxkDao.xml中定义的名称 一致!
    List<ads_rc> list = (List<ads_rc>) map.get("ads_rc");

    // 返回结果转JsonArr
    JSONArray jsonArray = (JSONArray) JSONArray.toJSON(list);
    System.out.println(jsonArray);
}

mapper层:

void findAllDeptProcedure(Map<String,Object> map);

mapper.xml 层

<!-- 调用oracle存储过程返回多个结果集      参数名:ads_rc自定义的,用于外面Map取值:map.get("deptList"));-->
<select id="findAllDeptProcedure" statementType="CALLABLE">
    <![CDATA[
    {call  pkg_for_jkk.sp_jkk_get_tbkk(
            #{as_patientNo,mode=IN,jdbcType=VARCHAR},
            #{as_patientID,mode=IN,jdbcType=VARCHAR},
            #{as_result,mode=OUT,jdbcType=VARCHAR},
            #{as_errorInfo,mode=OUT,jdbcType=VARCHAR},
            #{ads_rc, mode=OUT,jdbcType=CURSOR,javaType=ResultSet,resultMap=ads_rcMap}
       )}
    ]]>
</select>

同理,在代码中点击启动按钮,并执行即可

以上,就是java实现了调用oracle的存储过程的全流程

请关注我吧,一起来探讨技术的奥秘,交流更多的技术经验!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐