如果记录不存在则插入新记录,如果记录存在则重复记录

时间:2016-05-16 02:56:33

标签: oracle

如果表A中没有针对我的客户的现有记录,我想在表A中插入新记录。如果我的客户已经在表A中存在现有记录,我想复制它并创建新记录。

我正在考虑使用MERGE,但发现它应该是UPDATE和INSERT,而不是INSERT和INSERT。

请告知。

表A

ID            CUSTOMER_ID            DATA
1             104                    Data1
2             104                    Data2

在上表中,假设我有customer_id = 105。由于它不在表中,我将为customer_id = 105插入一条新记录:

3             105                    Data3

如果我有customer_id = 104,我会复制客户的最大记录,因为它存在于表格中:

4             104                    Data2

1 个答案:

答案 0 :(得分:1)

假设您在插入重复记录时不想完全复制记录并更改某些列的值,我尝试创建以下过程。我以employee表为例。如果这适用于您,则将该员工替换为客户。

CREATE OR REPLACE PROCEDURE prc_insert_emp (p_empno IN NUMBER)
AS 
    v_exists NUMBER;
BEGIN
   SELECT 1 INTO v_exists
   FROM  emp
   WHERE empno = p_empno;

   --Duplicate the record when employee is found
   INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
   SELECT 1111, ename, job, mgr, hiredate, sal, comm, deptno
   FROM emp
   WHERE empno = p_empno; 

   DBMS_OUTPUT.PUT_LINE('Employee found');

EXCEPTION
    WHEN NO_DATA_FOUND THEN
   --Insert values when the record is not found
        INSERT INTO EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)
        VALUES (5599, 'KING', 'MANAGER', 7839,  SYSDATE, 5000, 50, 10);
        DBMS_OUTPUT.PUT_LINE('Employee not found');
END;

您可以调用此过程并传递相关参数(在您的情况下可能是客户ID)。此外,您可以添加一个out参数,该参数将返回一个标志,表示客户是重复还是新插入。

如果您想在单个语句中执行此操作,请尝试此操作。

INSERT INTO CUST
SELECT MAX(id)+1,
       customer_id,
       'DATA2' FROM CUST
WHERE customer_id = 104
GROUP BY customer_id
UNION ALL
SELECT 5, 
       104,
       'DATA2' FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM cust WHERE customer_id = 104);

在上述声明中,如果找到了客户104,那么将执行上面的所有联合查询(它将复制客户ID 104的记录)。由于NOT EXISTS条件,UNION ALL下面的查询将不会被执行。

如果未找到客户,则UNION ALL上方的查询将不会返回任何行。但是,将执行UNION ALL下面的查询,您可以插入具有新客户ID的新记录。