学习资料来源于:【Oracle】黑马57期Oracle数据库基础教程_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
什么是触发器?
就是制定一个规则,在做增删改操作(只在这几个情况下,查询时不触发)的时候,只要满足该规则,自动触发,无需调用。
分为:
语句级触发器、行级触发器
区别在于行级触发器包含有for each row。加for each row是为了使用:old或者:new。
触发语句 | :old | :new |
insert | 所有字段都是空(null) | 将要插入的数据 |
update | 更新以前该行的值 | 更新后的值 |
delete | 删除以前该行的值 | 所有字段都是空(null) |
【代码展示】:
--语句级触发器
--插入一条记录,输出一个新员工入职
create or replace trigger t1
after
insert
on person
declare
begin
dbms_output.put_line('一个新员工入职');
end;
--触发t1
insert into person values(1,'小红');
commit;
--行级别触发器
--案例:不能给员工降薪
create or replace trigger t2
before
update
on emp
for each row
declare
begin
if :old.sal>:new.sal then
raise_application_error(-20001,'不能给员工降薪');
--raise_application_error(-20001~-20999之间,'错误提示信息')
end if;
end;
--触发t2
update emp set sal=sal-1 where empno=7788;
commit;
触发器构建结果查询位置为
现在使用触发器来实现主键自增,也就是说我不止是可以发挥它的提示作用,还可以用它来实现涉及数据本身的更新功能。
在之前创建的序列基础上,加上触发语句:new,来实现输入新的姓名,即加一个新的pid。
【代码展示】:
--触发器实现主键自增。
--分析:在用户做插入操作之前,拿到即将插入的数据
--给该数据中的主键列赋值
create or replace trigger auid
before
insert
on person
for each row
declare
begin
select s_person.nextval into :new.pid from dual;--之前创建的序列
end;
--使用auid实现主键自增
insert into person(pname) values ('小张');
commit;
select * from person;