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. Vue集成腾讯地图和几何库

    关于Vue中如何引入腾讯地图,百度搜索中的结果已经非常明确: /** * 腾讯地图. * @param key * @returns {Promise<any>} * @construct ...

  2. BTSync 2.0 Vs. 1.4 Folders

    Sync 2.0 supports boths new 2.0 folders and classic 1.4 folders, s o when you upgrade your Sync it w ...

  3. MVC把表格导出到Excel

    有关Model: namespace MvcApplication1.Models { public class Coach { public int Id { get; set; } public ...

  4. MVC二级联动使用$.getJSON方法

    本篇使用jQuery的$.getJSON()实现二级联动.   □ View Models 1: namespace MvcApplication1.Models 2: { 3: public cla ...

  5. vc中nmake.exe cl.exe 的使用

    首先简单介绍一下程序是如何编译链接的.程序写好之后,我们进行编译和链接来产生可执行程序.这时候,编译器为了完成编译和链接,需要知道很多信 息.比如要编译的文件是哪一个,使用哪些编译选项进行编译,编译好 ...

  6. Spring+Quartz实现文件中转站

    其实这个功能QQ邮箱就有,为什么还要自己开发一个呢?因为有的文件非常重要...其实是客户要求... 那么我们先来看一下QQ的界面: 我们设计的界面: 文件要到期了是否通知用户?这里我们支持邮件及短信方 ...

  7. C++中的public、private、protected成员继承问题

        我是C++菜鸟,刚学了一点C++. 先看例子1: /* Item.h */ #include <iostream> #include <string> class It ...

  8. 一个VLAN配置的实际例子

    背景很简单,和一般的eth-switch通过VLAN做成路由的方式一样.     首先看一种硬件效率较高的方法: Port1~4作为access口,同时在硬件上作为用户模式,即从PC发往这些端口的数据 ...

  9. 从PSD到HTML,网页的实现

    在学习完<From PSD to HTML: Building a Set of Website Designs Step by Step>之后,使我对网页的设计和实现有了更深入的认识,我 ...

  10. wtforms的简单示例

    1.先定义一个类: #!/usr/bin/env python # -*- coding: utf-8 -*- # Created by xxx on 2017/3/13 from wtforms i ...