【问题标题】:Oracle SQL Trigger errors - ORA-06512, ORA-04088Oracle SQL 触发器错误 - ORA-06512、ORA-04088
【发布时间】:2015-08-06 17:40:16
【问题描述】:

我有以下触发器

create or replace trigger CHILD_DOB_TRIGGER
before insert on CHILDREN
for each row
  begin
  if :NEW.CHILD_DOB > sysdate then
  raise_application_error(-20001, 'CHILD_DOB must be greater than current date');
  end if;
  end;
/

但如果我尝试插入

INSERT INTO CHILDREN 
VALUES ((TO_DATE('2020/05/03', 'yyyy/mm/dd')));

我收到以下错误

SQL Error: ORA-20001: CHILD_DOB must be greater than current date
ORA-06512: at "USER.CHILD_DOB_TRIGGER", line 3
ORA-04088: error during execution of trigger 'USER.CHILD_DOB_TRIGGER'

【问题讨论】:

  • 嗯,你收到了一个错误,因为如果 CHILD_DOB 列在未来,你的触发器会引发错误,并且你在未来插入一个值。
  • 这里有什么问题?你得到了你想要的。
  • 什么是 ORA-06512 和 ORA-04088 错误?我的触发器有问题吗?
  • 另外,请不要使用触发器进行数据验证。请改用检查约束。
  • 检查约束不适用于 SYSDATE,必须是触发器

标签: sql oracle oracle11g triggers


【解决方案1】:

您的触发器没有问题。它只是因为调用 raise_application_error 而抛出异常 ORA-20001。

Oracle 在这种情况下会在堆栈中抛出更多异常:

您收到一条信息,表明您的 INSERT 语句失败

ORA-04088: error during execution of trigger 'USER.CHILD_DOB_TRIGGER'

下一个消息是您的代码异常出现的位置

ORA-06512: at "USER.CHILD_DOB_TRIGGER", line 3

最后一条消息显示主要问题

ORA-20001: CHILD_DOB must be greater than current date

【讨论】:

    【解决方案2】:

    如果 :NEW.CHILD_DOB > sysdate 那么 raise_application_error(-20001, 'CHILD_DOB 必须大于当前日期');

    如果新插入日期 大于 大于SYSDATE,则您将引发用户定义的异常。

    TO_DATE('2020/05/03', 'yyyy/mm/dd')

    上述日期大于 SYSDATE,因此您的触发器完全按照您的要求执行。

    例如,

    SQL> CREATE OR REPLACE TRIGGER CHILD_DOB_TRIGGER
      2  before insert on emp
      3  for each row
      4    BEGIN
      5    if :NEW.hiredate > sysdate then
      6    raise_application_error(-20001, 'CHILD_DOB must be greater than current date');
      7    end if;
      8    END;
      9  /
    
    Trigger created.
    
    SQL>
    SQL> sho err
    No errors.
    SQL>
    SQL> INSERT INTO emp(hiredate)
      2  VALUES ((TO_DATE('2020/05/03', 'yyyy/mm/dd')));
    INSERT INTO emp(hiredate)
                *
    ERROR at line 1:
    ORA-20001: CHILD_DOB must be greater than current date
    ORA-06512: at "LALIT.CHILD_DOB_TRIGGER", line 3
    ORA-04088: error during execution of trigger 'LALIT.CHILD_DOB_TRIGGER'
    
    
    SQL>
    

    【讨论】:

      猜你喜欢
      • 2013-11-29
      • 1970-01-01
      • 2019-10-17
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 2013-10-14
      相关资源
      最近更新 更多