若不符合DML触发器的块中的条件--抛出异常

若不符合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了。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值