Oracle 触发器 操作 郏高阳

半城伤御伤魂 提交于 2019-12-23 18:06:10

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

1:编写一个数据库触发器以显示当任何时候雇员加薪时的情况,而薪水减少时不需要任何提示
例如:当薪水增加时,输出“薪水已增加”字样,同时输出更新前后的薪水值
CREATE OR REPLACE TRIGGER addsalnote
AFTER
UPDATE ON emp1
FOR EACH ROW
WHEN(NEW.sal>OLD.sal)
DECLARE
BEGIN
      dbms_output.put_line('薪水已增加!');
END;

2:编写一个数据库触发器,它检查某个组织中不能有2个总裁,并阻止记录的插入
分析:当我们向emp1表中增加一条数据,或者修改emp1表中的数据时,不允许job为PRESIDENT总裁。
提示:如果插入一条job为president的数据,或者修改某条记录的job为president,需要阻止DML操作,可以通过使用引发应用程序错误的方法阻止DML语句执行。
CREATE OR REPLACE TRIGGER stopjob
BEFORE
INSERT OR UPDATE ON emp1
FOR EACH ROW
WHEN(NEW.job='PRESIDENT')
DECLARE
BEGIN
      raise_application_error(-20001,'该公司已有一位总裁,操作被取消!');
END;

3:编写一个触发器,当任何时候某个部门从dept1中删除,就删除emp1表中该部门的所有雇员
CREATE OR REPLACE TRIGGER empdept
AFTER
DELETE ON dept1
FOR EACH ROW
DECLARE
BEGIN
     DELETE FROM emp1 WHERE deptno=:OLD.deptno;
END;

4:编写一个触发器,只有在每天的9:00到下午17:00之间才允许对部门表做任何操作
提示:取当前日期的24小时制方法为to_char(sysdate,'HH24')
如果在此时间范围外进行操作,则用引发应用程序错误的方法阻止DML操作的执行
CREATE OR REPLACE TRIGGER updatedept
BEFORE
INSERT OR UPDATE OR DELETE ON dept1
FOR EACH ROW
DECLARE
BEGIN
     IF to_char(SYSDATE,'HH24')<9 OR to_char(SYSDATE,'HH24')>17 THEN
     raise_application_error(-20001,'对不起,现在不在对该表的操作的时段内!');
     END IF;
END;


5:编写一个触发器,只有在每天的14:00到下午17:00之间才允许添加新员工
CREATE OR REPLACE TRIGGER addemployee
BEFORE
INSERT ON emp1
FOR EACH ROW
DECLARE
BEGIN
     IF to_char(SYSDATE,'HH24')<14 OR to_char(SYSDATE,'HH24')>17 THEN
     raise_application_error(-20033,'对不起,现在不能添加新员工');
     END IF;
END;

 

6:编写一个触发器,只有在每天的9:00到中午12:00之间才允许修改员工资料
CREATE OR REPLACE TRIGGER addemployee
BEFORE
UPDATE ON emp1
FOR EACH ROW
DECLARE
BEGIN
     IF to_char(SYSDATE,'HH24')<9 OR to_char(SYSDATE,'HH24')>12 THEN
     raise_application_error(-20033,'对不起,现在不能修改员工信息!');
     END IF;
END;

7:拷贝一张和emp表完全相同的表myemp,编写一个触发器,只能对myemp表中插入不相同的empno字段
提示:如果插入一条数据empno字段与原表中的数据相同,可以用引发应用程序错误的方法阻止DML操作执行,判断是否有相同的 empno可以用 count()函数
CREATE OR REPLACE TRIGGER stopinsert
BEFORE
INSERT ON myemp
FOR EACH ROW
DECLARE
     icount INT;
BEGIN
     SELECT COUNT(*) INTO icount FROM myemp WHERE empno=:NEW.empno;
     IF icount<>0 THEN
     raise_application_error(-20002,'该雇员编号已存在!');
     END IF;
END;


8:编写一个触发器,每增加一个员工,他的上司的工资自动增加10%,这个触发器可以执行成功么?
CREATE OR REPLACE TRIGGER addsal
BEFORE 
INSERT ON emp1
FOR EACH ROW
DECLARE
BEGIN
     UPDATE emp1 SET sal=sal*1.1 WHERE empno=:NEW.mgr;
END;


9:编写一个触发器,员工增加提成时,他的上司的提成自己增加此员工这次提成数的30%,这个触发器可以执行成功么?
CREATE view v_emp1 AS SELECT * FROM emp1;

CREATE OR REPLACE TRIGGER addcomm
INSTEAD OF
UPDATE ON v_emp
FOR EACH ROW
DECLARE
BEGIN
    IF :NEW.sal>:OLD.sal THEN
    UPDATE emp2 SET sal=:NEW.sal WHERE empno=:NEW.empno;
    UPDATE emp2 SET sal=sal+(:NEW.sal-:OLD.sal)*0.3 WHERE empno=:NEW.mgr;
    END IF;
END;


10:编写一个触发器,每开除一个员工,他的上司的工资自动降低10%,这个触发器可以执行成功么?
CREATE view v_emp1 AS SELECT * FROM emp1;

CREATE OR REPLACE TRIGGER cutsal
INSTEAD OF
DELETE ON v_emp1
FOR EACH ROW
DECLARE
BEGIN
      DELETE FROM emp1 WHERE empno=:OLD.empno;
      UPDATE emp1 SET sal=sal-sal*0.1 WHERE empno=:OLD.mgr;
END;

11.建立一个emp表与dept表的连接视图,使用触发器实现向视图插入记录.
create view v_empdept as select e.*,d.dname,d.loc from emp1 e,dept1 d where e.deptno=d.deptno;

CREATE OR REPLACE TRIGGER empdept
INSTEAD OF
INSERT ON v_empdept
FOR EACH ROW
DECLARE
     icount INT;
BEGIN
     SELECT COUNT(*) INTO icount FROM v_empdept WHERE empno=:NEW.empno;
     IF icount=0 THEN
        INSERT INTO emp1 VALUES(:NEW.empno,:NEW.ename,:NEW.job,:NEW.mgr,:NEW.hiredate,:NEW.sal,:NEW.comm,:NEW.deptno);
     ELSE
        raise_application_error(-20033,'该雇员编号已存在!');
     END IF;
    
     SELECT COUNT(*) INTO icount FROM v_empdept WHERE deptno=:NEW.deptno;
     IF icount=0 THEN
        INSERT INTO dept1 VALUES(:NEW.deptno,:NEW.dname,:NEW.loc);
     ELSE
        UPDATE dept1 SET dname=:NEW.dname,loc=:NEW.loc WHERE deptno=:NEW.deptno;
     END IF;
END;

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!