--===================================触发器
/*
触发器:监视器,监视表中记录,当对表中记录进行操作(增删改)触发器工作
--行级触发器:for each row 使用:old, :new
语法:
create or replace trigger 触发器名称
after|before
insert|update|delete
on 表名
declare
begin
end;
*/
--添加一条记录后,打印输出“添加记录成功!”
create or replace trigger emp_add_after
after
insert
on emp
declare
begin
dbms_output.put_line('加记录成功');--定义规则
end;
--测试
insert into emp(empno,ename) values(9998,'mike');
commit;
/*
弹框提示函数:
raise_application_error(p1,p2);
p1:错误代码 取值范围-20001 到 -20999之间
p2:提示信息
*/
--不能给员工降薪
create or replace trigger emp_update_after
after
update
on emp
for each row --行级触发器,通过:old获取操作旧值,:new操作后新值,每一条记录监视
declare
begin
--获取到更新之后值,更新之前的值。判断update操作是否给降薪
if :old.sal > :new.sal then
raise_application_error(-20001,'不能给员工降薪');--给错误提示框
end if;
end;
--测试
update emp set sal = sal -1 where empno = 7369;
commit;
--不能在非工作日办理入职
create or replace trigger emp_insert_before
before
insert
on emp
declare
p varchar2(200);
begin
select to_char(sysdate,'day') into p from dual;--规则
if trim(p) in('saturday','sunday') then
raise_application_error(-20002,'不能在非工作日办理入职');--给错误提示框
end if;
end;
--测试
insert into emp(empno,ename) values(9997,'mike');
commit;
--===================触发器应用
/*
实现跟MySQL数据中主键自增效果
insert into emp(ename) values(’zhangsna‘);
oracle:
insert into emp(empno,ename) values(sequence.nextval,’zhangsna‘);
*/
--配合序列使用
create sequence seq_emp;
create or replace trigger emp_insertRow_before
before
insert
on emp
for each row
declare
begin
select seq_emp.nextval into :new.empno from dual; --给将要添加记录,从某个序列中查询到一个值----设置主键值
end;
--测试
insert into emp(ename) values('jack1');
commit;
/*
触发器:监视器,监视表中记录,当对表中记录进行操作(增删改)触发器工作
--行级触发器:for each row 使用:old, :new
语法:
create or replace trigger 触发器名称
after|before
insert|update|delete
on 表名
declare
begin
end;
*/
--添加一条记录后,打印输出“添加记录成功!”
create or replace trigger emp_add_after
after
insert
on emp
declare
begin
dbms_output.put_line('加记录成功');--定义规则
end;
--测试
insert into emp(empno,ename) values(9998,'mike');
commit;
/*
弹框提示函数:
raise_application_error(p1,p2);
p1:错误代码 取值范围-20001 到 -20999之间
p2:提示信息
*/
--不能给员工降薪
create or replace trigger emp_update_after
after
update
on emp
for each row --行级触发器,通过:old获取操作旧值,:new操作后新值,每一条记录监视
declare
begin
--获取到更新之后值,更新之前的值。判断update操作是否给降薪
if :old.sal > :new.sal then
raise_application_error(-20001,'不能给员工降薪');--给错误提示框
end if;
end;
--测试
update emp set sal = sal -1 where empno = 7369;
commit;
--不能在非工作日办理入职
create or replace trigger emp_insert_before
before
insert
on emp
declare
p varchar2(200);
begin
select to_char(sysdate,'day') into p from dual;--规则
if trim(p) in('saturday','sunday') then
raise_application_error(-20002,'不能在非工作日办理入职');--给错误提示框
end if;
end;
--测试
insert into emp(empno,ename) values(9997,'mike');
commit;
--===================触发器应用
/*
实现跟MySQL数据中主键自增效果
insert into emp(ename) values(’zhangsna‘);
oracle:
insert into emp(empno,ename) values(sequence.nextval,’zhangsna‘);
*/
--配合序列使用
create sequence seq_emp;
create or replace trigger emp_insertRow_before
before
insert
on emp
for each row
declare
begin
select seq_emp.nextval into :new.empno from dual; --给将要添加记录,从某个序列中查询到一个值----设置主键值
end;
--测试
insert into emp(ename) values('jack1');
commit;