简单触发器常用备忘

1.触发器代码的大小不能超过32K,如果确实要在触发器中使用大量的代码,应该先建立存储过程,然后再触发器中使用CALL语句调用存储过程。

2.触发器只能使用SELECT,INSERT,UPDATE,DELETE不能包含CREATE,ALERT,DROPCOMMIT,ROLLBACK,SAVEPOINT

3.一个表上多个触发器的执行顺序:BEFORE语句级触发器-(BEFORE行触发器-AFTER行触发器)-AFTER语句触发器。括号中的可循环。

4.语句级触发器样例:

   --语句级触发器,多用途。

   CREATE OR REPLACE TRIGGER EMP_TRI

   BEFORE(AFTER) INSERT OR UPDATE OR DELETE ON EMP

   DECLARE

   BEGIN

     CASE

      WHEN INSERTING THEN --表示是插入

      --CONTENTS1;

      WHEN UPDATING THEN --表示是更新

      --CONTENTS2;

      WHEN DELETING THEN --表示是删除

      --CONTENTS3;

     END CASE;

   END;

5.行触发器

   --行触发器,每一行都执行该触发器一次。

   CREATE OR REPLACE TRIGGER EMP_TRI

   BEFORE(AFTER) INSERT OR UPDATE OR DELETE ON EMP

   FOR EACH ROW --不同点一

   DECLARE

   BEGIN

     :NEW.(:OLD.字段) := 1; --不同点二

   END;

6.在给这张表做操作时,触发器代码不能从触发器所对应的基表中读取数据。例子:

  --下边的触发器,可以成功编译,但是在触发的时候会有问题。其实这是一个死循环。

  CREATE OR REPLACE TRIGGER EMP_TRI

  BEFORE(AFTER) INSERT OR UPDATE OR DELETE ON EMP

  FOR EACH ROW

  DECLARE

    V VARCHAR2(10);

  BEGIN

     SELECT NAME INTO V FROM EMP WHERE ID = :NEW.ID(:OLD.ID);

  END;

7.抛出异常:raise_application_error(数字,'提示')

8.限制行触发器,因为行触发器是每一行执行一次触发器,所以可以根据需要限制。语句级因为执行一次,所以不需要。样例:

   CERATE OR REPLACE TRIGGER EMP_TRI

   BEFORE(AFTER) INSERT OR UPDATE OR DELETE ON EMP

   FOR EACH ROW

   WHEN (:OLD.JOB = 'SALESMAN') --当满足该条件才执行下述操作。

   DECLARE

   BEGIN

    --CONTENTS;

   END;

9.SELECT D.trigger_name FROM DBA_TRIGGERS D WHERE D.table_name = '表名';--用来查询TRIGGER

你可能感兴趣的:(application,delete,存储,insert,each,triggers)