我目前正在从 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>
关于java - mybatis是否可以在oracle中插入所有并返回序列(useGenerateKeys)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57797374/