DML触发器(语句触发器)

由DML语句进行触发,当用户执行了INSERT,UPDATE,DELETE操作时就会触发操作

示例一、只有在每个月的10日才允许办理,新员工入职与离职,其他时间不允许增加和删除员工数据

--建立表
CREATE TABLE myemp AS SELECT * FROM emp;
--创建触发器
create or replace trigger changemyemp_trigger
before INSERT OR DELETE on myemp
declare
v_curdate Varchar2(20);
BEGIN
SELECT to_char(SYSDATE,'dd') INTO v_curdate FROM dual;
IF trim(v_curdate)<>'' THEN
Raise_application_error(-20003,'在每个月的10号才允许办理入职和离职手续');
END IF;
end changemyemp_trigger;
--向表中增加或者删除数据
DECLARE
BEGIN
-- INSERT INTO myemp(empno,ename,job,mgr,hiredate,sal,comm,deptno)VALUES(8888,'Test','CLERK',7369,SYSDATE,8000,NULL,10);
DELETE FROM myemp WHERE empno=7369;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
END;

如果日期不对会提示:

ORA-20003: 在每个月的10号才允许办理入职和离职手续

示例二、周末及每天下班时间(每天9:00以前,18:00以后)不允许更新myemp表

-创建触发器
create or replace trigger changemyemp_trigger
before INSERT OR DELETE on myemp declare
v_curhour Varchar2(20);
v_week VARCHAR2(20);
BEGIN
SELECT to_char(SYSDATE,'day'),to_char(SYSDATE,'hh24') INTO v_week,v_curhour FROM dual;
IF trim(v_week) IN('星期六','星期日') THEN
Raise_application_error(-20003,'周末不允许更新myemp表');
ELSIF TRIM(v_curhour)<''OR TRIM(v_curhour)>'' THEN
Raise_application_error(-20004,'在下班时间不允许更新myemp表');
END IF;
end changemyemp_trigger;
--向表中增加或者删除数据
DECLARE
BEGIN
-- INSERT INTO myemp(empno,ename,job,mgr,hiredate,sal,comm,deptno)VALUES(8888,'Test','CLERK',7369,SYSDATE,8000,NULL,10);
DELETE FROM myemp WHERE empno=7369;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
END;

结果如果是周末:

ORA-20003: 周末不允许更新myemp表
ORA-06512: 在 "TESTS.CHANGEMYEMP_TRIGGER", line 7
ORA-04088: 触发器 'TESTS.CHANGEMYEMP_TRIGGER' 执行过程中出错

平时下班时间:

ORA-20004: 在下班时间不允许更新myemp表
ORA-06512: 在 "TESTS.CHANGEMYEMP_TRIGGER", line 9
ORA-04088: 触发器 'TESTS.CHANGEMYEMP_TRIGGER' 执行过程中出错

示例三、每一个员工都在根基本工资收入缴税,2000以下3%,2000~5000,8%,5000以上10%,要求建立一张新的表来存放,员工编号,姓名,工资佣金,上缴的税,并且每次在修改员工表中的SAL和COMM字段后自动更新记录

-创建myemp_tax表
CREATE TABLE myemp_tax(
empno NUMBER(4),
ename VARCHAR2(10),
sal NUMBER(7,2),
comm NUMBER(7,2),
tax NUMBER(7,2),
CONSTRAINT pk_myempno PRIMARY KEY(empno),
CONSTRAINT fk_myempno FOREIGN KEY(empno) REFERENCES myemp(empno) ON DELETE CASCADE
);
--创建触发器
create or replace trigger myemp_out
after INSERT OR UPDATE OR DELETE on myemp declare
PRAGMA AUTONOMOUS_TRANSACTION; --触发器自主事务
CURSOR cur_myemp IS SELECT * FROM myemp; --定义游标找到每行的记录
v_sal myemp.sal%TYPE; --定义变量计算收入
v_myemptax myemp_tax.tax%TYPE; --税收
v_myemp myemp%ROWTYPE;
BEGIN
DELETE FROM myemp_tax; --清空myemp_tax表;
FOR v_myemp IN cur_myemp LOOP
v_sal:=v_myemp.sal+nvl(v_myemp.comm,0); --计算总工资
IF v_sal<2000 THEN
v_myemptax:=v_sal*0.03; --上缴税3%
ELSIF v_sal BETWEEN 2000 AND 5000 THEN
v_myemptax:=v_sal*0.08; --上缴税8%
ELSIF v_sal>5000 THEN
v_myemptax:=v_sal*0.1; --上缴税10%
END IF;
INSERT INTO myemp_tax(empno,ename,sal,comm,tax)
VALUES(v_myemp.empno,v_myemp.ename,v_myemp.sal,v_myemp.comm,v_myemptax);
END LOOP;
COMMIT;
end myemp_out;
--向myemp表中增加一条的记录,然后查询myemp_tax表
INSERT INTO myemp(empno,ename,job,mgr,hiredate,sal,comm,deptno)VALUES(8898,'Test','CLERK',7369,SYSDATE,800,100,10);
SELECT * FROM myemp_tax;

