我无法在代码中找到错误,并且在2天内完成作业, 我一直试图谷歌错误日志和一切,但我只是找不到什么错。变量和错误消息使用法语,但您并不需要了解纠正错误的含义。提前谢谢!
插入到铭文后我得到的错误: ORA-01403:未找到任何数据 ORA-06512:a" 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)
/
答案 0 :(得分:1)
错误很明显,您的一个查询找不到数据;它甚至会告诉你哪一个引用第8行,即(从declare
开始计算):
SELECT dateDebut INTO ladateDebut
FROM SessionUQAM
WHERE SessionUQAM.codeSession = lecodeSession;
你已声明lecodeSession
但你没有给它一个值,所以它是null(没有任何东西等于null)。
您可能希望通过NEW伪记录来引用行插入的codeSession
值,方法是为变量赋值,然后使用它:
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
。 (然后删除你不使用的三个变量的声明,除非你沿着分配路线走。)