Вот тестовый скрипт:
drop table test_merge;
create table test_merge as select 1 m, 2 n from dual;
alter table test_merge add constraint test_merge_chk check (m <= n);
update test_merge set n = m - 1;
rollback;
select * from test_merge;
merge into test_merge tgt
using (select m, m-1 n from test_merge) src
on (tgt.m = src.m)
when matched then update set tgt.n = src.n;
commit;
select * from test_merge;
И вот результат:
Таблица создана.
Таблица изменена.
update test_merge set n = m - 1
*
ошибка в строке 1:
ORA-02290: нарушено ограничение целостности CHECK(XXX.TEST_MERGE_CHK)
Откат завершен.
M N
---------- ----------
1 2
1 строка объединена.
Фиксация обновлений завершена.
M N
---------- ----------
1 0
Как оказалось, этот баг не проявляется, если указать ветку WHEN NOT MATCHED в операторе MERGE. Так что обход бага в случае, когда нужно только обновить данные, но не вставлять новые, прост:
merge into test_merge tgt
using (select m, m-1 n from test_merge) src
on (tgt.m = src.m)
when matched then update set tgt.n = src.n
when not matched then insert (m) values(null) where 1 = 0;
Главное, чтобы никто не "соптимизировал" этот MERGE, удалив "лишнюю" ветку. ;)
Комментариев нет:
Отправить комментарий