ON DUPLICATE KEY UPDATE 抛出 SQL 错误 ORA-00933:SQL 命令未正确结束

ON DUPLICATE KEY UPDATE throws SQL error ORA-00933: SQL command not properly ended

我有一个 SQL 查询使用 ON DUPLICATE KEY UPDATE 作为:

查询已更新:

    MERGE INTO reports rt
  USING (SELECT REPORT_ID,TITLE,CATEGORY,DISPLAY_ORDER,QUERY,DESCRIPTION,CONTENT_SEQ,DELD,ADMIN_ID
           FROM reports) rs
     ON (rt.report_id = rs.report_id)
   WHEN MATCHED THEN
     UPDATE SET rt.TITLE = 'a',
                rt.CATEGORY = 'z',
                rt.DISPLAY_ORDER= 9,
                rt.QUERY ='q',
                rt.DESCRIPTION='d',
                rt.CONTENT_SEQ=1,
                rt.DELD=0,
                rt.ADMIN_ID=1
   WHEN NOT MATCHED THEN 
     INSERT(REPORT_ID,TITLE,CATEGORY,DISPLAY_ORDER,QUERY,DESCRIPTION,CONTENT_SEQ,DELD,ADMIN_ID)
       VALUES(27,
        'a',
        'z',
        9,
        'q',
        'd',
        1,
        0,
        1;

当我 运行 这个查询时它抛出一个错误:SQL Error: ORA-00933: SQL command not properly ended.

P.S : 我正在使用 Oracle 数据库。

是不是不支持'ON DUPLICATE KEY UPDATE'条款? 如果否,实现此目标的其他选择是什么?

I am using Oracle Database.

Is it that it wont support 'ON DUPLICATE KEY UPDATE' clause ? If No,what is the other option to achieve this ?

可能这是 MySQL 支持的功能。 Oracle 不支持 ON DUPLICATE KEY UPDATE。您需要使用 MERGE 语句。

例如,

MERGE INTO dest_table t
  USING (SELECT <column_list> 
           FROM source_table) s
     ON (t.col1 = s.col1) -- use required join keys
   WHEN MATCHED THEN
     UPDATE SET t.<column_list> = s.<column_list>
                ...
   WHEN NOT MATCHED THEN 
     INSERT( t.<column_list>)
       VALUES( s.<column_list>)

阅读文档以获取有关 MERGE. Few examples here 的更多详细信息。

更新 基于编辑问题中 OP 的新查询。

WHEN NOT MATCHED THEN     INSERT(REPORT_ID,TITLE,CATEGORY,DISPLAY_ORDER,QUERY,DESCRIPTION,CONTENT_SEQ,DELD,ADMIN_ID)
       VALUES(27,
        'a',
        'z',
        9,
        'q',
        'd',
        1,
        0,
        1;

分号前的末尾缺少右大括号。试试这个:

MERGE INTO reports rt 
USING (SELECT report_id, 
              title, 
              category, 
              display_order, 
              query, 
              description, 
              content_seq, 
              deld, 
              admin_id 
       FROM   reports) rs 
ON (rt.report_id = rs.report_id) 
WHEN matched THEN 
  UPDATE SET rt.title = 'a', 
             rt.category = 'z', 
             rt.display_order = 9, 
             rt.query = 'q', 
             rt.description = 'd', 
             rt.content_seq = 1, 
             rt.deld = 0, 
             rt.admin_id = 1 
WHEN NOT matched THEN 
  INSERT(report_id, 
         title, 
         category, 
         display_order, 
         query, 
         description, 
         content_seq, 
         deld, 
         admin_id) 
  VALUES(27, 
         'a', 
         'z', 
         9, 
         'q', 
         'd', 
         1, 
         0, 
         1);