首页 > 解决方案 > 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');

标签: oracleplsql

解决方案


SYSDATE在执行过程时使用。SYSDATE具有动态值,即随着每次执行而改变。尝试在过程参数中使用一些稳定的日期(例如,类似于你的TO_DATE('22-JAN-2019','DD-MON-YYYY')),它应该可以正常工作。

此外,您可以向您的TRKEMPLOYEE表添加唯一约束(如果预计它不会很大)。


推荐阅读