create table STUDENT ---创建student表
(
id NUMBER(19), --id
stu_no VARCHAR2(20), --学号
stu_name VARCHAR2(32), --姓名
stu_age NUMBER, --年龄
stu_major VARCHAR2(32) --专业
)
create table STU_LOG ---创建stu_log表,用于记录对student表的操作日志
(
log_id NUMBER, --日志id
log_action VARCHAR2(100), --操作名称
log_date DATE, --操作时间
log_message VARCHAR2(32) --
)
-- a、行级触发器(before触发器)
create or replace trigger modify_stu
before insert on student
for each row
declare
next_id number;
begin
select seq_test.nextval into next_id from dual;
:new.id :=next_id;
end;
插入一条数据,但是不插入id
insert into student(stu_no,stu_name,stu_age,stu_major) values('NO1','张三',20,'中文系');
查询结果如下,自动生成id了
b、 行级触发器(after触发器)
创建触发器:将对student表的操作都记录到stu_log表中(update of 用于指定一个或多个字段,指定字段被更新时才会触发触发器)
create or replace trigger modify_stu
after insert or delete or update of stu_name
on student
for each row
begin
if inserting then
insert into stu_log values(1,'insert',sysdate,:new.stu_name);
elsif deleting then
insert into stu_log values(2,'delete',sysdate,:old.stu_name);
elsif updating then
insert into stu_log values(3,'update_old',sysdate,:old.stu_name);
insert into stu_log values(4,'update_new',sysdate,:new.stu_name);
end if;
end;
依次执行
insert into student values(1,'NO2','李四',21,'数学系');
delete student where stu_name='张三';
update student set stu_age=19 where stu_name='李四';
update student set stu_name='王二' where stu_name='李四';
查询stu_log表的结果如下

第3条update语句没有触发该触发器,因为触发器指定只有修改stu_name字段才会触发触发器
c、语句级触发器(before触发器):用来控制对表的修改
create or replace trigger xg_stu
before insert or update or delete on student
begin
if deleting then
raise_application_error(-20001,'该表不允许删除数据');
elsif updating then
raise_application_error(-20002,'该表不允许修改数据');
elsif inserting then
raise_application_error(-20003,'该表不允许插入数据');
end if;
end;

插入数据时报错如下,删除和修改数据同样也报错
d、语句级触发器(after触发器):略
create or replace trigger D_STATUS_CHG_TRIGGER2020
after insert or update or delete on D_STATUS_CHG
for each row
declare
-- local variables here
li_data_chg_id number(16,0); --数据变更索引ID
ls_data_table_code varchar2(64);--数据变更表名
li_data_pk_id number(16,0); --数据记录主键值
ls_data_chg_type varchar2(8); --数据变更类型(增、删、改)
ldt_data_chg_time date; --数据变更时间
ls_org_no varchar2(16); --供电单位编号
ls_app_type_code varchar2(8); --来源业务类型(新装;变更;销户)
ls_spec_type_code varchar2(8); --专业分类(数据采集(01);其他(02))
ls_app_no varchar2(16); -- 来源申请编号
ls_op_status1 varchar2(8); --记录处理状态(适应于数据采集系统)
ls_op_status2 varchar2(8); --记录处理状态(适应于实时电费计算系统)
ls_op_status3 varchar2(8); --记录处理状态(预留)
ls_op_status4 varchar2(8); --记录处理状态(预留)
ls_op_status5 varchar2(8); --记录处理状态(预留)
ls_op_status6 varchar2(8); --记录处理状态(预留)
ls_execute_sql varchar2(1000); --动态sql串
ls_data_chg_time varchar2(17); --数据变更时间
begin
ls_spec_type_code := '01';
select seq_pub_data_chg_map.nextval into li_data_chg_id from dual;
ls_data_table_code := 'd_status_chg';
select sysdate into ldt_data_chg_time from dual;
if inserting then
li_data_pk_id := :new.read_id;
ls_data_chg_type := '0';
--ls_org_no := substr(:new.org_no,1,5);
--ls_app_type_code := :new.app_type_code;
--ls_app_no := :new.app_no;
ls_spec_type_code:='01';
ls_op_status1 := '0';
ls_op_status2 := '0';
elsif updating then
li_data_pk_id := :new.read_id;
ls_data_chg_type := '1';
--ls_org_no := substr(:new.org_no,1,5);
--ls_app_type_code := :new.app_type_code;
--ls_app_no := :new.app_no;
ls_spec_type_code:='01';
ls_op_status1 := '0';
ls_op_status2 := '0';
elsif deleting then
li_data_pk_id := :old.read_id;
ls_data_chg_type := '2';
--ls_org_no := substr(:old.org_no,1,5);
--ls_app_type_code := :old.app_type_code;
--ls_app_no := :old.app_no;
ls_spec_type_code:='01';
ls_op_status1 := '0';
ls_op_status2 := '0';
end if;
ls_data_chg_time:=to_char(ldt_data_chg_time,'yyyymmddhh24miss');
---将数据插入变更索引控制表
insert into pub_data_chg_map
( data_chg_id,
data_table_code,
data_pk_id,
data_chg_type,
data_chg_time,
org_no,
app_type_code,
spec_type_code,
app_no,
op_status1,
op_status2,
op_status3,
op_status4,
op_status5,
op_status6
)
values
(li_data_chg_id,
ls_data_table_code,
li_data_pk_id,
ls_data_chg_type,
to_date(ls_data_chg_time,'yyyymmddhh24miss'),
ls_org_no,
ls_app_type_code,
ls_spec_type_code,
ls_app_no,
ls_op_status1,
ls_op_status2,
ls_op_status3,
ls_op_status4,
ls_op_status5,
ls_op_status6);
end D_STATUS_CHG_TRIGGER;
















