如何在SQL * PLUS中从批量插入中查找失败的插入语句

时间:2018-05-09 21:54:04

标签: sql oracle sql-insert sqlplus bulkinsert

我一直试图通过SQL * PLUS在我的表中插入近10K行。但是,当我在SQL DEVELOPER中计算时,在10K行中丢失了近10行。

如何查找哪些行无法插入表格?

我已在Excel中准备了插入脚本,并从Excel复制了10K行并粘贴到SQL * PLUS中。此过程在5分钟内完成,但缺少一些行。

请帮我找到丢失的行。

2 个答案:

答案 0 :(得分:0)

Here is one way to find missing rows , mostly table will have one primary key or make primary key using sequence ... try to load primary key alone in another table say lookup table  .... Then make query between actual loaded table and lookup table to find missing rows

create table temp
( id number,
sal number)

begin 
insert into temp values (1,100);
insert into temp values (2,200);
insert into temp values (3,300);
insert into temp values (5,400);
end;

select * from temp;

create table lookup
(id number);

begin 
insert into lookup values(1);
insert into lookup values(2);
insert into lookup values(3);
insert into lookup values(4);
insert into lookup values(5);
end;

select * from lookup;

select * from lookup where id not in ( select id from temp);

答案 1 :(得分:0)

这个问题很模糊,我猜测你的剧本的确切形式,所以我的回答试图为你提供一些选择,而不是精确的。

您可以尝试这样的事情:

WHENEVER SQLERROR EXIT FAILURE COMMIT
INSERT INTO t1 VALUES ( 'a', 'b', 'c');
INSERT INTO t1 VALUES ( 'a1', 'b1', 'c1');
.
.

这会导致脚本在第一个错误时停止,但是使用COMMIT它可以让你看到你有多远(假设在插入顺序中有一些逻辑顺序)。

这是一种快速而又肮脏的方法来磨练错误。

第二种方法是散布PROMPT以显示插入的值以帮助调试:

WHENEVER SQLERROR EXIT FAILURE ROLLBACK
PROMPT INSERTING a, b, c
INSERT INTO t1 VALUES ( 'a', 'b', 'c');
PROMPT INSERTING a1, b1, c1
INSERT INTO t1 VALUES ( 'a1', 'b1', 'c1');
.
.

另一个想法,更多涉及。假设您正在使用EXCEL生成INSERT语句,您可以将它们生成为对pr_insert过程的调用,然后在过程中使用逻辑来捕获并标记错误:

CREATE OR REPLACE PROCEDURE pr_insert
   ( p1 IN t1.c1%TYPE,
     p2 IN t1.c2%TYPE,
     p3 IN t1.c3%TYPE ) AS
BEGIN
   INSERT INTO t1 VALUES ( p1, p2, p3 );
EXCEPTION
   WHEN OTHERS THEN
      RAISE_APPLICATION_ERROR ( -20001, 'Error on : ' || p1 || ',' || p2 || 'p3 );
END ;
/

可以在Excel中生成以下pr_insert调用:

BEGIN
  pr_insert ( 'a', 'b', 'c' );
  pr_insert ( 'a1', 'b1', 'c1' );
  pr_insert ( 'a2', 'b2', 'c2' );
.
.
END;
/