Oracle SQL使用触发器检查重叠的日期

拉斐尔·莫雷拉(Rafael Moreira)

我有一个名为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行上没有找到数据,并且在更新表时出现的错误是因为表处于突变状态并且触发器无法读取该表,这是有道理的,但我没有不知道如何解决。

关于如何解决这个问题有什么建议吗?

大力水手

您应该在两个位置countselect查询中都使用聚合函数,因为即使它为零,它也总是返回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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Oracle SQL触发器

来自分类Dev

检查新旧表值的Oracle SQL触发器

来自分类Dev

在oracle中使用触发器更改日期的问题

来自分类Dev

在Oracle SQL中使用触发器时出错

来自分类Dev

Oracle PL / SQL约束触发器

来自分类Dev

用于视图的Oracle SQL触发器

来自分类Dev

触发器中的SQL ORACLE错误

来自分类Dev

Oracle中的PL / SQL触发器

来自分类Dev

ORACLE SQL 触发器和 SUM()

来自分类Dev

Oracle触发器实现

来自分类Dev

Oracle - 触发器错误

来自分类Dev

Oracle PL / SQL触发器-捕获名称错误的插入

来自分类Dev

缺少等号和SQL语句忽略了Oracle触发器?

来自分类Dev

ORACLE SQL触发器-找不到数据

来自分类Dev

触发器内的if语句不起作用SQL(Oracle)

来自分类Dev

更新Oracle触发器之前的问题[PL / SQL]

来自分类Dev

触发器在Oracle SQL Developer上不起作用

来自分类Dev

为查询创建触发器ORACLE SQL

来自分类Dev

缺少等号和SQL语句忽略了Oracle触发器?

来自分类Dev

触发器在Oracle PL / SQL中无法正确执行

来自分类Dev

Oracle中的PL / SQL触发器错误

来自分类Dev

Oracle PL / SQL触发器-捕获名称错误的插入

来自分类Dev

触发器内的if语句不起作用SQL(Oracle)

来自分类Dev

oracle sql触发器尝试创建自动填充的描述

来自分类Dev

Oracle SQL触发器错误:ORA-00933

来自分类Dev

涉及多表Oracle、PL/SQL的触发器

来自分类Dev

更新不同表的 Oracle PL/SQL 触发器

来自分类Dev

触发器因 Oracle SQL 的编译错误而创建

来自分类Dev

Oracle SQL - 触发器正在发生变化