Update_or_insert (сливане в) не работи в Oracle

Какво не е наред с моя UPDATE_OR_INSERT код по-долу?

MERGE INTO EMAIL_LIST d USING (SELECT '[email protected]' EMAIL) s
    ON (d.EMAIL = s.EMAIL)
        WHEN MATCHED THEN
            UPDATE SET d.EMAIL = s.EMAIL
        WHEN NOT MATCHED THEN
            INSERT (EMAIL) VALUES (s.EMAIL);

Предвид таблицата:

CREATE TABLE EMAIL_LIST ( 
    EMAIL VARCHAR2 (100)  NOT NULL
);
ALTER TABLE EMAIL_LIST
    ADD CONSTRAINT PK_EMAIL_LIST PRIMARY KEY ( EMAIL ) ;

Грешка

Доклад за грешка:

SQL грешка: ORA-00923: FROM ключова дума не е намерена, където се очаква 00923. 00000 - FROM ключова дума не е намерена, където се очаква


person stackoverflowuser95    schedule 26.09.2012    source източник


Отговори (1)


Няколко неща;

Трябва да изберете константата от нещо, в случая на Oracle, DUAL;

MERGE INTO EMAIL_LIST d 
USING 
    (SELECT '[email protected]' EMAIL FROM DUAL) s
ON (d.EMAIL = s.EMAIL)
WHEN MATCHED THEN
    UPDATE SET d.EMAIL = s.EMAIL
WHEN NOT MATCHED THEN
    INSERT (EMAIL) VALUES (s.EMAIL);

Освен това не можете да съвпадате с d.EMAIL и в същото време да го актуализирате. Вашата линия;

WHEN MATCHED THEN
    UPDATE SET d.EMAIL = s.EMAIL

Така или иначе няма смисъл, тъй като d.EMAIL вече е равно на s.EMAIL или съвпадението нямаше да се случи. Премахнете WHEN MATCHED и в крайна сметка ще работите;

MERGE INTO EMAIL_LIST d 
USING 
    (SELECT '[email protected]' EMAIL FROM DUAL) s
ON (d.EMAIL = s.EMAIL)
WHEN NOT MATCHED THEN
    INSERT (EMAIL) VALUES (s.EMAIL);
person Joachim Isaksson    schedule 26.09.2012