sql - 避免插入的触发器问题(Oracle SQL)
问题描述
我正在尝试触发以避免在表中插入数据,原因是:如果患者死了,他将无法访问。我做了一个函数,如果病人死了,我会在触发器上调用它,它会返回 1。那是代码:
CREATE OR REPLACE FUNCTION check_d (pd INTEGER)
RETURN INTEGER
IS
d Patient.d_date%TYPE;
BEGIN
SELECT P.d_Date INTO d
FROM Patient P
WHERE P.idP=pd;
IF d <> NULL THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END;
CREATE OR REPLACE TRIGGER bad_insert
BEFORE INSERT ON Visit
FOR EACH ROW
DECLARE
idd INTEGER;
dp Visit.id_PV%TYPE;
BEGIN
SELECT V.id_PV INTO dp
FROM Visit V
WHERE id_PV=:NEW.id_PV;
idd := check_d(dp);
IF idd = 1 THEN
RAISE_APPLICATION_ERROR(-20014,'Error. Patient Deceased.');
END IF;
END;
/
功能应该没问题,问题出在触发器上。无论如何,Visit.id_PV 是 Patient.idP(PRIMARY KEY) 的外键。我应该如何修改代码?谢谢。
解决方案
你的功能不正确
d <> NULL
将始终返回 UNKNOWN,而不是您必须检查空值,例如:
d is not null
一旦你解决了这个问题,你仍然必须解决你在尝试插入语句时收到的变异表错误(你在尝试时没有收到这个错误吗?)。您正在引用您在触发器中插入的同一个表。你不能那样做。相反,您应该使用 :new.id_PV 引用您想要的列。
推荐阅读
- sapui5 - 如何在自由式门户网站的外壳标题中添加图像?
- python - CSRF 验证失败。请求中止。登录时
- imagemagick - ImageMagick 雨刮器效果 gif 帧数更少
- javascript - 如何通过 Datatable 发送带有 ajax 请求的 post 数据
- javascript - Array.sort 不会对对象中具有 NaN 值的数组重新排序
- angular - Moment 类型的参数不能分配给 Date 类型的参数
- google-cloud-platform - Google Cloud Dataprep:维度建模
- sql - MS SQL Server - 在连接查询结果集中选择多列的最大 n 个结果组
- angular5 - Angular 谷歌地图如何在谷歌地图上上传的 KML 图层中突出显示多边形:
- r - 将多个数据框与 R 中的不同列连接起来