Oracle验证重叠值的范围

时间:2016-06-27 11:41:17

标签: database oracle validation oracle11g triggers

我正在尝试验证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框架调用的,数据库失败只是检测约束失败的方法。

1 个答案:

答案 0 :(得分:0)

删除FOR EACH ROW以使其成为语句级触发器。 row-level trigger vs statement-level trigger