oracle - 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');
解决方案
您SYSDATE
在执行过程时使用。SYSDATE
具有动态值,即随着每次执行而改变。尝试在过程参数中使用一些稳定的日期(例如,类似于你的TO_DATE('22-JAN-2019','DD-MON-YYYY')
),它应该可以正常工作。
此外,您可以向您的TRKEMPLOYEE
表添加唯一约束(如果预计它不会很大)。
推荐阅读
- javascript - JSON.parse 中的动态对象名称
- c# - 从子路径读取 cookie 的问题
- c++ - taocpp::json Traits 示例无法编译
- javascript - 在手机屏幕关闭的情况下继续播放音频
- plotly - color_continuous_scale 是 plotly python 的有效函数?
- python - 用 Python 下载播客
- c# - 更新在 OwnsMany 值对象关系 EF Core 5 中不起作用
- yii2 - 如何在 yii2-export 中为按钮添加类
- python - 如何让 Discord.py 音乐机器人自动播放队列中的下一首歌曲
- python - Django:将变量存储在数据库中并在不同模块之间传递它们