我有一个名为EPOCA的表,具有以下架构:
CREATE TABLE EPOCA
(
ID INT
CONSTRAINT PK_EPOCA PRIMARY KEY,
NOME VARCHAR(250),
DATE_INITIAL DATE
CONSTRAINT NN_EPOCA_DATA_INI NOT NULL,
DATE_END DATE,
CONSTRAINT CK_EPOCA_DATAS CHECK (DATE_INITIAL < DATE_END)
);
即使我已经检查了起始日期是否小于结束日期,但我仍然需要检查一下,当我插入新的EPOCA时,插入的日期不会与任何当前日期重叠。
我开发了此触发器:
CREATE OR REPLACE TRIGGER TRGEPOCASNAOSOBREPOSTAS
BEFORE INSERT OR UPDATE
ON EPOCA
FOR EACH ROW
DECLARE
FLAG_DATE NUMBER;
BEGIN
FLAG_DATE := 0;
IF INSERTING THEN
SELECT E.ID INTO FLAG_DATE FROM EPOCA E WHERE E.DATE_INITIAL < :NEW.DATE_INITIAL AND E.DATE_END > :NEW.DATE_END;
IF FLAG_DATE <> 0 THEN
RAISE_APPLICATION_ERROR(-2098, 'INSERT FAILED BECAUSE SELECTED DATES OVERLAP EXISTENT ONES');
END IF;
ELSIF UPDATING THEN
SELECT E.ID INTO FLAG_DATE FROM EPOCA E WHERE E.DATE_INITIAL < :NEW.DATE_INITIAL AND E.DATA_END > :NEW.DATA_END;
IF FLAG_DATE <> 0 THEN
RAISE_APPLICATION_ERROR(-2099, 'UPDATE FAILED BECAUSE SELECTED DATES OVERLAP EXISTENT ONES');
END IF;
END IF;
END;
我在插入时遇到的错误是因为在触发器的第7行上没有找到数据,并且在更新表时出现的错误是因为表处于突变状态并且触发器无法读取该表,这是有道理的,但我没有不知道如何解决。
关于如何解决这个问题有什么建议吗?
您应该在两个位置count
的select
查询中都使用聚合函数,因为即使它为零,它也总是返回tge计数,如下所示:
...
...
SELECT count(*) INTO FLAG_DATE FROM EPOCA E WHERE E.DATA_INI < :NEW.DATA_INI AND E.DATA_FIM > :NEW.DATA_FIM;
IF FLAG_DATE <> 0 THEN
...
...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句