当对sql中的行执行INSERT/UPDATE时,需要更改表列的值

问题描述 投票:0回答:1

团队 我有一个表,我首先从源文件插入表,

STATUS
应该是
NEW
。其中
EMP_ID
是主键

EMP_TBL
--------------  
STATUS EMP_ID
--------------
NEW     E1
NEW     E2
NEW     E3
NEW     E4
NEW     E5

对于某些用例,我将使用 OIC 中的数据库适配器进行插入/更新操作。当主键值已存在于表中时,应将 STATUS 设置为“REPROCESS”。例如 当我将 E3、E4 以及一些新记录 E6、E7 从源文件插入数据库时,已存在的记录应变为“REPROCESS”。因此,当前插入应该使 EMP_TBL 为( E1、E2、E4、E5 已处理,请跳过此上下文的逻辑)

    EMP_TBL
    --------------  
    STATUS EMP_ID
    --------------
    REPROCESS E3
    REPROCESS E4
    NEW       E6
    NEW       E7

当我们进行 INSERT PKey 异常时,将会抛出异常。如何处理这个问题,是否需要

TABLE
定义中的任何触发器或任何其他选项?

sql plsql key
1个回答
0
投票

不要使用插入或更新。插入将因主键冲突异常而失败 - 无法在触发器中处理。相反,请查看 MERGE 语句。

CREATE TABLE emp_tbl (
   emp_id VARCHAR2(100) PRIMARY KEY
   ,status VARCHAR2(10)
);

Table EMP_TBL created.


BEGIN
INSERT INTO EMP_TBL (emp_id, status) VALUES ('E1','NEW');
INSERT INTO EMP_TBL (emp_id, status) VALUES ('E2','NEW');
INSERT INTO EMP_TBL (emp_id, status) VALUES ('E3','NEW');
INSERT INTO EMP_TBL (emp_id, status) VALUES ('E4','NEW');
INSERT INTO EMP_TBL (emp_id, status) VALUES ('E5','NEW');
END;
/

PL/SQL procedure successfully completed.

MERGE INTO emp_tbl base
USING (
   SELECT 'E3' AS emp_id
     FROM dual
   UNION ALL
   SELECT 'E4' AS emp_id
     FROM dual
   UNION ALL
   SELECT 'E6' AS emp_id
     FROM dual
   UNION ALL
   SELECT 'E7' AS emp_id
     FROM dual
      ) source ON ( base.emp_id = source.emp_id )
WHEN MATCHED THEN UPDATE
SET base.status = 'REPROCESS'
WHEN NOT MATCHED THEN
INSERT (
   emp_id
   ,status )
VALUES
   ( source.emp_id
     ,'NEW' );

4 rows merged.

SELECT *
  FROM emp_tbl;

EMP_ID         STATUS    
-------------- ----------
E1             NEW       
E2             NEW       
E3             REPROCESS 
E4             REPROCESS 
E5             NEW       
E7             NEW       
E6             NEW      
© www.soinside.com 2019 - 2024. All rights reserved.