PL/SQL 触发器找不到要分析的值

PL/SQL Trigger not finding values to analyze

我正在创建一个 PL/SQL 触发器,如果​​ date_fin < date_begin,它会给我一个错误。 (我是触发器的新手。)

我的问题是在测试时我得到 ORA-01403: no Data found。我说触发器没有找到要分析的数据,但我的 table 包含值。

我的错误是否来自我的触发器格式?

这是我的代码:

--TRIGGER1
CREATE OR REPLACE TRIGGER verifDate
BEFORE INSERT OR UPDATE ON PROJET FOR EACH ROW
DECLARE date_debut projet.dateDebut%TYPE;
date_fin projet.dateFin%TYPE;
pragma autonomous_transaction;
BEGIN
    Select projet.dateDebut into date_debut from projet where date_debut=:new.dateDebut;
    Select projet.dateFin into date_fin from projet where date_fin=:new.datefin;
        IF date_fin < date_debut
        THEN
            RAISE_APPLICATION_ERROR(-20100, 'Mauvaise date') ;
        END IF;
END;

测试:

--TEST1.1
INSERT INTO PROJET (idProjet, idClient, nomProjet, dateDebut, dateFin, idResponsable)
VALUES (4,355,'Projet Test', '01/12/2020', '30/12/2019', 3851);


--TEST1.2
UPDATE PROJET
SET dateFIN = '01/09/2003' , dateDebut = '31/12/2019'
WHERE Projet.idProjet=2;

是的,错误来自触发器,因为它是一个 BEFORE INSERT 触发器,所以该行在 table 中尚不存在,但您正在尝试使用 SELECT 来获取数据与该行匹配,但失败并出现 NO_DATA_FOUND 异常。

相反,您应该使用 :NEW(并且,如果需要,:OLD)记录:

CREATE OR REPLACE TRIGGER verifDate
  BEFORE INSERT OR UPDATE ON PROJET FOR EACH ROW
BEGIN
  IF :NEW.dateFIN < :NEW.dateDebut THEN
    RAISE_APPLICATION_ERROR(-20100, 'Mauvaise date') ;
  END IF;
END verifDate;
/

但是,这应该使用 CHECK 约束来完成:

ALTER TABLE projet ADD CONSTRAINT projet__datedebut_lte_datefin__chk
  CHECK (dateDebut < dateFin);

db<>fiddle here