触发器不工作之前的SQL

时间:2014-12-02 11:56:39

标签: oracle plsql triggers

我正在学习oracle并尝试实现before触发器。我认为我的代码是正确的但是一旦我运行了一个insert语句,触发器就不会被调用或使用,但是该行仍然插入到表中。任何人都可以看到我做错了什么或者知道触发器为什么不起作用?

这是我正在使用的触发器

create or replace
TRIGGER DAY_CHECK BEFORE
  INSERT ON AD_SLOT FOR EACH ROW DECLARE p_day AD_SLOT.DAY_OF_WEEK%TYPE;
  NOTVALID EXCEPTION;
  BEGIN
    IF p_day IN ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday') THEN
      DBMS_OUTPUT.PUT_LINE('VALID DAY');
    ELSE
      RAISE NOTVALID;
    END IF;
 EXCEPTION
 WHEN NOTVALID THEN
   DBMS_OUTPUT.PUT_LINE('NOT A VALID DAY');
   RAISE;
 END;

这是我正在测试的插入语句,它应该是因为日期无效而引发异常

 insert into ad_slot values (78955, 'testday', 'ER', 'House', 'Taken', 7654321, '05=FEB-2014 21:00:00');

使用的测试用例

INSERT INTO ad_slot (DAY_OF_WEEK) VALUES ('unwanted day');  

1 个答案:

答案 0 :(得分:0)

您需要将RAISE放在EXCEPTION区块中,以免让INSERT在不需要的工作日内工作。否则,无论如何都要插入行。

SQL> CREATE TABLE ad_slot(day_of_week VARCHAR2(20));

Table created.

SQL> CREATE OR REPLACE TRIGGER DAY_CHECK BEFORE
  2    INSERT ON AD_SLOT FOR EACH ROW DECLARE p_day AD_SLOT.DAY_OF_WEEK%TYPE;
  3    NOTVALID EXCEPTION;
  4    BEGIN
  5      IF p_day IN ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday') THEN
  6        DBMS_OUTPUT.PUT_LINE('VALID DAY');
  7      ELSE
  8        RAISE NOTVALID;
  9      END IF;
 10    EXCEPTION
 11    WHEN NOTVALID THEN
 12      DBMS_OUTPUT.PUT_LINE('NOT A VALID DAY');
 13      RAISE;
 14    END;
 15  /

Trigger created.

SQL>
SQL> INSERT INTO ad_slot VALUES ('unwanted day');
NOT A VALID DAY
INSERT INTO ad_slot VALUES ('unwanted day')
            *
ERROR at line 1:
ORA-06510: PL/SQL: unhandled user-defined exception
ORA-06512: at "LALIT.DAY_CHECK", line 12
ORA-04088: error during execution of trigger 'LALIT.DAY_CHECK'


SQL>