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