团队 我有一个表,我首先从源文件插入表,
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
定义中的任何触发器或任何其他选项?
不要使用插入或更新。插入将因主键冲突异常而失败 - 无法在触发器中处理。相反,请查看 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