若不符合dml触发器的块中的条件--抛出异常,抛出异常相当于将之前的DML操作“回滚”(应该不能叫做正真意义上的回滚)。
要是不抛出,dml操作不会回滚。
--触发器作用说明:当将 申请书递交详情的par_cla更新为'1'时,并且该表中的在sub_time和sub_app字段都为非空的前提下,触发触发器对上党校表的stu_no字段插入数据。
但要是将申请书递交详情的par_cla更新为'1'时,存在sub_time或sub_app任何一个为空,则报错。
CREATE OR REPLACE TRIGGER PAR_CLA_INFO_TRI
AFTER UPDATE OF par_cla ON 申请书递交详情
FOR EACH ROW
WHEN (NEW.par_cla='1')
BEGIN
IF ((:new.sub_timeIS NULL) or (:old.sub_app IS NULL)) THEN
dbms_output.put_line('错误');
ELSE
INSERT INTO 上党校情况(stu_no) values (:new.stu_no);
END IF;
end;
--问题说明:当执行update语句之后,触发触发器,一开始以为要是存在sub_time或sub_app任何一个为空,就会在执行update语句时,因为遇到非空字段而不执行。但是执行之后:如下SQL,发现因为有存在非空字段,打印出“错误”。并且一行更新成功。
SQL> update 申请书递交详情 set par_cla='1' wherestu_no=20120201004;
错误
1 row updated
这不是我想要的结果。我只需要打印出“错误“即可
问题解决:
在网友的帮助下,说应该抛出异常 即RAISE_APPLICATION_ERROR('错误'),而不是 dbms_output.put_line('错误');问题得到解决。
CREATE OR REPLACE TRIGGER PAR_CLA_INFO_TRI
AFTER UPDATE OF par_cla ON 入党申请书递交详情
FOR EACH ROW
WHEN (NEW.par_cla='1')
-- DECLARE
-- e_lackofdata EXCEPTION;
BEGIN
IF ((:new.sub_timeIS not NULL)AND(:old.sub_appISNOT NULL)AND(:new.par_cla='1'))THEN
INSERT INTO 上党校情况(stu_no)values(:new.stu_no);
ELSE
RAISE_application_error(-20001,'错误');
END IF;
-- EXCEPTION
-- WHENe_lackofdata THEN ;
end;
当执行update时,因为抛出异常,而不会去执行update了。