oracle触发器

--===================================触发器
/*
触发器:监视器,监视表中记录,当对表中记录进行操作(增删改)触发器工作

--行级触发器: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;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值