C/C++教程

5.1oracle触发器

本文主要是介绍5.1oracle触发器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

https://blog.csdn.net/cc_0101/article/details/80664561

  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;
这篇关于5.1oracle触发器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!