我正在尝试验证Oracle表中的范围值。表名YEAR_RANG就像这样
ID YEAR_FROM YEAR_TO
1 1950 1980
2 2001 2009
3 2010 2015
4 2016 2020
这里我想制定一个约束,即两行的年份范围不能重叠。我试图使用以下触发器来完成它,
CREATE OR REPLACE TRIGGER YEAR_RANG_VALID
BEFORE INSERT or UPDATE on YEAR_RANG
FOR EACH ROW
DECLARE
o_exst NUMBER;
BEGIN
select count(*) into o_exst
FROM YEAR_RANG
WHERE
id != :new.id
and GREATEST(YEAR_FROM,:new.YEAR_FROM) <= LEAST(YEAR_TO,:new.YEAR_TO)
and ROWNUM = 1;
IF o_exst = 1 THEN
raise_application_error( -20202, 'Range overlap');
END IF;
END;
这适用于输入但是为了更新,它给出了这个错误
[42000][4091] ORA-04091: table DB.YEAR_RANG is mutating, trigger/function may not see it
ORA-06512: at "DB.YEAR_RANG_VALID", line 4
ORA-04088: error during execution of trigger 'DB.YEAR_RANG_VALID'
在YEAR_RANG上更改为“INSERT或UPDATE之后”也没有帮助。我该如何进行验证检查?我的触发器是否正常或有更好的方法?
还有一件事,我无法在应用程序级别检查这一点,因为这是从通用CRUD框架调用的,数据库失败只是检测约束失败的方法。