触发器
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.触发器是什么?与过程和函数的不同(事件触发)
触发器是一种特殊的存储过程;
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 NUMBER
IS
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)
IS
BEGIN
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;