oracle课堂收录-触发器
来源:互联网 发布:怎么校准网络时间 编辑:程序博客网 时间:2024/05/02 02:16
1.语句级触发器
先举个栗子:
(1)建立一个日志信息表emp_log用于存储用户对表的操作。
SQL> create table emp_log( 2 who varchar2(30), 3 when date);表已创建。
(2)在emp表上创建语句级触发器,将用户对emp表进行的操作记录到emp_log表中。
SQL> create or replace trigger emp_op 2 before insert or update or delete 3 on emp 4 begin 5 insert into emp_log(who,when) 6 values(user,sysdate); 7 end emp_op; 8 /触发器已创建(3)更新emp表,增加员工10%的薪金,确认触发器正常运行。
SQL> update emp 2 set sal=sal*1.1;已更新17行。SQL> select * from emp_log;WHO WHEN------------------------------ --------------SCOTT 26-10月-15
修改触发器emp_op和emp_log表以便能够记录操作的类型。
(1)修改emp_log表,围棋添加action列。
SQL> alter table emp_log 2 add (action varchar2(50));表已更改。SQL> desc emp_log 名称 是否为空? 类型 ----------------------------------------- -------- ------------- WHO VARCHAR2(30) WHEN DATE ACTION VARCHAR2(50)
(2)修改触发器,以便记录操作的类型
SQL> create or replace trigger emp_op 2 before insert or update or delete 3 on emp 4 declare 5 var_action varchar2(50); 6 begin 7 if inserting then 8 var_action:='INSERT'; 9 elsif updating then 10 var_action:='UPDATE'; 11 elsif deleting then 12 var_action:='DELETE'; 13 end if; 14 insert into emp_log(who,when,action) 15 values(user,sysdate,var_action); 16 end emp_op; 17 /触发器已创建(3)更新某雇员的信息,测试触发器。
SQL> update emp 2 set sal=sal*1.2 3 where empno=7369;已更新 1 行。SQL> select * from emp_log;WHO WHEN------------------------------ -------------ACTION--------------------------------------------SCOTT 26-10月-15SCOTT 26-10月-15UPDATE
2.行级触发器
举个栗子:
(1)创建一个测试表foo以及随同使用的序列,序列的作用是生成一组排序数。
SQL> create table foo(sid number,sname varchar2(20));表已创建。SQL> create sequence seq_foo;序列已创建。(2)创建生成主键的行级触发器。
SQL> create or replace trigger foo_trigger 2 before insert or update of sid 3 on foo 4 for each row 5 begin 6 if inserting then 7 select seq_foo.nextval 8 into :new.sid 9 from dual; 10 else 11 raise_application_error(-20020,'不允许更新ID值!'); 12 end if; 13 end; 14 /触发器已创建
(3)向foo表中插入两条数据,测试触发器能否正常运行。
SQL> insert into foo(sid,sname) 2 values(1,'董鹏');已创建 1 行。SQL> insert into foo(sid,sname) 2 values(1,'刘丽');已创建 1 行。SQL> select * from foo; SID SNAME---------- -------------------- 1 董鹏 2 刘丽以上可以看出,无论是否提供sid值,sid都会使用seq_foo.nextval的值。
3.instead of触发器
前提这个触发器是定义在视图上的。举个栗子吗?(1)创建一个视图,显示雇员的基本信息和所在部门的名称。
SQL> connect sys/oracle as sysdba已连接。SQL> grant create view to scott;授权成功。SQL> connect scott/sunshumin已连接。SQL> create view emp_dep_view 2 as select empno,ename,job,sal,dname 3 from emp,dept 4 where emp.deptno=dept.deptno;视图已创建。(2)如果视图向表中添加记录,则由于视图引用了两个表,添加记录失败。
SQL> insert into emp_dep_view(empno,ename,job,sal,dname) 2 values(8000,'董鹏','MANAGER',1500,'SALES');insert into emp_dep_view(empno,ename,job,sal,dname) *第 1 行出现错误:ORA-01776: 无法通过联接视图修改多个基表(3)为视图创建一个instead of触发器。
SQL> create or replace trigger insert_emp_deb_trigger 2 instead of 3 insert on emp_dep_view 4 for each row 5 declare 6 var_deptno emp.deptno%type; 7 begin 8 insert into emp(empno,ename,job,sal) 9 values(:new.empno,:new.ename,:new.job,:new.sal); 10 11 select deptno 12 into var_deptno 13 from dept 14 where dname=:new.dname; 15 16 update emp 17 set deptno=var_deptno 18 where empno=:new.empno; 19 end insert_emp_deb_trigger; 20 /触发器已创建
(4)使用同样的语句测试触发器。
0 0
- oracle课堂收录-触发器
- oracle课堂收录-参数
- oracle课堂收录-默认值
- oracle课堂收录-存储过程
- oracle课堂收录-函数举例
- oracle课堂收录-过程中的事务处理
- oracle 触发器
- Oracle触发器
- Oracle触发器
- oracle触发器
- ORACLE触发器
- oracle触发器
- Oracle 触发器
- oracle触发器
- Oracle触发器
- Oracle 触发器
- Oracle 触发器
- Oracle 触发器
- 小随记
- Your project contains error(s),please fix them before running your application
- 对java类override的探讨
- 数字签名的加密解密过程 和 私有密钥的加密解密过程
- 深入理解Canvas Scaler
- oracle课堂收录-触发器
- Storyboard doesn't contain a view controller with identifier 'UIViewController'
- ps 笔记
- linux——read指令
- 在Javascript面向对象设计一
- MFC中使用opencv获取海康摄像头视频
- 10月24日与10月25日笔记题
- [iOS]Status bar hidden
- 【Android成长之路】最常用和最难用的控件——ListView的浅谈(提升ListView 的运行效率)