首页 > 解决方案 > 避免插入的触发器问题(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) 的外键。我应该如何修改代码?谢谢。

标签: sqloracleoracle11gtriggerssql-insert

解决方案


你的功能不正确

d <> NULL 

将始终返回 UNKNOWN,而不是您必须检查空值,例如:

d is not null

一旦你解决了这个问题,你仍然必须解决你在尝试插入语句时收到的变异表错误(你在尝试时没有收到这个错误吗?)。您正在引用您在触发器中插入的同一个表。你不能那样做。相反,您应该使用 :new.id_PV 引用您想要的列。


推荐阅读