2017-04-18 115 views
0

我找不到我的代码中的错误,并在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) 
/
+2

错误很明显。你的“select into ...”之一没有返回任何数据。 – OldProgrammer

回答

1

的错误是很清楚,您的查询就会发现没有数据;它甚至会告诉你其中的一个,因为它指的是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; 

你也有第二个查询相同的问题。尽管无论如何你都可以在一个查询中获得两个值。

您也没有设置ladateAbandonlanote,因此引用这些的检查应该使用:NEW.dateAbandon:NEW.note以及。 (然后删除不使用的三个变量的声明,除非沿着赋值路线。)

+0

非常感谢您的回答,我以为我的定义是:lanote Inscription.note%TYPE;在我的老师的笔记中,他做了一个这样的行,但我想他只是没有发布其余的代码,我现在要尝试你的答案 – Phil

+0

你宣布它,但没有给它一个价值。这不是必须的,但是你可以保留声明并用'lecodeSession:=:NEW.codeSession;'赋值,然后在查询中使用'leCodeSession'。也许你的老师喜欢那个,但我觉得它不太清楚。 –

+0

y它工作!多谢!什么是lanote Inscription.note%TYPE;那么如果它确实声明了一个变量?它有什么用处? – Phil