http://www.oracle-base.com/articles/10g/merge-enhancements-10g.php

я есть простая таблица с флагом удаления (записи должны обновляться в этом столбце, а не удаляться):

create table PSEUDODELETETABLE
(
  ID        NUMBER(8) not null, -- PKEY
  NAME      VARCHAR2(50) not null,
  ISDELETED NUMBER(1) default 0 not null
)

При вставке новых записей я должен проверить, существует ли уже запись, соответствующая первичному ключу, но имеющая ISDELETED = 1. В этом случае я должен изменить ISDELETED на 0 и обновить другие столбцы. Поэтому я использую следующее Merge-Statement:

merge into ET.PSEUDODELETETABLE TARGET
using (select 1 as ID, 'Horst' as NAME from sys.dual) SOURCE
on (TARGET.ISDELETED = 1 and SOURCE.ID = TARGET.ID)
when matched then
  update set ISDELETED = 0, NAME = SOURCE.NAME
when not matched then
  insert values (SOURCE.ID, SOURCE.NAME, 0);

На Sql-Server он прекрасно работает, но Oracle говорит:

ORA-38104: Columns referenced in the ON Clause cannot be updated: TARGET.ISDELETED

Если есть совпадающая запись с IDELETED = 0, я хочу, чтобы нарушение первичного ключа было исключением, поэтому я не могу переместить "TARGET.ISDELETED = 1" из предложения on в оператор update.

Ответы на вопрос(6)

Ваш ответ на вопрос