首页 > 代码库 > ibatis 批量插入oracle总结
ibatis 批量插入oracle总结
1. 使用批量插入最先想到如下的插入语句
insert into a (id,name) values(‘‘,‘‘) ,(‘‘,‘‘) 但是 oracle 并不支持这种写法
然后查询得知可以使用如下写法
insert all
into a(id,name) values(‘‘,‘‘)
into a(id,name) values(‘‘,‘‘) (注:可以一次插入一个表也可以多个表)
但是这种方式有一种限制,就是 行数乘以列数不能大于1000(我没有验证),而且这种方式据说效率不高(我没有验证)
但是我做批量插入的数据时从别的接口获取的,我无法知道到底有多少数据,而且表的数据库超过50个,所以我舍弃了这种方式,pass.
继续百度,获知可以使用视图插入,没有行数限制(据说数据最大64k,待项目上线验证),而且效率较高
如下:
insert into a (id,name)
<iterate conjunction="UNION ALL" property="d">
select #d[].id#,#d[].name# from dual
</iterate>
可以成功,happy..but
我们用的是oracle ,id 是用序列生成的,简单 ,把id 替换成序列生成就是了
于是
insert into a (id,name)
<iterate conjunction="UNION ALL" property="d">
select SEQ_A.nextval,#d[].name# from dual
</iterate>
运行,我去,报错: 此处不允许序号,,什么???
测试下到底是什么不支持序号,打开plsql
insert into a (id,name)
select SEQ_A.nextval,null from dual
没有问题。。。
然后执行
select SEQ_A.nextval,null from dual
union all
select SEQ_A.nextval,null from dual
提示此处不允许序号,,问题找到了,原来是 union all 和 nextval 不能一块用。。。
百度下原因:
Restrictions on Sequence Values You cannot use CURRVAL and NEXTVAL in the
following constructs:
■ A subquery in a DELETE, SELECT, or UPDATE statement
■ A query of a view or of a materialized view
■ A SELECT statement with the DISTINCT operator
■ A SELECT statement with a GROUP BY clause or ORDER BY clause
■ A SELECT statement that is combined with another SELECT statement with the
UNION, INTERSECT, or MINUS set operator
■ The WHERE clause of a SELECT statement
■ The DEFAULT value of a column in a CREATE TABLE or ALTER TABLE statement
■ The condition of a CHECK constrain
参考(连接没法放上去,因为提示内容违禁 http://www.+++ w2bc +++.com/Article/18614, 访问时把加号去掉)
应该是上面标红的那条导致的,大致意思是 用union 连接的两个select 不能使用序列
但是我们看到在单个select 是可以使用的,
select Seq_a.nextval , null from dual 是正确的 。。
dual 可以是任何表,包括视图,那我们就先把 所有select 用union all 连接后组成一个视图,
然后使用这个视图查询就可以了。。。
修改如下
insert into a (id,name)
select SEQ_A.nextval, t. * from (
<iterate conjunction="UNION ALL" property="d">
select #d[].name# from dual
</iterate>
) t
正常运行。。。
同时注意
SELECT id,name FROM (select SEQ_B_LOG_ID.NEXTVAL id , ‘elong_deo‘ name from dual);
这样也是不对的,违反第二条,在被查询的视图中使用序号
可以改成
select SEQ_B_LOG_ID.NEXTVAL id,name from (select ‘elong_deo‘ name from dual);
3. --- The error occurred while applying a parameter map.
--- Check the doInsertFlightDynamic-InlineParameterMap.
--- Check the statement (update failed).
--- Cause: java.sql.SQLSyntaxErrorException: ORA-01745: 无效的主机/绑定变量名
sql语句中,两个填充变量间没有写逗号
ibatis 批量插入oracle总结