[英]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.