Как избежать ошибки ORA-3814 при слиянии? - PullRequest
4 голосов
/ 25 октября 2011

У меня есть такой код

MERGE INTO target_table tgt
USING source_table src
on(tgt.c1=src.c1)
WHEN MATCHED THEN
UPDATE SET tgt.c1=src.c2

Я получаю ORA-38104: Columns referenced in the ON clause cannot be updated. Я понимаю причину этой ошибки. Но как мы можем переписать этот код? Есть ли возможности без использования курсора?

Ответы [ 2 ]

11 голосов
/ 25 октября 2011

Как насчет этого, внешнее объединение означает, что rid будет нулевым и, следовательно, потерпит неудачу, и, таким образом, попадет в часть WHEN NOT MATCHED оператора, если у вас есть один

MERGE INTO target_table tgt
USING ( SELECT t2.ROWID AS rid
            ,  s2.c2
        FROM   target_table t2
             , source_table s2
        WHERE t2.c1 (+) = s2.c1
      ) src
ON (tgt.rowid = src.rid)
WHEN MATCHED THEN
UPDATE SET tgt.c1=src.c2
0 голосов
/ 02 января 2019

Вы можете использовать некоторые обходные пути для ORA-38104 , которые, кажется, работали до Oracle 18c, включая этот, где вы обернули бы свои столбцы в выражение значения строки, содержащее дополнительное фиктивное выражение:

MERGE INTO target_table tgt
USING source_table src
ON ((tgt.c1, 'dummy') = ((src.c1, 'dummy')))
WHEN MATCHED THEN
UPDATE SET tgt.c1=src.c2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...