2017-11-27 4 views
0

だから私は2つのテーブル、人と予約しています。人が予約をしようとしたときに登録したい日と予約が開かれた日の差が2か月以上ある場合は、予約が遅すぎるというエラーが画面に表示されます。ここで私が作ったトリガーである:(注:外部キーとして予約表の行為でPEOPLEID)PL/SQL ORACLE:months_betweenのトリガーは何もしていません

create or replace trigger reservings 
    before insert OR UPDATE on RESERVATION 
    for each row 
declare 
vdate DATE; 
vadd number; 
begin 
select date_to_register into vdate from PEOPLE WHERE PEOPLEID=:NEW.PEOPLEID; 
    vadd:=TRUNC(MONTHS_BETWEEN(vdate,:NEW.RESERVATIONDATE)); 
    if INSERTING AND vadd>2 then 
     Raise_Application_Error (-20343, 'ITS TOO EARLY'); 
     ELSIF UPDATING AND vadd>2 then 
     Raise_Application_Error (-20343, 'ITS TOO EARLY'); 
    end if; 
    end; 

私はこれを実行するときに、トリガがコンパイルされるが、私は、人がよいでしょうときの日付を入力するとき予約を行い、実際に予約日が2ヶ月を超えている場合は、エラーを投げるのではなく、データを入力することができます。何が起こっていますか? :/ HERESに私は予約テーブルに挿入するもの:

INSERT INTO RESERVATION(ID,PEOPLEID,RESERVATIONDATE) VALUES(1,1,(TO_DATE('11/12/2018', 'DD/MM/YYYY'))); 
+0

ような何か: 'PEOPLEID = 1人々からdate_to_register選択;' – I3rutt

答えて

1

の問題は、2番目の引数は最初の引数より大きい場合MONTHS_BETWEEN戻り負の値。

vdate < :NEW.RESERVATIONDATEが常に確実である場合は、MONTHS_BETWEEN(:NEW.RESERVATIONDATE , vdate)を使用する必要があります。

これ以外の場合は、2ヶ月の差にのみ関心がある場合は、式にABS()関数を使用してください。

このクエリが返すどのような結果...ABS(vadd) > 2 ..

関連する問題