触发器插入错误
问题描述:
我找不到我的代码中的错误,并在2天内分配, 我一直试图谷歌错误日志和一切,但我只是无法找到什么是错的。变量和错误消息都是法文的,但您并不需要明白这是什么意思来纠正错误。提前致谢!触发器插入错误
错误插入进入刻录后,我得到: ORA-01403:找不到数据 ORA-06512:一个 “KA791013.PASABANDONPASNOTENULLE”,8号线 ORA-04088:触发错误 'KA791013.PASABANDONPASNOTENULLE'
表格:
CREATE TABLE Inscription
(codePermanent CHAR(12) NOT NULL,
sigle CHAR(7) NOT NULL,
noGroupe INTEGER NOT NULL,
codeSession INTEGER NOT NULL,
dateInscription DATE NOT NULL,
dateAbandon DATE,
note INTEGER,
CONSTRAINT SigleUnique UNIQUE(sigle),
CONSTRAINT ClePrimaireInscription PRIMARY KEY (codePermanent,sigle,noGroupe,codeSession),
CONSTRAINT CERefGroupeCours FOREIGN KEY (sigle,noGroupe,codeSession) REFERENCES GroupeCours,
CONSTRAINT CECodePermamentRefEtudiant FOREIGN KEY (codePermanent) REFERENCES Etudiant
)
/
CREATE TABLE SessionUQAM
(codeSession INTEGER NOT NULL,
dateDebut DATE NOT NULL,
dateFin DATE NOT NULL,
CONSTRAINT C2 CHECK(dateFin = dateDebut +90),
CONSTRAINT ClePrimaireSessionUQAM PRIMARY KEY (codeSession)
)
/
CREATE TRIGGER PasAbandonPasNoteNulle AFTER INSERT OR UPDATE OF dateAbandon ON Inscription
FOR EACH ROW
DECLARE
lecodeSession Inscription.codeSession%TYPE;
ladateAbandon Inscription.dateAbandon%TYPE;
ladateDebut DATE;
ladateFin DATE;
lanote Inscription.note%TYPE;
BEGIN
SELECT dateDebut INTO ladateDebut
FROM SessionUQAM
WHERE SessionUQAM.codeSession = lecodeSession;
SELECT dateFin INTO ladateFin
FROM SessionUQAM
WHERE SessionUQAM.codeSession = lecodeSession;
IF (ladateAbandon IS NOT NULL AND lanote IS NOT NULL)THEN
RAISE_APPLICATION_ERROR(-20000,'Si la date abandon est non null alors la note doit etre non null');
END IF;
IF (ladateAbandon > ladateDebut + 30) THEN
RAISE_APPLICATION_ERROR(-20000,'La date abandon doit etre de 30 jours maximum apres la date de Debut');
END IF;
IF (ladateAbandon > ladateFin)THEN
RAISE_APPLICATION_ERROR(-20000,'La date abandon doit etre avant la fin de session');
END IF;
END;
/
INSERT INTO SessionUQAM
VALUES(32003,'01/09/2015','30/11/2015')
/
INSERT INTO Inscription
VALUES('LAVP24059100','INF3143',10,32003,'01/08/2015','30/10/2015', 42)
/
答
的错误是很清楚,您的查询就会发现没有数据;它甚至会告诉你其中的一个,因为它指的是8号线,这是(从declare
计):
SELECT dateDebut INTO ladateDebut
FROM SessionUQAM
WHERE SessionUQAM.codeSession = lecodeSession;
您已经声明lecodeSession
但你有没有给它的值,所以它是空(并没有什么是等于空)。
你可能想将参照从插入的行beig的codeSession
值,通过新的pseudorecord,无论是通过分配一个值的变量,然后使用它:
lecodeSession := :NEW.codeSession;
SELECT dateDebut INTO ladateDebut
FROM SessionUQAM
WHERE SessionUQAM.codeSession = lecodeSession;
或者更简单(虽然你的教导可能不直接):
SELECT dateDebut INTO ladateDebut
FROM SessionUQAM
WHERE SessionUQAM.codeSession = :NEW.codeSession;
你也有第二个查询相同的问题。尽管无论如何你都可以在一个查询中获得两个值。
您也没有设置ladateAbandon
或lanote
,因此引用这些的检查应该使用:NEW.dateAbandon
和:NEW.note
以及。 (然后删除不使用的三个变量的声明,除非沿着赋值路线。)
错误很明显。你的“select into ...”之一没有返回任何数据。 – OldProgrammer