触发器二(DML触发器)(学习笔记)的更多相关文章

  1. SQL语句(二十一)—— 触发器(DML触发器)

    触发器 一 .触发器概述(特殊的存储过程) 定义: 在修改指定表值的数据时执行的 存储过程. 不同的是 : 执行存储过程要使用EXEC语句来调用,而触发器的执行不需要使用EXEC语句来调用. 作用: ...

  2. 基于【 MySql 】二 || mysql详细学习笔记

    mysql重点学习笔记 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysql ...

  3. (二)MySQL学习笔记

    1.视图 视图是一系列select语句返回的可视化结果集,是一张虚拟表.更多介绍请查看http://tool.oschina.net/apidocs/apidoc?api=mysql-5.1-zh 视 ...

  4. web前端学习(二)html学习笔记部分(11)-- 没有标号记录的知识合集

    这一部分内容相对比较简单,就不按规矩排序了.(主要是网站上也没有这一部分内容的排序) 1.  html5的 非主体结构元素 学习笔记(1)里面记录过. 2.  html5表单提交和PHP环境搭建 1. ...

  5. Joomla 二次开发 学习笔记

    Joomla目录结构 /administrator 管理后台的路径 /cache 是缓存目录 /components 是组件(component)目录 /includes 是一个重要的目录,里面都是J ...

  6. python生成个性二维码学习笔记

    在linux环境下进行编码 1.先进家目录,自行创建Code文件夹 cd Code 2.下载MyQR库 sudo pip3 install MyQR 3.下载所需资源文件并解压 Code/ $ wge ...

  7. spss C# 二次开发 学习笔记(三)——Spss .Net 开发

    Spss .Net 二次开发的学习过程暂停了一段时间,今天开始重启. 之前脑残的不得了,本想从网上下载一个Spss的安装包,然后安装学习.于是百度搜索Spss,在百度搜索框的列表中看到Spss17.S ...

  8. spss C# 二次开发 学习笔记(一)——配置数据源

    由于项目的需要,使用Spss进行数据统计分析. Spss对于数据统计分析的功能有多强主要是客户关注的事情,我所主要关注的是,Spss的二次开发有多复杂. 学习的基本思路是: (1)首先了解统计基本知识 ...

  9. (二)Oracle学习笔记—— 序列

    1. 序列简介 序列作为数据库里的对象,可以将序列值装入内存以提高访问效率,主要作用是生成唯一的主键值.其作用相当于一个计数器,它并不会与特定的表关联.通过创建Oracle序列和触发器实现表的主键自增 ...

随机推荐

  1. jsoncpp 0.5 ARM移植

    1.下载jsonapp 0.5 https://github.com/open-source-parsers/jsoncpp 2.编译 platform 没有包含 arm 平台,需要把源码提取出来,独 ...

  2. 机器学习(1):Logistic回归原理及其实现

    Logistic回归是机器学习中非常经典的一个方法,主要用于解决二分类问题,它是多分类问题softmax的基础,而softmax在深度学习中的网络后端做为常用的分类器,接下来我们将从原理和实现来阐述该 ...

  3. ROS知识(13)----基于catkin的包安装

    ROS软件包开发完成后,需要安装包,如果你用的是catkin创建的工作空间,那么即可使用命令"catkin_make install"完成此项任务.下面介绍其安装的过程: 1.源码 ...

  4. 多线程面试题-sleep()和wait()区别

    sleep(): 1 .是Thread类中的一个方法,用于线程休眠, 2 .休眠时间结束后,该线程可以自动唤醒: wait(): 1. 是Object类中的一个方法,用于线程等待, 2. 如果想要唤醒 ...

  5. JS简单实现二级联动菜单

    <form method="post" action=""> 省/市:<select id="province" onch ...

  6. cuda并行编程之求解ConjugateGradient(共轭梯度迭代)丢失dll解决方式

    在进行图像处理过程中,我们常常会用到梯度迭代求解大型线性方程组.今天在用cuda对神秘矩阵进行求解的时候.出现了缺少dll的情况: 报错例如以下图: watermark/2/text/aHR0cDov ...

  7. [Asp.net MVC]HandleErrorAttribute异常过滤器

    摘要 在asp.net mvc中除了使用try...catch/finally来处理异常外,它提供了一种通过在Controller或者Action上添加特性的方式来处理异常. HandleErrorA ...

  8. java中方法drawImage()的参数详细解释

    public abstract boolean drawImage(Image img,int x,int y,int width,int height,ImageObserver observer) ...

  9. 《mahout实战》

    <mahout实战> 基本信息 原书名:Mahout in action 作者: (美)Sean Owen    Robin Anil    Ted Dunning    Ellen Fr ...

  10. [GIt] 团队工作效率分析工具gitstats

    copy : http://www.cnblogs.com/ToDoToTry/p/4311637.html 如果你是团队领导,关心团队的开发效率和工作激情:如果你是开源软件开发者,维护者某个repo ...