如果记录不存在,插入新记录,如果记录存在,则重复记录
如果我的客户没有表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
假设您不想完全复制记录并在插入重复记录时更改某些列的值,我尝试创建以下过程。我用雇员表作为例子。如果这适用于您,则将该员工更换为客户。
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,那么上面的union all查询将被执行(它将复制客户id 104的记录)。由于NOT EXISTS条件,UNION ALL下面的查询将不会被执行。
如果未找到客户,则上面的查询UNION ALL将不返回任何行。但是,UNION ALL下方的查询将被执行,您可以使用新的客户ID插入新记录。
有没有像MERGE这种快捷方法这种情况下,或者我真的需要在程序中做到这一点? – iPhoneJavaDev
编辑我的答案并添加了第二个解决方案。 –
如果你只是想每次插入,为什么不总是做一个简单的插入? – Greg
听起来不管怎样,你只是插入一个新的记录。你能分享一些样本数据和你试图让这个问题更清楚一些的结果吗? – Mureinik
我更新了描述,我的道歉原因我现在想不到一个解决方案 – iPhoneJavaDev