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总结的更多相关文章
- Java使用iBatis批量插入数据到Oracle数据库
Java使用iBatis批量插入数据到Oracle数据库 因为我们的数据跨库(mysql,oracle),单独取数据的话需要遍历好多遍,所以就想着先从mysql数据库中取出来的数据然后在oracle数 ...
- ibatis 批量插入
ibatis 批量插入 CreationTime--2018年7月2日10点21分 Author:Marydon 1.说明 基于oracle的sql语句 2.主键id有默认值,比如:sys_gui ...
- IBatis批量插入数据
IBatis插入注意,数据量比较多的花,需要分批插入,策略是dao里面控制插入批次,mapper里面批量插入即可 @Override public Long insertBatch(List<W ...
- mybatis批量插入oracle时报错:unique constraint (table name) violated
mybatis批量插入oracle时报错:unique constraint (table name) violated,是因为插入的集合中有两条相同唯一约束的数据.
- oracle+ibatis 批量插入-支持序列自增
首先请先看我前面一篇帖子了解oracle批量插入的sql:[oracle 批量插入-支持序列自增] 我用的ibatis2.0,sqlMap文件引入的标签如下: <!DOCTYPE sqlMap ...
- mysql+ibatis 批量插入
述:相比oracle批量插入,mysql批量插入就简单的多了,mysql支持values后面跟多条数据,进行批量插入,并且主键可以自增,不像oracle会遇到序列问题. 1.建表 CREATE TAB ...
- C# OracleBulkCopy 批量插入oracle数据库的方法
只有安装了oracle 11G客户端的机器上才可以用,要用到ODP.NET组件中的oracleDataAccess.DLL,命名空间引用为Oracle.DataAccess.Client; 引用:Or ...
- mybatis批量插入oracle
<insert id="batchInsert" parameterType="java.util.List"> INSERT INTO TEST( ...
- 批量插入Oracle,遇到CLob字段慢的解决办法
在一次执行批量插入到Oracle表,其他一个字段设置为CLOB,但没有内容,在插入时,在代码指定为CLOB类型,插入相当慢,后来改为VarChar2,速度就上去了,经测试,插入一个65535个字符,没 ...
随机推荐
- IP转换hash以及返回
InetAddress address = InetAddress.getByName("127.0.0.1"); System.out.println(address); int ...
- WPF绘制矢量图形模糊的问题
WPF默认提供了抗锯齿功能,通过向外扩展的半透明边缘来实现模糊化.由于WPF采用了设备无关单位,当设备DPI大于系统DPI时,可能会产生像素自动扩展问题,这就导致线条自动向外扩展一个像素,并且与边缘相 ...
- {HDU}{2516}{取石子游戏}{斐波那契博弈}
题意:给定一堆石子,每个人最多取前一个人取石子数的2被,最少取一个,最后取石子的为赢家,求赢家. 思路:斐波那契博弈,这个题的证明过程太精彩了! 一个重要的定理:任何正整数都可以表示为若干个不连续的斐 ...
- windows server 无人值守安装
使用 answer file:AutoUnattend.xml 来无人值守安装,到了选系统这步 还是要手动选择一个系统,这是为什么?怎么设置可以默认进入GUI的系统进行安装啊?
- Office 365 系列一 ------- 如何单个安装Office 客户端和Skype for business
当我们注册好或者购买好 Office 365后,我们的单个用户如何进行在线的.流式的方式安装好我们的客户端,特别是对于我们非IT部门来说,这是一个比较为难的事情, 经常需要我们的IT去到同事的电脑旁边 ...
- VIM操作常用指令(转)
vim是上Linux非常常用的编辑器,很多Linux发行版都默认安装了vi(vim).vi(vim)命令繁多但是如果使用灵活之后将会大大提高效率.vi是"visual interface&q ...
- 广播后刷新界面-调用其他界面的方法触动广播后刷新该界面UI
new CigaretteLoginActivity().login(ac,"switch_account",list.get(arg2).CUST_CODE,list.get(a ...
- c#FileStream文件读写(转)
FileStream对象表示在磁盘或网络路径上指向文件的流.这个类提供了在文件中读写字节的方法,但经常使用StreamReader或StreamWriter执行这些功能.这是因为FileStream类 ...
- Erlang 从入门到精通(三) 改变工作目录
对于初学者来书,经常会碰到下面的错误: no such file or directoryerror 提示找不到文件,这时候就需要将文件放到工作目录下,或者直接修改工作目录到文件所在位置. 右键ERl ...
- PPTP-VPN第三章——用户流量与并发数限制
在前面两篇文章中详细介绍了pptp vpn的安装与使用,以及如何配置用户认证存入mysql数据库.本文将在前面两篇文章的基础上介绍如何对用户的流量做限制,同时限制相同账号的用户,同一时刻的在线数为1. ...