繁体   English   中英

Mybatis是否可以在Oracle中插入全部并返回序列(useGenerateKeys)?

[英]Is mybatis enable to insert all and return sequence(useGenerateKeys) in oracle?

我目前正在从PostgreSQL迁移到Oracle DBMS。 但是会出现一些问题。 我希望工作“使用中的将所有序列插入序列并返回到应用程序中”。

我的PostgreSQL代码是(它也适用于MySQL和MariaDB)

 <insert id="insertServiceCodeList" parameterType="serviceCodeVo" useGeneratedKeys="true" keyColumn="code" keyProperty="code">
    insert into service_code (
        serv_info_seq_id,
        name,
        default_key_type,
        cre_date,
        creator,
        description,
        state
    ) values 
    <foreach collection="list" item="item" separator=","> 
    (
        #{item.servInfoSeqId},
        #{item.name},
        #{item.defaultKeyType},
        now(),
        #{item.creator},
        #{item.description},
        0
    )
    </foreach>
</insert>

我试图案例。 见下文。

情况1

它在Oracle中确实有效,但在mybatis中则无效,不返回序列。

1.创建序列

Create Sequence service_code_seq;

2.为sequence.nextval创建函数

create or replace function get_seq( seq_name in varchar2 ) 
return 
  number 
is
  v_num number;
  sql_stmt varchar2(64);
begin
  sql_stmt := 'select ' || seq_name || '.nextval from dual';
  execute immediate sql_stmt into v_num;
  return v_num;
end;

3.mybatis代码全部插入

<insert id="insertServiceCodeList" parameterType="serviceCodeVo" useGeneratedKeys="true" keyColumn="code" keyProperty="code">
insert all
     <foreach collection="list" item="item" >
        into service_code (
            code,
            serv_info_seq_id,
            name,
            default_key_type,
            cre_date,
            creator,
            description,
            state
        ) values (
            get_seq( 'service_code_seq' ),
            #{item.servInfoSeqId},
            #{item.name},
            #{item.defaultKeyType},
            systimestamp,
            #{item.creator},
            #{item.description},
            0
        )
    </foreach>
    select * from dual;
</insert>

案例2

它在Oracle中确实有效,但在mybatis中则无效,不返回序列。

<insert id="insertServiceCodeList" parameterType="serviceCodeVo" useGeneratedKeys="true" keyColumn="code" keyProperty="code">
    insert into service_code (
        code,
        serv_info_seq_id,
        name,
        default_key_type,
        cre_date,
        creator,
        description,
        state
    ) select
        service_code_seq.nextval,
        servInfoSeqId,
        name,
        defaultKeyType,
        systimestamp,
        creator,
        description,
        0
    from (
    <foreach collection="list" item="item" separator="union all"> 
        select
            #{item.servInfoSeqId} servInfoSeqId,
            #{item.name} name,
            #{item.defaultKeyType} defaultKeyType,
            #{item.creator} creator,
            #{item.description} description
        from
            dual
    </foreach>
    )
</insert>

我希望从PostgreSQL迁移到Oracle而不修改应用程序代码,仅迁移SQL代码。

谢谢!!

Oracle的驱动程序似乎不支持从“多行插入”返回生成的密钥。
因此,“不修改应用程序代码”可能是不可能的。

仅供参考,如果您切换到“批量插入”,则可能会起作用。
插入很多行时,它的性能也更好。

int batchSize = 1000;
try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
  YourMapper mapper = sqlSession.getMapper(YourMapper.class);
  int size = serviceCodeList.size();
  for (int i = 0; i < size;) {
    mapper.insertServiceCode(serviceCodeList.get(i));
    i++;
    if (i % batchSize == 0 || i == size) {
      sqlSession.flushStatements();
      sqlSession.clearCache();
    }
  }
  sqlSession.commit();
}

映射器语句很简单。

<insert id="insertServiceCode" useGeneratedKeys="true"
    keyColumn="code" keyProperty="code">
  insert into service_code (
    code,
    serv_info_seq_id,
    name,
    default_key_type,
    cre_date,
    creator,
    description,
    state
  ) values (
    service_code_seq.nextval,
    #{item.servInfoSeqId},
    #{item.name},
    #{item.defaultKeyType},
    systimestamp,
    #{item.creator},
    #{item.description},
    0
  )
</insert>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM