2014-07-20 57 views
0

由於sysdate無法在檢查約束中使用,試圖通過觸發器來實現目的。 但它顯示「警告:觸發器編譯錯誤創建。」使用警告創建觸發器

我發佈我的語法如下。我正在使用Oracle 10g數據庫。

create table birth 
(name varchar2(30), DOB date); 

insert into birth values ('Ravi', sysdate+1); 

插入1行。 現在技術上這是錯誤的。爲了防止這個我創建一個觸發器

create or replace trigger birth_trigger 
before insert or update of dob on birth 
for each row 
begin 
if (dob >=sysdate) 
then 
raise_application_error (-20501, 'DOB cannot be greater than sysdate'); 
end if; 
end; 

現在我在這裏得到「警告:編譯錯誤創建的觸發器」。 無法解決問題。 請幫忙。

回答

3

您的問題源於您嘗試錯誤地引用「dob」列的事實。如果執行「顯示錯誤」,您應該看到「錯誤] PLS-00201(7:8):PLS-00201:必須聲明標識符'DOB'」。您需要在前面添加:新前綴(默認)以訪問記錄的值。

create or replace trigger birth_trigger 
before insert or update of dob on birth 
for each row 
begin 
    if (:new.dob >=sysdate) 
    then 
    raise_application_error (-20501, 'DOB cannot be greater than sysdate'); 
    end if; 
end; 

我會推薦使用IDE來做PL/SQL開發,比如Oracle免費的SQLDeveloper。另外,請閱讀觸發器上的Oracle Documenation

0

使用下面的代碼

create or replace trigger birth_trigger 
before insert or update of dob on birth 
referencing old as old new as new 
for each row 
begin 
    if (
     trunc (to_date(:new.dob, 'DD/MM/YYYY')) >= trunc (to_date(sysdate,'DD/MM/YYYY')) 
     ) 
    then 
     raise_application_error (-20501, 'DOB cannot be greater than sysdate'); 
    end if; 
end; 

在代碼中,我使用的新老關鍵字訪問插入表中誕生的新的價值觀。

+0

我不會在'DATE'列上調用'TO_DATE' ... –

+0

而不是上面的條件使用這個條件(:new.dob> = sysdate) – Smart003