Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Обход Exception при вставке повторяющихся строк в таблицу с PrimaryKey  [new]
LWArt
Member

Откуда: Область войска Донского
Сообщений: 5
Простите, если уж совсем вопрос избитый или ламерский. Мучаюсь уже неделю спрашивал и гугла и яндекса, но они мою не понимать (наверное, все-таки ошибка в генах).

Задача: из одной таблицы (table2) выбрать все id, удовлетворяющие одному из трех критериев, при этом одна и та же строка может удовлетворять нескольким критериям (мне все равно какой именно выберется в результате), есть такая конструкция (все внутри хранимой процедуры, Oracle 9.2):

insert into table1
select table2.id, 'first' from table2, table3 where ....  ;
EXCEPTION  WHEN DUP_VAL_ON_INDEX THEN NULL;

insert into table1
select table2.id, 'second' from table2, table3, table4 where .... ;
EXCEPTION  WHEN DUP_VAL_ON_INDEX THEN NULL;

insert into table1
select table2.id, 'third' from table2, table5 where .... ;
EXCEPTION  WHEN DUP_VAL_ON_INDEX THEN NULL;

в таблице table1 - два поля - Id (primary key) и причина занесения этого id в таблицу. результаты каждого из select могут пересекаться, при этом наступает primary key constraint violation и оставшиеся поля выборки не заносятся в таблицу.
В каждом из select перебираются около 100К записей, в таблицу table1 должно в результате попасть около 50К записей. Возможности создавать/изменять/перестраивать индексы нету. Поэтому использование exists тормозит запрос в несколько раз.
С горя напился кофея, сделал 3 курсора, и циклом FETCH/INSERT пытался решить проблему хоть на время.... прошло больше 2х часов (перерыв), а вставилось только ок. 10% записей.

Хотелось бы узнать есть ли возможность каким-либо образом сказать каждому insert чтобы он просто пропускал дубликаты, а не вылетал при их обнаружении?
24 ноя 06, 14:24    [3447476]     Ответить | Цитировать Сообщить модератору
 Re: Обход Exception при вставке повторяющихся строк в таблицу с PrimaryKey  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116138
Смотрите в сторону BULK+FORALL+SAVE EXCEPTIONS
24 ноя 06, 14:26    [3447496]     Ответить | Цитировать Сообщить модератору
 Re: Обход Exception при вставке повторяющихся строк в таблицу с PrimaryKey  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6912
LWArt
Хотелось бы узнать есть ли возможность каким-либо образом сказать каждому insert чтобы он просто пропускал дубликаты, а не вылетал при их обнаружении?

Сказать-то можно, вот только он Вас слушать не будет...
Вставляйте строчки внутри цикла по одной...
24 ноя 06, 14:26    [3447502]     Ответить | Цитировать Сообщить модератору
 Re: Обход Exception при вставке повторяющихся строк в таблицу с PrimaryKey  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
insert .. select id,min(..) то_что_всё_равно from .. group by id
24 ноя 06, 14:28    [3447514]     Ответить | Цитировать Сообщить модератору
 Re: Обход Exception при вставке повторяющихся строк в таблицу с PrimaryKey  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
orawish
insert .. select id,min(..) то_что_всё_равно from .. group by id

Ну или merge, как вариант
24 ноя 06, 14:32    [3447555]     Ответить | Цитировать Сообщить модератору
 Re: Обход Exception при вставке повторяющихся строк в таблицу с PrimaryKey  [new]
LWArt
Member

Откуда: Область войска Донского
Сообщений: 5
dmidek
Смотрите в сторону BULK+FORALL+SAVE EXCEPTIONS

Если посмотрел туда, то BULK требует VARRAY, куда нужно это все сложить, а чтобы был VARRAY нужен CREATE TYPE, а на него не оказалось прав :'-(

alex-ls
Вставляйте строчки внутри цикла по одной...

Сделал... я писал про курсор... пошел выпил чаю, поспал, поиграл в футбол... так и не дождался окончания

