Alfred 发表于 2014-3-13 22:21:12

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条.可能只有几条不符合规范。

现在的需求是,用什么方法可以忽略不符合规范的数据,只插入符合规范的数据并提交?大家遇到这种需求的时候通常会如何来做?

dla001 发表于 2014-3-13 23:00:28

效率如何不清楚,只知道有这个东西,挺有意思的。
看代码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;

Mille 发表于 2014-3-14 11:21:44

good
good
good

Alfred 发表于 2014-3-28 15:39:48

谁有10.2.0.1的练习环境帮忙测试下看是否也可以·
页: [1]
查看完整版本: insert是否可以像sqlldr那样只插入符合规范的数据?