Вы можете использовать * магический подсказку Оракула IGNORE_ROW_ON_DUPKEY_INDEX
для этой цели.Подсказка молча пропускает дублированную вставленную строку - обычно это приводит к `ORA-00001: уникальное ограничение (...) нарушено.
Я предполагаю следующую настройку таблицы:
create table foo
(id number not null,
status varchar2(1) not NULL,
code1 varchar2(10),
code2 varchar2(10));
alter table foo add (primary key (id, status));
insert into foo (id,status, code1,code2) values(1,'a','xxx', 'xxx');
insert into foo (id,status, code1,code2) values(1,'b','xxx', 'xxx');
insert into foo (id,status, code1,code2) values(2,'b','yyy', 'yyy');
commit;
Итак, вы хотитеигнорировать вставку с ключом 1
и выполнить вставку с ключом 2
, используя code
s из записи со статусом 'b'
Это должно дать вам представление о том, как действовать:
insert /*+ IGNORE_ROW_ON_DUPKEY_INDEX (foo (id, status)) */ into foo (id,status, code1,code2)
values( 1, 'a',
(select code1 from foo where id = 1 and status = 'b'),
(select code2 from foo where id = 1 and status = 'b'));
0 rows created.
insert /*+ IGNORE_ROW_ON_DUPKEY_INDEX (foo (id, status)) */ into foo (id,status, code1,code2)
values( 2, 'a',
(select code1 from foo where id = 2 and status = 'b'),
(select code2 from foo where id = 2 and status = 'b'));
1 rows created.
Настройте подзапрос, чтобы получить code1
и code2
по мере необходимости - вы можете использовать max(code1)
и игнорировать status
.
Использовать переменную связывания для передачи id
(три раза) в запросе.