orawish
insert .. select id,min(..) то_что_всё_равно from .. group by id

хм... для этого нужно будет держать такую же таблицу, только без PK, туда делать 3 инсерта, потом в правильную таблицу делать четвертый... кажется довольно долгим... буду пробовать.
написал пока только merge, а он ругается что нет ключевого слова ;(
24 ноя 06, 15:25    [3448013]     Ответить | Цитировать Сообщить модератору
 Re: Обход Exception при вставке повторяющихся строк в таблицу с PrimaryKey  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116138
LWArt
dmidek
Смотрите в сторону BULK+FORALL+SAVE EXCEPTIONS

Если посмотрел туда, то BULK требует VARRAY, куда нужно это все сложить, а чтобы был VARRAY нужен CREATE TYPE, а на него не оказалось прав :'-(



Не надо CREATE TYPE, делайте TYPE в пакете.
И никаких VARRAYs , TABLE OF ... !
24 ноя 06, 15:27    [3448035]     Ответить | Цитировать Сообщить модератору
 Re: Обход Exception при вставке повторяющихся строк в таблицу с PrimaryKey  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
LWArt
dmidek
Смотрите в сторону BULK+FORALL+SAVE EXCEPTIONS

Если посмотрел туда, то BULK требует VARRAY, куда нужно это все сложить, а чтобы был VARRAY нужен CREATE TYPE, а на него не оказалось прав :'-(
Не туда.

LWArt
orawish
insert .. select id,min(..) то_что_всё_равно from .. group by id

хм... для этого нужно будет держать такую же таблицу, только без PK, туда делать 3 инсерта, потом в правильную таблицу делать четвертый... кажется довольно долгим... буду пробовать.
написал пока только merge, а он ругается что нет ключевого слова ;(
Зачем???
24 ноя 06, 15:27    [3448041]     Ответить | Цитировать Сообщить модератору
 Re: Обход Exception при вставке повторяющихся строк в таблицу с PrimaryKey  [new]
Kovalchuk Vitaly V
Member

Откуда: ненька Україна
Сообщений: 463
А может в консерватории что то не так?
Может можно ваши запросы обьединить в один что то типа такого.
insert into table1
select 
  table2.id,
  case 
    when table3.Id is not null then 'first'
    when table4.Id is not null then 'second'
    else 'third' 
  end label  
from table2, 
     table3, 
     table4,
     table5 
where table2.id = table3.Id(+) and
  table2.id = table4.Id(+) and
  table2.id = table5.Id(+) -- Ну и дальше пошли ваши условия.
24 ноя 06, 16:29    [3448653]     Ответить | Цитировать Сообщить модератору
 Re: Обход Exception при вставке повторяющихся строк в таблицу с PrimaryKey  [new]
-Skid-
Guest
Есть такая штука: MULTI TABLE INSERT
см. в док-е оператор INSERT в режиме multi table.
INSERT
[ ALL | FIRST ]
WHEN condition
THEN insert_into_clause
[ values_clause ]
[ error_logging_clause ]
[ insert_into_clause
[ values_clause ]
[ error_logging_clause ]
]...
[ WHEN condition
THEN insert_into_clause
[ values_clause ]
[ error_logging_clause ]
[ insert_into_clause
[ values_clause ]
[ error_logging_clause ]
]...
]...
[ ELSE insert_into_clause
[ values_clause ]
[ error_logging_clause ]
[ insert_into_clause
[ values_clause ]
[ error_logging_clause ]
]...
]
24 ноя 06, 18:17    [3449459]     Ответить | Цитировать Сообщить модератору
 Re: Обход Exception при вставке повторяющихся строк в таблицу с PrimaryKey  [new]
LWArt
Member

Откуда: Область войска Донского
Сообщений: 5
Всем спасибо. Выбор пал на правильно написанный merge. Union всех select с последующей группировкой и выбором max() по признаку оказался медленне.
27 ноя 06, 15:12    [3456149]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить