数据库学习13-触发器

来源:互联网 发布:手机视频恢复软件 编辑:程序博客网 时间:2024/06/02 03:27
触发器
  1.触发器是什么?与过程和函数的不同(事件触发)
     触发器是一种特殊的存储过程;
  2.分类
    2.1 DML级
       2.1.1 行级
       2.1.2 语句级
       2.1.3 instead of触发器
           a 只能被创建在视图上,并且该视图没有指定WITH CHECK OPTION选项。


           b 不能指定BEFORE 或 AFTER选项。


           c FOR EACH ROW子句是可选的,即INSTEAD OF触发器只能在行级上触发、或只能是行级触发器,没有必要指定。


           d 没有必要在针对一个表的视图上创建INSTEAD OF触发器,只要创建DML触发器就可以了。 


              
    2.2 DDL级
    2.3 数据库级
   注:一个表最多12个触发器(12类),同一时间,同一事件,同一类型的触发器只能有一个;触发器影响表的dml操作效率;触发器最大32k;


--当删除员工时,移到历史员工 (也可以调用存储过程)
--当操作部门表或员工表时判断是否是平时的上班时间
--部门30中的员工薪水和奖金不能降,员工不能离职

/*1.定义一个函数,输入员工编号, 返回emp表中员工的工作年限;*/CREATE OR REPLACE   FUNCTION fun_gethire(e_id NUMBER) RETURN NUMBERIS  h DATE;BEGIN  SELECT hiredate INTO h FROM emp      WHERE empno= e_id;  RETURN trunc((SYSDATE-h)/365,2);EXCEPTION   WHEN OTHERS THEN    raise_application_error(-20111,'fun_gethire函数出错了');END fun_gethire;SELECT fun_gethire('7839') FROM dual;/*2.定义一个过程,完成插入dept表数据时,同时插入emp表数据,并通过out参 数接收新的部门id;*/CREATE OR REPLACE   PROCEDURE pro_a(d_id OUT dept.deptno%TYPE)ISBEGIN  SELECT (MAX(deptno)+10) INTO d_id FROM dept;  INSERT INTO dept(deptno,dname)     VALUES(d_id,'新部门');  INSERT INTO emp(empno,ename,deptno)     VALUES(8888,'test',d_id);    COMMIT;END pro_a;DECLARE  a NUMBER;BEGIN  pro_a(a);  dbms_output.put_line('新部门id:'||a);END;SELECT * FROM emp,dept  WHERE emp.deptno=dept.deptno    AND emp.deptno=50;




   
0 0
原创粉丝点击