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
我正在创建一个 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