PLSQL Почему моя процедура не обнаружила вставку повторяющихся данных?

У меня есть хранимая процедура, которая будет вставлять информацию о сотрудниках в 2 разные таблицы. Когда я запускаю скрипт в первый раз, он позволяет мне дважды вставить одну и ту же информацию, что неверно, так как предполагается, что это приведет к дублированию данных. Но когда я снова запущу, это вызовет только ошибку дублированных данных.

CREATE OR REPLACE PROCEDURE INSERT_EMPLOYEE(eNum IN NUMBER,
                    eName VARCHAR2,
                    dob DATE,
                    addr VARCHAR2,
                    hDate DATE,
                    lNum NUMBER,
                    status VARCHAR2,
                    expr VARCHAR2)
IS
BEGIN
    INSERT ALL
        INTO TRKEMPLOYEE (E#, NAME, DOB, ADDRESS, HIREDATE)
        INTO MECHANIC (E#, L#, STATUS, EXPERIENCE) VALUES (eNum, lNum, status, expr)
    SELECT eNum, eName, dob, addr, hDate
    FROM dual
    WHERE NOT EXISTS(SELECT * 
             FROM TRKEMPLOYEE 
             WHERE E# = eNum AND
                   NAME = eName AND
                   DOB = dob AND
                   ADDRESS = addr AND
                   HIREDATE = hDate);
END INSERT_EMPLOYEE;
/

EXECUTE INSERT_EMPLOYEE(17, 'Keban Tyz', TO_DATE('22-JAN-2019','DD-MON-YYYY'),'Sunshine Plazza     
#4-567 S891011', sysdate-(1.5*365), 10124, 'AVAILABLE', 'EXPERT');

-- error supposed to trigger here, but my script allow this to execute on the first run
EXECUTE INSERT_EMPLOYEE(17, 'Keban Tyz', TO_DATE('22-JAN-2019','DD-MON-YYYY'),'Sunshine Plazza 
#4-567 S891011', sysdate-(1.5*365), 10124, 'AVAILABLE', 'EXPERT');

person Sammy Mak    schedule 10.05.2020    source источник


Ответы (2)


Вы используете SYSDATE при выполнении процедуры. SYSDATE имеет динамическое значение, т.е. изменяется при каждом выполнении. Попробуйте использовать какую-нибудь стабильную дату в параметре процедуры (например, похожую на вашу TO_DATE('22-JAN-2019','DD-MON-YYYY')), и все должно работать нормально.

Кроме того, вы можете добавить уникальное ограничение в свою таблицу TRKEMPLOYEE (если не ожидается, что она будет огромной).

person Nementaarion    schedule 10.05.2020

я предполагаю, что это потому, что вы генерируете дату найма из sysdate (sysdate-(1.5 * 365)) и напрямую сравниваете ее в условии фильтра (HIREDATE = hDate). попробуйте использовать только часть даты, усекая.

person djanoti    schedule 10.05.2020