【问题标题】:Update_or_insert (merge into) not working in OracleUpdate_or_insert(合并到)在 Oracle 中不起作用
【发布时间】:2012-09-17 19:53:32
【问题描述】:

下面的 UPDATE_OR_INSERT 代码有什么问题?

MERGE INTO EMAIL_LIST d USING (SELECT 'foo@gmail.com' 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 关键字”

【问题讨论】:

    标签: oracle join oracle11g insert-update


    【解决方案1】:

    几件事;

    你需要从某个东西中选择常数,在 Oracle 的例子中是 DUAL;

    MERGE INTO EMAIL_LIST d 
    USING 
        (SELECT 'foo@gmail.com' 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 'foo@gmail.com' EMAIL FROM DUAL) s
    ON (d.EMAIL = s.EMAIL)
    WHEN NOT MATCHED THEN
        INSERT (EMAIL) VALUES (s.EMAIL);
    

    【讨论】:

      猜你喜欢
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      相关资源
      最近更新 更多