oracle 批量插入语句

    最近项目中使用oracle,现在要将一个包含对象的list集合批量插入到数据库中,由于项目使用的是mybaits,所以便想着用foreach功能进行批量插入。但是oracle与mysql的批量插入有很大的不同,首先oracle不支持主键自增,所以要在数据库中创建序列,才能实现与mysql相同的功能。

下面是创建序列的方式:

      语法 CREATE SEQUENCE 序列名 [相关参数]
      参数说明 

  •      INCREMENT BY :序列变化的步进,负值表示递减。(默认1) 
  •      START WITH:序列的初始值 。(默认1) 
  •      MAXvalue:序列可生成的最大值。(默认不限制最大值,NOMAXVALUE) 
  •      MINVALUE:序列可生成的最小值。(默认不限制最小值,NOMINVALUE) 
  •      CYCLE:用于定义当序列产生的值达到限制值后是否循环(NOCYCLE:不循环,CYCLE:循环)。 
  •      CACHE:表示缓存序列的个数,数据库异常终止可能会导致序列中断不连续的情况,默认值为20,如果不使用缓存可设置NOCACHE
    例如:
  • create sequence seq_xx   --创建序列名称
  • increment by 1  --增长幅度
  • start with 1  --初始值
  • maxvalue 9999999999999999;  --最大值

插入语句:

mybatis映射中可以通过标签来实现Oracle的批量插入、更新和删除
    标签中主要有以下属性:
    collection、item、index、open、separate、close

  •     collection:该属性必须指定,指代Dao层接口传递的数据类型,主要有三种:
  •         ①:list集合类型;collection=”list“
  •         ②:array数组类型;collection=”array“
  •         ③:map映射类型;collection=”map“
  •     item:别名,表示集合中每一个元素迭代时的别名,获取数据时必须指定用别名来指定,不然会报错。
  •     index:迭代下标,即迭代过程中的位置。
  •     open:表示语句以什么开始。
  •     separate:表示每次迭代之间以什么符号作为分割。
  •     close:表示语句以什么结束。

 Oracle中可以使用java中的for循环逐条插入数据库,但是这种效率比较低,不适合一次性插入大量的数据,所以可以利用Oracle中的“dual”表实现批量处理,并且效率高。


    INSERT INTO ZZC_USER
        (ID,NAME,AGE,CREATE_TIME,UPDATE_TIME)
    SELECT SEQ_ZZC_USER.NEXTVAL CITY_ID, A.*
    FROM(
        
            SELECT 
            #{item.name,jdbcType=VARCHAR} NAME,
            #{item.age,jdbcType=NUMBER} AGE,
            #{item.createTime,jdbcType=TIMESTAMP} CREATE_TIME,
            #{item.updateTime,jdbcType=TIMESTAMP} UPDATE_TIME
            FROM dual
        
    )A

sql文与mysql的批量插入有很大的不同之处,使用时要注意两者的区别。

你可能感兴趣的:(SQL)