[英]Is mybatis enable to insert all and return sequence(useGenerateKeys) in oracle?
我目前正在从PostgreSQL迁移到Oracle DBMS。 但是会出现一些问题。 我希望工作“使用mybatis中的usegeneratekeys将所有序列插入序列并返回到应用程序中”。
我的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.