ORACLE +mybaties 批量插入
<insert id="batchRoleMenu" parameterType="list" useGeneratedKeys="false">
insert into sys_role_menu(ROLE_ID, MENU_ID)
<foreach item="item" index="index" collection="list" separator="UNION ALL">
(
SELECT #{item.roleId},#{item.menuId} from DUAL
)
</foreach>
</insert>
注:table_name即表名;seq_name为自增序列名;get_seq_next()是个oracle函数,用来获取序列的下一个值,虽然按理说直接seq_name.nextval就可以了,但是这里会报错。
附get_seq_next()函数:
CREATE OR REPLACE
function get_seq_next (seq_name in varchar2) return number
is
seq_val number ;
begin
execute immediate 'select '|| seq_name|| '.nextval from dual' into seq_val ;
return seq_val ;
end;
注意事项:
1.SQL中没有VALUES;
2.<foreach>标签中的(select ..... from dual);
3.<foreach>标签中的separator的属性为"UNION ALL",将查询合并结果集。
4.最重要的一点就是一定要在insert标签中加入useGeneratedKeys="false",如果不加则会报如下错误:
### Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束
说明:insert的主键,我先调用了序列,然后复制给对象的属性了,所以在insert的时候直接用#{} 取字段就可以了