亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

mybatis是否可以在oracle中插入所有并返回序列(useGenerateKeys)?

mybatis是否可以在oracle中插入所有并返回序列(useGenerateKeys)?

智慧大石 2023-07-13 16:51:12
我目前正在從 PostgreSQL 遷移到 Oracle DBMS。但出現一些問題。我希望工作“插入所有序列并將序列返回到應用程序”使用生成密鑰在 mybatis 中?!蔽业?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>
查看完整描述

1 回答

?
慕妹3242003

TA貢獻1824條經驗 獲得超6個贊

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>


查看完整回答
反對 回復 2023-07-13
  • 1 回答
  • 0 關注
  • 183 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號