2014-12-02 81 views
0

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

这是我使用

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语句触发使用

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

你永远不会为'p_day'赋值。另外你不能在触发器中使用'commit'或者rollback'。 – 2014-12-02 12:06:45

+0

我如何将它分配给用户输入的值? – Hayes121 2014-12-02 12:08:24

+0

还是会像'select_day_of_week_p_day from ad_slot'那样工作? – Hayes121 2014-12-02 12:09:26

回答

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> 
+0

感谢回复lalit,但是当我尝试运行此代码时,出现错误'ORA-06512:at“DT2113A.DAY_CHECK “,第11行 ORA-04088:执行触发器'DT2113A.DAY_CHECK'期间出错'' – Hayes121 2014-12-02 12:37:59

+0

发布完整的错误堆栈。 – 2014-12-02 12:51:18

+0

在命令行254处开始出现错误: 插入ad_slot值(78955,'Monday','ER','House','Taken',7654321,'05 = FEB-2014 21:00:00') 错误报告: SQL错误:ORA-20001:程序持续时间不够长 ORA-06512:在“DT2113A.DAY_CHECK”,第11行 ORA-04088:执行触发期间出错'DT2113A.DAY_CHECK' – Hayes121 2014-12-02 13:02:24