触发插入错误

时间:2017-04-18 20:24:20

标签: oracle plsql

我无法在代码中找到错误,并且在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)
/

1 个答案:

答案 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;

第二个查询也存在同样的问题。虽然你可以在一个查询中获得这两个值。

您也未设置ladateAbandonlanote,因此引用这些内容的检查也应使用:NEW.dateAbandon:NEW.note。 (然后删除你不使用的三个变量的声明,除非你沿着分配路线走。)