Oracle触发器语法:
Create 【or replace】 trigger 触发器名 触发时间 触发事件
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;