oracle常见问题以及MyBatis批量插入数据

本文介绍了Oracle和MySQL数据库在批量插入、字符集、删除重复数据、数据导出等方面的操作,并针对Oracle的IN函数限制提出了解决方案。同时,提到了因列名冲突的处理方法以及Linux环境下Oracle环境配置。
摘要由CSDN通过智能技术生成

1.Oracle 、SqlServer 不支持这种批量添加

insert into a (id,name) values
(1,'aaa'),
(2,'bbb')

2.Oracle支持这种添加方法

insert into a(id, name)
select 1, 'aaa' from dual
union select 2,'bbb' from dual

mapper层数据

    /**
     * 批量插入工单数据
     *
     * @param workOrders 列表数据
     * @return 行数
     */
    int batchInsert(@Param("list") List<WorkOrder> workOrders);

xml层数据

  <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="false">
    insert into GL_WORK_ORDER (ID, WORK_NUMBER, WORK_NAME,
      AREA_CODE, EQUIPMENT_CODE,EQUIPMENT_NAME ,WORK_DETAILS,
      WORK_PHOTO, WORK_STATE, WORK_TYPE,
      ALARM_RECORD_ID, SEND_TIME, SEND_USER,
      WORK_CIRCULATION, FEEBACK_RESULT, IS_REPLACE,
      IS_LSSUED, COMPREHENSIVE_REPLACE, EQUIPMENT_REPLACE_ID,
      CREATE_BY, CREATE_BY_DEPT, CREATE_TIME,ASSIGN_DEPT_ID,
      REASON,EVENT_NAME,STAKE_NUM,PATROL_ID,BROKEN_RECORD_ID
      )
      SELECT SEQ_GL_WORD.NEXTVAL,a.* FROM (
        <foreach collection="list" item="item" separator="union all">
            SELECT
            #{item.workNumber},
            #{item.workName},
            #{item.areaCode},
            #{item.equipmentCode},
            #{item.equipmentName},
            #{item.workDetails},
            #{item.workPhoto},
            #{item.workState},
            #{item.workType},
            #{item.alarmRecordId},
            #{item.sendTime},
            #{item.sendUser},
            #{item.workCirculation},
            #{item.feebackResult},
            #{item.isReplace},
            #{item.isLssued},
            #{item.comprehensiveReplace},
            #{item.equipmentReplaceId},
            #{item.createBy},
            #{item.createByDept},
            #{item.createTime},
            #{item.assignDeptId},
            #{item.reason},
            #{item.eventName},
            #{item.stakeNum},
            #{item.patrolId},
            #{item.brokenRecordId}
            FROM dual
        </foreach>
        ) a
  </insert>
4.Oracle提示错误:插入的值太大的问题

原来这与ORACLE的字符集设置有关。

字符集设置成ZHS16GBK:汉字占2个字节。

字符集设置成AL32UTF8:汉字占3个字节。

查询字符集:

select * from v$nls_parameters t where t.PARAMETER='NLS_CHARACTERSET';
5.Oracle和MySql varchar的不同处

oracle:varchar2(6)
mysql:varchar(6)

解释:oracle长度是6,只能存3个汉字;mysql设置成6,则可以存6个汉字(1个中文为2个字节)

区别:oracle长度表示字节长度,mysql的长度表示字符长度

字符大于字节:一个字符可以是一个英文,也可以是一个中文

6.Oracle数据表删除重复数据
delete from 表名 d1
 where d1.rowid 
 < (select max(rowid) from 
  表名 d2 where d1.列名 = d2.列名)
7.Linux下Oracle导出数据
7.1找不到exp命令

编辑 /etc/profile文件 添加以下配置

# Oracle 修改配置

#Oracle安装位置
ORACLE_BASE=/opt/oracle;                          export ORACLE_BASE
#Oracle版本
ORACLE_HOME=$ORACLE_BASE/product/19c/dbhome_1;    export ORACLE_HOME
ORACLE_SID=orcl;                                  export ORACLE_SID
PATH=$ORACLE_HOME/bin:$PATH;                      export PATH

刷新配置

source /etc/profile

重新导出oracle数据

exp admin/admin@mywork file=/opt/zdgl.dmp full=y
8.MyBatis中Oracle的in函数不能高于1000解决办法
8.1使用MyBatis的 if 标签来解决
  <select id="findByGalleryRegisterIds" resultMap="BaseResultMap">
    select <include refid="Base_Column_List"/>
    from GL_GALLERY_KEY
    where GALLERY_REGISTER_ID in
    <foreach item="id" collection="galleryRegisterIds" open="(" separator="," close=")" index="index">
         <if test="(index % 999) == 998"> NULL) OR GALLERY_REGISTER_ID IN(</if>#{id}
    </foreach>
  </select>
9.列名是数据库中关键字导致sql失败

列名使用 ``引用起来

  1. 如果使用的是mybatis-plus,解决办法如下

        @TableField("`asc`")
    	private String asc;
    
  2. 如果使用的是mybatis的话

      select `asc` from test
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

往日时光--

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值