Oracle 批量增加 / 批量跟新
在使用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 批量增加 / 批量跟新的更多相关文章
- mysql批量增加表中新列存储过程
一般访问量比较大的网站,请求日志表都是每天一张表独立创建. 业务需要为每张表都添加一个新列,纠结了半天,写了个存储过程如下: 日志表结构类型 tbl_ads_req_20140801, tbl_ads ...
- c#调用存储过程实现批量增加和修改数据
1 例如当我在编辑表格数据,一次编辑了多行需要保存到数据库时,就需要判断数据库中是否已经存在,存在则修改,不存在则新增一条或多条数据,即所谓批量增加或者跟新数据. 首先需要构建数据包,把要添加或者跟新 ...
- rbac 权限分配, 基于formset实现,批量增加
这里需要两个知识点: - formset - 自动发现项目中的URL1. 什么是formset: Django中 form组件 或 ModelForm组件,用于做一个表单的验证. 接收前端form表单 ...
- Web端权限管理新增实用功能:批量增加操作,简单方便快速!
扩展了吉日嘎拉的Web端权限管理功能后,每次添加菜单倒没啥问题,毕竟菜单的数量有限,可是每增加一个模块.功能或者说权限控制点,就得针对各种常规操作,新增很多遍. 浪费时间,还容易出错.新增了一个字典表 ...
- oracle和mysql批量合并对比
orm框架采用mybatis,本博客介绍一下批量合并merge用oracle和mysql来做的区别, oracle merge合并更新函数的详细介绍可以参考我以前的博客:https://blog.cs ...
- ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql
转: ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql 本文为博主原创,转载请注明出处. 在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时 ...
- ElasticSearch 批量增加索引
服务端批量增加索引,版本是5.1.1 TransportClient client; Settings esSettings = Settings.builder() .put("clust ...
- 批量增加Linux系统账号、重置账号密码、FTP账号批量测试
批量增加Linux系统账号.重置账号密码是用Linux Shell脚本来做的:批量FTP账号测试是用Python脚本来做的.这些脚本都是读取一个用户名和密码文件,然后基于该用户名密码文件进行自动批量测 ...
- mybatis批量增加与删除——(十五)
1.首先应该明白,mybatis增删改返回值是int型的影响行数的值 mapper接口 package cn.xm.mapper; import java.util.List; import cn.x ...
随机推荐
- Python-接口自动化(五)
python基础知识(五) (六)类与对象 类:某一类具有共同属性和特性的事物或者说是一个抽象的描述,比如说大佬类,你就是大佬类里面具体的一个实例.类一般包含属性和方法 (1)类的语法: class ...
- typescript 关于class属性类型定义被属性默认值覆盖的问题及解决方式
问题来源于 React.component的第二个参数的类型定义问题,我构建了以下简化demo,方便描述问题: class P<STATE> { public state: STATE; ...
- idea使用错误及技巧总结合集(一)
--- Cannot start process, the working directory 'E:\algorithm\algorithm' does not exist 1.点击run后再点击e ...
- # -*- coding: utf-8 -*-
-- coding: utf-8 -- import scrapy from jobscrawler_qianchengwuyou.items import JobscrawlerQianchengw ...
- mysql 修改表字段长度
方案一: change ALTER TABLE t1 CHANGE a a VARCHAR(); change 可以用来更改字段名称和类型 ALTER TABLE table_name CHANGE ...
- 002dayPython学习编码
由于计算机是美国人发明的,所以计算机最开始只能识别256个字符(ASCII码),而你在计算机中输入中文就会报错 而中国人想让计算机认识中文,就重新编写了一套支持中文的编码(GB2312) 随后由于GB ...
- Tomcat配置及不依赖IDEA部署web应用
http:tomcat.apache.org 下载tomcat文件包 我使用的tomcat9的版本 Tomcat9014使用的是Servlet4.0 解压即可,目录如下 bin :启动和关闭tomca ...
- pytorch 读数据接口 制作数据集 data.dataset
[吐槽] 啊,代码,你这个大猪蹄子 自己写了cifar10的数据接口,跟官方接口load的数据一样, 沾沾自喜,以为自己会写数据接口了 几天之后,突然想,自己的代码为啥有点慢呢,这数据集不大啊 用了官 ...
- ARM内核单片机Bootloader中断向量重定位问题
Bootloader中断向量重定位问题 1.Bootloader程序在内核Cortex-M0+内核中运行时需要进行地址跳转执行应用程序主程序,此时就涉及到了中断向量重定位问题,以下截图为单片机启动文件 ...
- Openresty 操作Cookie
Openresty 操作cookie共有两种方法: 1.直接操作 1.1 获取Cookie 获取所有cookie: ngx.var.http_cookie, 这里获取的是一个字符串,如果不存在则返回n ...