insert是否可以像sqlldr那样只插入符合规范的数据?
构造一个小小的实验来说明我的需求。系统环境:solaris 10 数据库版本:11.2.0.1
--试验准备:
1.创建表A,表B
create table a (a1 number, a2 varchar2(3), a3 varchar2(3));
create table b (b1 number, b2 varchar2(2), b3 varchar2(2));
2.表A插入4条数据
insert into a values(1,'a','aa');
insert into a values(2,'aa','aaa');
insert into a values(3,'aa','aa');
insert into a values(4,'a','a');
commit;
--试验:
SQL> insert into b(b1, b2, b3) select a1, a2, a3 from a;
commit;
insert into b(b1, b2, b3) select a1, a2, a3 from a
*
ERROR at line 1:
ORA-12899: value too large for column "TEST"."B"."B3" (actual: 3, maximum: 2)
SQL>
Commit complete.
SQL> select * from b;
no rows selected
可以看到,由于a表的第二行数据不能插入b表,导致整个事物回滚,本来符合规范的的其他行数据也没有成功插入。
真实案例中,此表的数据有5kw条.可能只有几条不符合规范。
现在的需求是,用什么方法可以忽略不符合规范的数据,只插入符合规范的数据并提交?大家遇到这种需求的时候通常会如何来做?
效率如何不清楚,只知道有这个东西,挺有意思的。
看代码create table zt1 (c1 varchar2(50))
create table zt2 (c2 varchar2(30))
insert into zt1 values(rpad('A',50,'A'));
insert into zt1 values(rpad('A',30,'A'));
insert into zt1 values(rpad('A',25,'A'));
insert into zt1 values(rpad('A',40,'A'));
commit;
exec DBMS_ERRLOG.CREATE_ERROR_LOG('ZT2');
insert into zt2 select * from zt1
log errors reject limit unlimited;
commit;
set lines 100
col item format a5
col ORA_ERR_MESG$ format a60
select
c2
,ora_err_number$
,ora_err_mesg$
from err$_ZT2; good
good
good
谁有10.2.0.1的练习环境帮忙测试下看是否也可以·
页:
[1]