【问题标题】:Trigger created with warning触发器创建时带有警告
【发布时间】:2014-07-21 16:08:08
【问题描述】:

由于 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;

现在我收到“警告:创建了编译错误的触发器”。 无法解决问题。 请帮忙。

【问题讨论】:

    标签: oracle plsql triggers


    【解决方案1】:

    您的问题源于您试图错误地引用“dob”列。如果执行 "show errors" ,您应该会看到消息“[Error] PLS-00201 (7: 8): PLS-00201: identifier 'DOB' must be declared”。您需要在列前加上 :new 前缀(默认)才能访问记录的值。

    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

    【讨论】:

      【解决方案2】:

      使用下面的代码

      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;
      

      在代码中,我使用新旧关键字来访问插入到出生表中的新值。

      【讨论】:

      • 用这个条件代替上述条件(:new.dob>=sysdate)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多