Как найти ошибочные операторы вставки из массовых вставок в SQL * PLUS - PullRequest
0 голосов
/ 10 мая 2018

Я пытался вставить почти 10K строк в мою таблицу с помощью SQL * PLUS. Однако, когда я считаю в SQL DEVELOPER пропущенные почти 10 строк из 10K строк.

Как найти строки, которые не удалось вставить в таблицу?

Я подготовил скрипт вставки в Excel и скопировал 10К строк из Excel и вставил в SQL * PLUS. Этот процесс завершается в течение 5 минут, но пропущено несколько строк.

Пожалуйста, помогите мне найти пропущенные строки.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вопрос неопределенный, и я предполагаю точную форму вашего сценария, поэтому мой ответ пытается предложить вам некоторые варианты, не будучи точным.

Вы можете попробовать что-то вроде этого:

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;
/
0 голосов
/ 10 мая 2018
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);
...