【发布时间】:2015-01-30 15:58:17
【问题描述】:
我正在学习 oracle 并尝试实现前触发器。我想我的代码是正确的,但是一旦我运行插入语句,触发器就不会被调用或使用,但该行仍然插入到表中。谁能看到我做错了什么或知道为什么触发器不起作用?
这是我正在使用的触发器
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');
【问题讨论】:
-
你永远不会给
p_day赋值。另外,您不能在触发器中使用commit或回滚`。 -
如何将其分配给用户输入的值?
-
或者像'select day_of_week into p_day from ad_slot'这样的工作吗?
-
您可以使用
new访问受触发器影响的行。这一切都记录在手册中:docs.oracle.com/cd/E11882_01/appdev.112/e25519/… -
不再需要使用关键字
new。