mybatis之调用带输出参数的存储过程(Oracle)

 更新时间:2023年11月30日 17:03:26   作者:柳风123  
这篇文章主要介绍了mybatis调用带输出参数的存储过程(Oracle),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

创建一个存储过程

CREATE OR REPLACE PROCEDURE GET_QUESTIONNAIRE_CONTENT(QUESTIONNAIRE_ID_IN IN VARCHAR2, 
	resultOut OUT CLOB)
begin
# 处理逻辑
	resultOut = 'result....'
end

SQL工具中调用存储过程

我使用的工具是navicat

在Navicat工具中调用存储过程。

    declare 
    	V_questionid VARCHAR2(100) ; --输入参数
    	V_replay clob; --输出参数
    BEGIN
	    DBMS_OUTPUT.ENABLE(buffer_size => null) ; --设置缓存大小
	    V_questionid := '2079439a1d0a4287999e1f0c3cffade12'; --赋值
	    
	    --调用存储过程,GET_QUESTIONNAIRE_CONTENT 为存储过程的名字
	    GET_QUESTIONNAIRE_CONTENT(V_questionid,V_replay); 
	    dbms_output.put_line(V_replay); --输出结果
    end;

错误 [Err] ORA-20000: ORU-10027: buffer overflow, limit of 20000 bytes

缓存溢出。使用dbms_output.put_line(变量)时报出的错误,从上面也可以知道dbms_output.put_line默认的缓存大小20000bytes 。

解决方法:

在调用Oracle输出语句之前,先调用 DBMS_OUTPUT.ENABLE(buffer_size => null),表示输出buffer不受限制。

Mybatis调用存储过程

Mapper中定义方法

【QuestionMapper.java】

void callProcedureContent(Map<String,Object> args);

Service中调用

// 使用Map 来传参并接受返回结果
Map<String,Object> args=new HashMap<>();
args.put("questionnaireId","q121231123123");//问卷id
args.put("sqlStr",null);//接受返回结果

// 对于此存储过程而言,不需要指定返回结果。  sqlStr 会被赋予 存储过程的out类型参数值
questionMapper.callProcedureContent(args);
String result = (String)args.get("sqlStr"); //从map 中获取结果

配置映射文件

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>

调用存储过程和执行普通的sql文件大致相同,

需要注意一下几点:

1.statementType: 必须设置为 CALLABLE。默认值是 PREPARED 不需要设置

2.调用带 输出参数的存储过程时,参数必须存在以下额外属性。

  • mode:必须设置( mode=OUT、mode=INOUT)
  • jdbcType :必须设置 (jdbcType=VARCHAR、jdbcType=INTEGER。。。。。。。)

3.使用 CALL 来调用存储过程

4.调用SQLserver的存储过程,必须使用{} 包裹起来,使用Oracle没有这个限制。

5.parameterType : 可以省略

存储过程传参不同,mybatis对应接受返回结果的方式也是各不相同。

如果存储过程中 没有使用 OUT 或者INOUT 参数。接受返回结果和普通的查询 Sql写法一致。

对于查询语句(select)语句可以使用实体类来接受返回结果,mybatis会自动进行字段映射。

<select id="id"  statementType="CALLABLE"  resultType="map">
	CALL SELECT_PROCEDURE(#{id,mode=IN,jdbcType=VARCHAR})
</update>

如果开启了配置下划线映射驼峰标记的配置,会将数据库字段(下划线)映射为驼峰写法的字段(USER_NAME—>userName)

<setting name="mapUnderscoreToCamelCase" value="true" />

存储过程中使用了 OUTINOUT类型的参数。即使使用 select 元素查询,实际上返回结果也是null (存储过程脚本就没有必要写在 select 元素中,可以使用update、delete 等元素)。

通常使用实体类或者map作为传入参数并接受返回结果。

<update id="id"  statementType="CALLABLE"  parameterType="map">
	{ CALL PROCEDURE_NAME( #{id,mode=IN,jdbcType=VARCHAR}) }
</update>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java实现即时通信的完整步骤分享

    java实现即时通信的完整步骤分享

    这篇文章主要给大家介绍了关于java实现即时通信的完整步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java中toString()、String.valueOf、(String)强转区别

    Java中toString()、String.valueOf、(String)强转区别

    相信大家在日常开发中这三种方法用到的应该很多,本文主要介绍了Java中toString()、String.valueOf、(String)强转区别,感兴趣的可以了解一下
    2021-09-09
  • 详解JDK9特性之JPMS模块化

    详解JDK9特性之JPMS模块化

    JDK9引入了一个特性叫做JPMS(Java Platform Module System),也可以叫做Project Jigsaw。模块化的本质就是将一个大型的项目拆分成为一个一个的模块,每个模块都是独立的单元,并且不同的模块之间可以互相引用和调用。本文将详细介绍JDK9特性之JPMS模块化。
    2021-06-06
  • 基于SpringMVC拦截器实现接口耗时监控功能

    基于SpringMVC拦截器实现接口耗时监控功能

    本文呢主要介绍了基于SpringMVC拦截器实现的接口耗时监控功能,统计接口的耗时情况属于一个可以复用的功能点,因此这里直接使用 SpringMVC的HandlerInterceptor拦截器来实现,需要的朋友可以参考下
    2024-02-02
  • 一文带你认识Java中的Object类和深浅拷贝

    一文带你认识Java中的Object类和深浅拷贝

    任何变成语言中,其实都有浅拷贝和深拷贝的概念,Java 中也不例外,下面这篇文章主要给大家介绍了关于Java中Object类和深浅拷贝的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • Java 多线程并发LockSupport

    Java 多线程并发LockSupport

    这篇文章主要介绍了Java 多线程并发LockSupport,LockSupport 类是用于创建锁和其他同步类的基本线程阻塞原语,更多相关内容需要得小伙伴可以参考一下下面文章内容
    2022-06-06
  • 解决springmvc关于前台日期作为实体类对象参数类型转换错误的问题

    解决springmvc关于前台日期作为实体类对象参数类型转换错误的问题

    下面小编就为大家带来一篇解决springmvc关于前台日期作为实体类对象参数类型转换错误的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • java 实现通过 post 方式提交json参数操作

    java 实现通过 post 方式提交json参数操作

    这篇文章主要介绍了java 实现通过 post 方式提交json参数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 详解Java中二叉树的基础概念(递归&迭代)

    详解Java中二叉树的基础概念(递归&迭代)

    二叉树(Binary tree)是树形结构的一个重要类型。本文将通过图片和示例代码详细为大家讲解一下Java中的二叉树的基础概念,需要的可以参考一下
    2022-03-03
  • java中反射和注解的简单使用方法

    java中反射和注解的简单使用方法

    相信大家对注解和反射应该并不陌生,在现在信息飞速发展的年代,各种优秀的框架或许都离不开注解的使用,这篇文章主要给大家介绍了关于java中反射和注解的简单使用方法,需要的朋友可以参考下
    2021-08-08

最新评论