首先创建一张表,用于保存薪资变化情况:

--创建加薪记录表
CREATE TABLE scott.raisedsalarylog
(
empno NUMBER(10) NOT NULL PRIMARY KEY, --员工编号
raiseddate DATE, --加薪日期
originalsal NUMBER(10,2), --加薪前薪资
raisedsal NUMBER(10,2) --加薪后薪资
);

创建触发器,当emp表中sal发生变化,就把变化记录到raisedsalarylog表中:

--定义触发器
CREATE OR REPLACE TRIGGER SCOTT.RAISESALARYCHANGE
--定义AFTER触发器,监测emp表的SAL列的更新
AFTER UPDATE OF SAL ON SCOTT.EMP
--定义行级触发器
FOR EACH ROW
--声明区
DECLARE
V_COUNT INT; --定义记录个数变量
BEGIN
--查询更新薪资的员工在raisesalarylog表中是否存在
SELECT COUNT(*)
INTO V_COUNT
FROM SCOTT.RAISEDSALARYLOG
WHERE EMPNO = :OLD.EMPNO;
IF V_COUNT = 0
--如果不存在,则插入新的记录
THEN
INSERT INTO SCOTT.RAISEDSALARYLOG
VALUES
(:OLD.EMPNO, SYSDATE, :OLD.SAL, :NEW.SAL);
ELSE
--如果存在,则更新记录
UPDATE SCOTT.RAISEDSALARYLOG
SET RAISEDDATE = SYSDATE,
ORIGINALSAL = :OLD.SAL,
RAISEDSAL = :NEW.SAL
WHERE EMPNO = :OLD.EMPNO;
END IF;
--如果出现错误,则打印出来
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;

验证触发器:

SQL> update emp set sal=sal*1.12 where empno=7369;

1 row updated

SQL> select * from scott.raisedsalarylog;

      EMPNO RAISEDDATE   ORIGINALSAL    RAISEDSAL
----------- ----------- ------------ ------------
7369 2017/8/15 1 800.00 896.00

The End!

2017-08-15

【PL/SQL】触发器示例:记录加薪的更多相关文章

  1. Oracle数据库之PL/SQL触发器

    Oracle数据库之PL/SQL触发器 1. 介绍 触发器(trigger)是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是 ...

  2. ORACLE数据库之PL/SQL触发器、rownum、动态SQL、数据库之视图与索引

    WHEN子句说明触发约束条件.Condition为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL函数.WHEN子句指定的触发约束条件只能用在BEFORE和AFTER行 ...

  3. PL/SQL 触发器简介

    与公司同事交流了一下,得知触发器很少用.性能是一方面,主要是如果用太多触发器,可能到时你都不知道会有什么操作自动发生. 有些操作可以在程序中控制.例如在插入某个表时,写个log表的记录.这可以用触发器 ...

  4. ORACLE PL/SQL:触发器

    ORACLE PL/SQL 触发器 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8 ...

  5. PL/SQL学习笔记之记录

    一:记录 记录是一种高可以容纳不同数据类型的数据的数据结构. PL/SQL可以处理记录的以下几种类型: 基于数据表 基于游标的记录 用户自定义的记录 二:使用 %ROWTYPE属性 创建基于表格或基于 ...

  6. Oracle实战笔记(第六天)之PL/SQL基础

    一.PL/SQL介绍 1.概念 PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/SQL是Oracle数据库对SQL语句的扩展.在普通SQL语 ...

  7. Oracle PL/SQL中如何使用%TYPE和%ROWTYPE

    1. 使用%TYPE 在许多情况下,PL/SQL变量可以用来存储在数据库表中的数据.在这种情况下,变量应该拥有与表列相同的类型.例如,students表的first_name列的类型为VARCHAR2 ...

  8. oracle pl/sql 程序设计 历史笔记整理

    20131016 周三 oracle pl/sql 程序设计 第2章 创建并运行pl/sql代码 sqlplus yjkhecc/yjkhecc@10.85.23.92:1521/orcl 在java ...

  9. PL/sql语法单元

    1.字符集 PL/SQL的字符集包括: 所有大小写字母:包括A~Z和a~z. 数字:包括0~9. 空白字符:包括制表符.空格和回车符 其他常用英文符号 2.标识符 标识符用于定义PL/sql变量.常量 ...

  10. PL/SQL学习(三)游标

    原文参考:http://plsql-tutorial.com/ 两种类型:     隐式:         执行INSERT.UPDATE.DELETE 或者只返回一条结果的SELECT语句时默认创建 ...

随机推荐

  1. [bzoj2038][2009国家集训队]小Z的袜子(hose)_莫队

    小Z的袜子 hose 2009-国家集训队 bzoj-2038 题目大意:给定一个n个袜子的序列,每个袜子有一个颜色.m次询问:每次询问一段区间中每种颜色袜子个数的平方和. 注释:$1\le n,m\ ...

  2. Android GIS开发系列-- 入门季(1) 起点

    前言 这个系列,待最终完成更新,大家体谅点,第一版本全部是参考的网络教程,最近会逐步的细化更新为可以直接使用的情况. 本系列的开发基于AS (  Android Studio ), 和ArcGIS 的 ...

  3. ExtJs--09--javascript对象的方法的3种写法 prototype通过原型设置方法效率最好

    /** * javascript对象的方法的3种写法 推荐第三种 运行效率最好 */ function P(name , age){ this.name = name ; this.age = age ...

  4. express 不是内部或外部命令(windows)解决方式

    请环境变量设置 注意 "D:\soft\nodejs\"这个是笔者自己安装在电脑上的node js文件夹,请改动成自己的 假设安装的express是4.X就要安装 express- ...

  5. Oracle,mysql,sqlserver,postgresql语句几点比較

    1.分页 Oracle: SELECT * FROM(SELECT A.*, ROWNUM RN FROM (select T.* from sj_receiptinfo t WHERE t.TAXN ...

  6. unique(V.begin(),V.end())

    unique(V.begin(),V.end()) 重排容器算法:sort,unique unique  返回指向不重复区域之后一个位置的迭代器 ///删除vstr中重复的元素 void delete ...

  7. 8.3 TCPIP协议族

    接下来我们要学习的内容是TCP/IP协议族.TCP/IP协议族在网络系统中是非常重要的.这一个协议族当中牵涉到许许多多的我们平常所用到的协议.TCP/IP呢它也有分层模型.然后我们讲到的就是三方面的内 ...

  8. ubuntu下如何查看和设置分辨率 (转载)

    转自:http://blog.csdn.net/jcgu/article/details/8650423 在ubuntu下可以使用xrandr来设置自己需要的分辨率.大致步骤如下: 1.使用xrand ...

  9. ural 1009. K-based Numbers(简单dp)

    http://acm.timus.ru/problem.aspx?space=1&num=1009 题意:将一个n位数转化为合法的K进制数,有多少种情况.合法的K进制数即不含前导0,且任意两个 ...

  10. php phppowerpoint

    今天早上从订阅的 Zend DevZone 看到篇很有意思的文章. Creating PowerPoint 2007 files using PHP. 试了一下. 果然很又意思, 分享给大家吧. 程序 ...