我正在創建一個 PL/SQL 觸發器,如果?? date_fin < date_begin 會給我一個錯誤。(我是觸發器的新手。)
我的問題是,當測驗我得到ORA-01403: no Data found. 我說觸發器沒有找到要分析的資料,但我的表包含值。
我的錯誤是否來自我的觸發器格式?
這是我的代碼:
--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;
uj5u.com熱心網友回復:
是的,錯誤來自觸發器,因為它是一個BEFORE INSERT觸發器,因此表中尚不存在該行,但您試圖使用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<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/466316.html
