oracle 触发器

Oracle触发器语法:

Create or  replacetrigger 触发器名   触发时间  触发事件

 On 表名

for each row //  对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。

Begin

 Pl/sql 语句

End

对If  then     end  if 的理解:

  

语法格式:
IF    条件1 THEN
语句序列1;
ElSIF 条件2 THEN
语句序列2;
[
ELSIF 条件n THEN
  语句序列 n;
]
[
ELSE
语句序列 n+1
……
]
END IF;

例:取出7369的薪水,如果薪水<1200,则输出'low',如果<2000则输出'middle',否则'high' 
--注意elsif的写法,then后面没有分号
--注意最后一个else后面没有then
--注意end if后面有一个分号

declare
   v_sal   emp.sal%type;
begin
   select sal into v_sal from emp where empno = 7369;
   if v_sal < 1200    then
      dbms_output.put_line ('salgrade is low');
   elsif v_sal < 2000 then
      dbms_output.put_line ('salgrade is middle');
   else
      dbms_output.put_line ('salgrade is high');
   end if;
end;
 

下面的触发器在更新表cyq_emp之前触发,目的是不允许在周末修改表:

create or replace trigger auth_secure before insert or update or DELETE

on cyq_emp

begin

  IF(to_char(sysdate,'DY')='星期日') THEN

    RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表cyq_emp');

  END IF;

END;

使用触发器实现序号自增

创建一个测试表:

create table cyq_user(

  id number(11) primary key,

  username varchar(50),

  password varchar(50)

);

创建一个序列:

复制代码 代码如下:

create sequence my_seq increment by 1 start with 1 nomaxvalue nocycle cache 20;

创建一个触发器:

CREATE OR REPLACE TRIGGER MY_TGR

 BEFORE INSERT ON CYQ_USER

 FOR EACH ROW--对表的每一行触发器执行一次

DECLARE

 NEXT_ID NUMBER;

BEGIN

 SELECT MY_SEQ.NEXTVAL INTO NEXT_ID FROM DUAL;

 :NEW.ID := NEXT_ID; --:NEW表示新插入的那条记录

END;

向表插入数据:

insert into cyq_user(username,password) values('admin','admin');

insert into cyq_user(username,password) values('fgz','fgz');

insert into cyq_user(username,password) values('test','test');

COMMIT;

原文地址:https://www.cnblogs.com/chaiyingqi/p/8460868.html