Предполагая, что вы не хотите полностью дублировать запись и изменять значения некоторых столбцов при вставке дублирующей записи, я попытался создать следующую процедуру. В качестве примера я использовал таблицу сотрудников. Если это сработает для вас, замените сотрудника на клиента.
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;
Вы можете вызвать эту процедуру и передать соответствующий параметр (который может быть идентификатором клиента в вашем случае). Кроме того, вы можете добавить параметр 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 найден, то запрос выше союза все будет выполнено (это будет дублировать запись для клиента идентификатора 104). Запрос под UNION ALL не будет выполнен из-за состояния NOT EXISTS.
Если клиент не найден, запрос, указанный выше UNION ALL, не будет возвращать никакие строки. Тем не менее, запрос под UNION ALL будет выполнен, и вы можете вставить новую запись с новым идентификатором клиента.
Если вы просто хотите вставлять каждый раз, почему бы просто не просто сделать простую вставку? – Greg
Похоже, что бы вы ни были, вы просто вставляете новую запись. Можете ли вы поделиться некоторыми примерами данных и результатом, который вы пытаетесь сделать, чтобы сделать этот вопрос немного яснее, пожалуйста? – Mureinik
Я обновил описание, извиняюсь, я не могу думать о решении на данный момент – iPhoneJavaDev