在使用oracl过程中踩到好多坑,在此记录,也分享给大家。

第一:批量插入

代码一(在为明确表和字段的情况下,动态批量增加):

   @Insert("<script>  " +
" Insert into ${tableName} ( ${serverColumns} )" +
" <foreach collection='list' item='item' index='index' separator='UNION ALL'> " +
"( SELECT ${item} FROM dual)" +
" </foreach> "+
"</script> ")
int insertBatch(@Param("tableName") String tableName, @Param("serverColumns") String serverColumns, @Param("list") List<String> list);

代码二(具体演示Mybatis,Mappe.xml中的代码):

  <insert id="insertBatch" parameterType="java.util.List" useGeneratedKeys="false">
INSERT INTO RELATION
(ID,LCC_CODE,CLIENT_CODE,KEY_ID,DICT_ID,REMARK,UPDATE_FLAG,SERVER_CREATE_TIME)
<foreach collection="list" index="index" item="list" separator=" union all">
(SELECT
${list}
FROM
dual)
</foreach>
</insert>

第二:批量更新

代码(具体演示Mybatis,Mappe.xml中的代码):

<update id="updateUserPswdBatch" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" open="begin" close=";end;" separator=";">
UPDATE T_HPM_PUBLIC_USER
<set>
<if test="item.password != null">
PASSWORD = #{item.password},
</if>
</set>
where ID = #{item.id}
<if test='item.idNumber != null and item.idNumber !="" '>
AND ID_NUMBER = #{item.idNumber}
</if>
</foreach>
</update>

单元测试:

@Test
public void updateUserPswdBatchTest() {
List<Map<String, String>> list = new ArrayList<>();
Map<String, String> map1 = new HashMap<>();
map1.put("id", "789456");
map1.put("password", "777777777777777777");
Map<String, String> map2 = new HashMap<>();
map2.put("id", "123456");
map2.put("password", "88888888888888888888");
Map<String, String> map3 = new HashMap<>();
map3.put("id", "8563159");
map3.put("password", "9999999999999999999");
map3.put("idNumber","530111197111083524");
list.add(map1);
list.add(map2);
list.add(map3);
int i = userMapper.updateUserPswdBatch(list);
logger.info("【批量更新获取的结果为】 i={}", i);
}

注意一:更新的结果i=-1;但是测试后还是-1.

百度查了具体原因:

返回负数,是由于mybatis的defaultExecutorType的引起的,defaultExecutorType有三个执行器SIMPLE、REUSE和BATCH。

其中BATCH可以批量更新操作缓存SQL以提高性能,但是有个缺陷就是无法获取update、delete返回的行数

如果确定要拿到更新条数,defaultExecutorTypes设置成SIMPLE就可以

说明:

在项目中把defaultExecutorTypes设置成SIMPLE以后,返回的数据还是-1,拿不到具体执行的条数。

注意二:oracle执行update和insert语句卡住不动的问题

百度查了具体原因:

造成这样的情况原因在于你之前执行了update或inert操作但你并没有commit,导致你操作的这条记录被oracle锁住,后面就无法update或insert它了

解决办法:

1:可能你是在PLSQL中操作的,commit一下
2:查询锁定记录:

SELECT s.sid, s.serial# FROM v$locked_object lo, dba_objects ao, v$session s WHERE ao.object_id = lo.object_id AND lo.session_id = s.sid;

将查询结果中的数据删除:

ALTER system KILL session 'SID,serial'

 

 

