我正在学习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');
答案 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>