2014-07-20 58 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