Oracle 批量增加 / 批量跟新的更多相关文章

  1. mysql批量增加表中新列存储过程

    一般访问量比较大的网站,请求日志表都是每天一张表独立创建. 业务需要为每张表都添加一个新列,纠结了半天,写了个存储过程如下: 日志表结构类型 tbl_ads_req_20140801, tbl_ads ...

  2. c#调用存储过程实现批量增加和修改数据

    1 例如当我在编辑表格数据,一次编辑了多行需要保存到数据库时,就需要判断数据库中是否已经存在,存在则修改,不存在则新增一条或多条数据,即所谓批量增加或者跟新数据. 首先需要构建数据包,把要添加或者跟新 ...

  3. rbac 权限分配, 基于formset实现,批量增加

    这里需要两个知识点: - formset - 自动发现项目中的URL1. 什么是formset: Django中 form组件 或 ModelForm组件,用于做一个表单的验证. 接收前端form表单 ...

  4. Web端权限管理新增实用功能:批量增加操作,简单方便快速!

    扩展了吉日嘎拉的Web端权限管理功能后,每次添加菜单倒没啥问题,毕竟菜单的数量有限,可是每增加一个模块.功能或者说权限控制点,就得针对各种常规操作,新增很多遍. 浪费时间,还容易出错.新增了一个字典表 ...

  5. oracle和mysql批量合并对比

    orm框架采用mybatis,本博客介绍一下批量合并merge用oracle和mysql来做的区别, oracle merge合并更新函数的详细介绍可以参考我以前的博客:https://blog.cs ...

  6. ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql

    转: ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql 本文为博主原创,转载请注明出处. 在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时 ...

  7. ElasticSearch 批量增加索引

    服务端批量增加索引,版本是5.1.1 TransportClient client; Settings esSettings = Settings.builder() .put("clust ...

  8. 批量增加Linux系统账号、重置账号密码、FTP账号批量测试

    批量增加Linux系统账号.重置账号密码是用Linux Shell脚本来做的:批量FTP账号测试是用Python脚本来做的.这些脚本都是读取一个用户名和密码文件,然后基于该用户名密码文件进行自动批量测 ...

  9. mybatis批量增加与删除——(十五)

    1.首先应该明白,mybatis增删改返回值是int型的影响行数的值 mapper接口 package cn.xm.mapper; import java.util.List; import cn.x ...

随机推荐

  1. 关于在UNIcode环境下得TCHAR转string类型以及string转TCHAR

    using namespace System::Text: String ^TCHARtoStr(TCHAR *temp) //TCHAR转String { array<unsigned cha ...

  2. Linux c使用gumbo库解析页面表单信息(一)

    一.gumbo介绍 gumbo是一个由谷歌开发的,能够解析html页面的库.功能稳定可靠,使用起来十分方便. 二.gumbo安装 (1)从https://github.com/google/gumbo ...

  3. 输入一个字母,是元音字母,则输出时元音字母*,否则,输出为辅音字母 (元音字母有:a,e,i,o,u)

    import java.util.Scanner; public class test4 { public static void main(String[] args) { // TODO Auto ...

  4. Rhino学习教程——1.4

    状态栏 状态栏位于整个工作界面的下方,主要显示了一些系统操作时的信息. 根据不同的功能,可以将状态栏分成4个部分. 一.坐标系统 在状态栏左侧显示了当前所使用的坐标系统(“世界”或“工作平面”,可以通 ...

  5. eclipse svn不显示提交人、提交时间的问题

    最近eclipse换到最新的mars版本,装了svn插件subversive后,拉下项目后发现都不显示提交人了,以前都不这样的呀,新版不一样了么? 后来网上搜索总算找到方法解决: Window--&g ...

  6. 第九次java课堂笔记

  7. 未知高度的div自适应图片高度

    <div style="background-image: url(http://your-image.jpg);"> <img src="http:/ ...

  8. spring boot 全局配置属性一览

    # =================================================================== # COMMON SPRING BOOT PROPERTIE ...

  9. python-之-深浅拷贝二(元组)

    元组比较特殊 1.----元组本身为不可变类型 import copy v1 = (1, 2, 3, 4) v2 = copy.copy(v1) print(id(v1), id(v2)) v3 = ...

  10. Mad libs

    Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32 Type &q ...