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

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

Или помещенный иначе, который был бы Вы предпочитать использовать:

a) Неуправляемый код, который может сделать неконтролируемые вещи к системе.

b) Собственный скомпилированный код, который быстр, тверд и является близко к ОС.

, Конечно, они - на самом деле то же самое.

27
задан skaffman 5 May 2011 в 16:15
поделиться

2 ответа

Вопреки принятому ответу, на самом деле существует способ справиться с этим: переместить бит, вызывающий сбой, из предложения ON в предложение WHERE оператора обновления:

merge into ET.PSEUDODELETETABLE TARGET
using (select 1 as ID, 'Horst' as NAME from sys.dual) SOURCE
on (SOURCE.ID = TARGET.ID)
when matched then
  update 
      set ISDELETED = 0, 
      NAME = SOURCE.NAME
  where TARGET.ISDELETED = 1 -- Magic!
when not matched then
  insert 
      values (SOURCE.ID, SOURCE.NAME, 0);
43
ответ дан 28 November 2019 в 05:10
поделиться

Нам нужно рассмотреть также сценарий ниже:

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

Таким образом, точное решение, как показано ниже,

begin 
    update ET.PSEUDODELETETABLE set ISDELETED = 0, NAME = 'Horst' 
    where ISDELETED = 1 and ID = 1; 
    if (sql%rowcount = 0) then 
        insert into ET.PSEUDODELETETABLE values (1, 'Horst', 0); 
    end if; 
end;
1
ответ дан 28 November 2019 в 05:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: