Oracle SQL使用触发器检查重叠的日期 [英] Oracle SQL checking for overlapped dates using a trigger

查看:61
本文介绍了Oracle SQL使用触发器检查重叠的日期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个名为EPOCA的表,具有以下架构:

I have the table named EPOCA with this schema:

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时,插入的日期不会与任何当前日期重叠.

And even though I already check if the initial date is smaller then the end date, I need to check that when I insert a new EPOCA the dates I insert will not overlap with any of the present dates.

我开发了此触发器:

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行上没有找到数据,而当我更新表时,该错误是因为表处于突变状态并且触发器无法读取表,这是有道理的,但是我不知道该怎么解决.

The error I am getting when inserting is because no data was found on line 7 of the trigger and when I am updating the table the error is because the table is in mutation and the trigger cannot read the table, which makes sense but I don't know how to solve it.

关于如何解决此问题的任何建议?

Any suggestions on how to solve this problem?

推荐答案

您应该在两个地方的 select 查询中都使用 count 聚合函数,因为它总是返回tge即使它为零也要进行计数,如下所示:

You should use the count aggregate function in your select query at both places as it always returns tge count evenif it is zero as follows:

...
...
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
...
...

这篇关于Oracle SQL使用触发器检查重叠的日期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