触发器二(DML触发器)(学习笔记)
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触发器)(学习笔记)的更多相关文章
- SQL语句(二十一)—— 触发器(DML触发器)
触发器 一 .触发器概述(特殊的存储过程) 定义: 在修改指定表值的数据时执行的 存储过程. 不同的是 : 执行存储过程要使用EXEC语句来调用,而触发器的执行不需要使用EXEC语句来调用. 作用: ...
- 基于【 MySql 】二 || mysql详细学习笔记
mysql重点学习笔记 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysql ...
- (二)MySQL学习笔记
1.视图 视图是一系列select语句返回的可视化结果集,是一张虚拟表.更多介绍请查看http://tool.oschina.net/apidocs/apidoc?api=mysql-5.1-zh 视 ...
- web前端学习(二)html学习笔记部分(11)-- 没有标号记录的知识合集
这一部分内容相对比较简单,就不按规矩排序了.(主要是网站上也没有这一部分内容的排序) 1. html5的 非主体结构元素 学习笔记(1)里面记录过. 2. html5表单提交和PHP环境搭建 1. ...
- Joomla 二次开发 学习笔记
Joomla目录结构 /administrator 管理后台的路径 /cache 是缓存目录 /components 是组件(component)目录 /includes 是一个重要的目录,里面都是J ...
- python生成个性二维码学习笔记
在linux环境下进行编码 1.先进家目录,自行创建Code文件夹 cd Code 2.下载MyQR库 sudo pip3 install MyQR 3.下载所需资源文件并解压 Code/ $ wge ...
- spss C# 二次开发 学习笔记(三)——Spss .Net 开发
Spss .Net 二次开发的学习过程暂停了一段时间,今天开始重启. 之前脑残的不得了,本想从网上下载一个Spss的安装包,然后安装学习.于是百度搜索Spss,在百度搜索框的列表中看到Spss17.S ...
- spss C# 二次开发 学习笔记(一)——配置数据源
由于项目的需要,使用Spss进行数据统计分析. Spss对于数据统计分析的功能有多强主要是客户关注的事情,我所主要关注的是,Spss的二次开发有多复杂. 学习的基本思路是: (1)首先了解统计基本知识 ...
- (二)Oracle学习笔记—— 序列
1. 序列简介 序列作为数据库里的对象,可以将序列值装入内存以提高访问效率,主要作用是生成唯一的主键值.其作用相当于一个计数器,它并不会与特定的表关联.通过创建Oracle序列和触发器实现表的主键自增 ...
随机推荐
- hibernate核心配置
# hibernate核心配置 注意: - hibernate.cfg.xml默认放在src目录下(这样可以自动加载该文件) - 必须配置的参数: * 数据库的四大参数和方言 - 可选配置的参 ...
- PowerDesigner设置唯一约束/唯一索引/唯一键
注意:还需要设置unique约束,也是在这个界面. 参考: https://blog.csdn.net/cnham/article/details/6676650 https://blog.csdn. ...
- Windows Performance Toolkit
http://bigasp.com/archives/606 https://randomascii.wordpress.com/category/xperf/ ADK 8.0 (C:\Progra ...
- inux下查看.so和可执行文件是否debug编译的方法
命令 readelf -S libxxx.so |grep debug 如果有打印信息就是debug,否则是release.
- MVC文件上传03-使用Request.Files上传多个文件
本篇体验在控制器方法中使用controllerContext.HttpContext.Request.Files上传多个文件.兄弟篇为: MVC文件上传01-使用jquery异步上传并客户端验证类型和 ...
- mORMot
mORMot GITHUB: https://github.com/synopse/mORMot Synopse mORMot framework An Open Source Client-Serv ...
- .net上开发winform
c++用WinForm做界面的实现 因为笔者是以前是做C#的,对Winform情有独钟,最近想转C++,想把以前的一些Delphi转成c++,MFC我不熟而且用起来相当烦效果又丑,GTK图形库用起来太 ...
- jquery 根据name获取元素的问题
我要获取name属性为test的元素 但是这个test是赋值给变量的 如var name='test'; 即要获取name属性为变量name的元素 请问jquery怎么写? $("input ...
- JAVA常见算法题(三十三)---求子串在字符串中出现的次数
计算某字符串中子串出现的次数. public static void main(String[] args) { String s1 = "adcdcjncdfbcdcdcd"; ...
- Top N的MapReduce程序MapReduce for Top N items
In this post we'll see how to count the top-n items of a dataset; we'll again use the flatland book ...