2013-11-27 7 views
1

Я пытаюсь выполнить Upsert in oracle посредством инструкции Merge. Теперь таблица, что я пытаюсь слиться имеет составленное первичную, так что я creat4ed мой запрос так:Ошибка нескольких столбцов в заявлении Oracle Merge

MERGE INTO CONTINGENT_COMMISSION CC USING 
    (SELECT 
     'ad_adavila' CC_PROD_USERID, 
     to_number('42.22', '999,999,999.99') CC_COMM_PERCENT, 
     to_number('217,904.08', '999,999,999.99') CC_PREMIUM, 
     '2' CC_TRIMESTER, 
     '2013' CC_YEAR 
    FROM DUAL) SRC 
    ON (CC.CC_PROD_USERID || CC.CC_TRIMESTER || CC.CC_YEAR = SRC.CC_PROD_USERID || SRC.CC_TRIMESTER || SRC.CC_YEAR) 
WHEN MATCHED THEN 
    UPDATE 
     SET CC.CC_COMM_PERCENT = to_number('42.22', '999,999,999.99'), 
      CC.CC_PREMIUM = to_number('217,904.08', '999,999,999.99'), 
      CC.CC_TRIMESTER = '2', 
      CC.CC_YEAR = '2013' 
WHEN NOT MATCHED THEN  
    INSERT 
     (CC_PROD_USERID,CC_COMM_PERCENT,CC_PREMIUM,CC_TRIMESTER,CC_YEAR) 
     VALUES 
     ('ad_adavila',to_number('42.22', '999,999,999.99'),to_number('217,904.08', '999,999,999.99'),'2','2013'); 

Теперь я получаю следующее сообщение об ошибке, когда я пытаюсь запустить этот запрос.

ORA-38104: Столбцы, указанные в пункте ON не может быть обновлена: «CC» «CC_TRIMESTER»

Aparently это вызвано тем, что положение ON имеет более одного столбца;. что является обязательным в моем случае из-за составленного первичного ключа:

CONSTRAINT "CONTINGENT_COMMISSION_PK" PRIMARY KEY ("CC_PROD_USERID", "CC_TRIMESTER", "CC_YEAR") 

Есть ли все, чтобы сделать эту работу?

Спасибо,

ответ

8

ORA-38104: Столбцы, указанные в пункте ON не может быть обновлен:. «CC», «CC_TRIMESTER»
вы не можете обновить столбец, который используется для фильтра на пункте, просто удалите этот столбец из обновленной части

merge into CONTINGENT_COMMISSION CC 
using (select 'ad_adavila' CC_PROD_USERID, 
       to_number('42.22', '999,999,999.99') CC_COMM_PERCENT, 
       to_number('217,904.08', '999,999,999.99') CC_PREMIUM, 
       '2' CC_TRIMESTER, 
       '2013' CC_YEAR 
     from DUAL) SRC 
on (CC.CC_PROD_USERID || CC.CC_TRIMESTER || CC.CC_YEAR = SRC.CC_PROD_USERID || SRC.CC_TRIMESTER || SRC.CC_YEAR) 
when matched then 
    update 
     set CC.CC_COMM_PERCENT = to_number('42.22', '999,999,999.99'), 
      CC.CC_PREMIUM  = to_number('217,904.08', '999,999,999.99') 
when not matched then 
    insert 
     (CC_PROD_USERID, CC_COMM_PERCENT, CC_PREMIUM, CC_TRIMESTER, CC_YEAR) 
    values 
     ('ad_adavila', to_number('42.22', '999,999,999.99'), to_number('217,904.08', '999,999,999.99'), '2', '2013'); 
+0

Это было. Спасибо! – sonar

Смежные вопросы