ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

5.1oracle触发器

2021-09-22 18:35:54  阅读:147  来源: 互联网

标签:5.1 触发器 -- stu ls oracle data id op


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.1,触发器,--,stu,ls,oracle,data,id,op
来源: https://www.cnblogs.com/zl-programmer/p/15321123.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有