2017-04-18 116 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