2017-04-18 7 views
0

私のコードでエラーが見つかりませんでした。割り当ては2日以内に行われます。 私はGoogleのエラーログとすべてを試みてきましたが、間違ったものは見つけられません。変数とエラーメッセージはフランス語で書かれていますが、エラーの修正の意味を理解する必要はありません。前もって感謝します!トリガー挿入エラー

私はINSERT INTO碑文の後に取得エラー: 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

エラーは、かなり明確である、あなたのクエリのいずれかがデータを見つけません。それがnullであるので、

SELECT dateDebut INTO ladateDebut 
FROM SessionUQAM 
WHERE SessionUQAM.codeSession = lecodeSession; 

あなたはlecodeSessionを宣言したが、あなたはそれを価値を与えられていない(とは何もありません:それも、それが(declareから数えて)され、8行目にいうどちらかを示しますnullに等しい)。

おそらくNEW pseudorecordを介して、いずれかの変数に値を代入し、それを使用して、挿入された行のbeigから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; 

2番目のクエリでも同じ問題があります。いずれにしても、両方の値を1つのクエリで取得できます。

またladateAbandonまたはlanoteを設定していないので、それらを参照してください小切手は、同様に:NEW.dateAbandon:NEW.noteを使用する必要があります。 (割り当てルートを下げない限り、使用しない3つの変数の宣言を削除してください)。

+0

お返事ありがとうございました。次のように定義したと思いました。lanote Inscription.note%TYPE;私の先生のメモには、そのような行がありましたが、コードの残りの部分を投稿していないと思います。私はあなたの答えを今すぐ試してみるつもりです – Phil

+0

あなたはそれを宣言しましたが、これは必須ではありませんが、宣言を保持し、 'lecodeSession:=:NEW.codeSession; 'で値を代入し、クエリで' leCodeSession'を使用することができます。あなたの先生がそれを好むかもしれませんが、私はあまり明確ではありません。 –

+0

それはうまくいった!ありがとう! lanoteとは何ですか?Inscription.note%TYPE;変数を宣言しているのですか?それの使用は何ですか? – Phil