行级DML触发器

每当一条记录出现更新操作时进行触发操作定义时要定义FOR EACH ROW

使用":old.字段"和":new.字段"标识符

No. 触发语句  :old字段 :new字段
1 INSERT  未定义,字段内容为NULL INSERT操作结束后,为增加数据值
2 UPDATE 更新数据前的原始值 UPDATE操作之后,更新数据后的新值
3 DELETE 删除前的原始值 未定义,字段内容均为NULL

":old.字段"和":new.字段只对行级触发有效,如果触发器没有定义FOR EACH RO则无效而报语法错误

示例一、增加员工信息时,其职位必须在已经职位内选择,并且工资不能超过5000,入职日期为当前日期

--创建触发器
create or replace trigger myempinsert
before insert on myemp
for each ROW declare
v_date DATE;
v_jobcount NUMBER;
BEGIN
SELECT COUNT(empno) INTO v_jobcount FROM myemp WHERE:new.job IN(SELECT DISTINCT job FROM myemp);
IF v_jobcount=0 THEN --没有找到此职位
raise_application_error(-20009,'职位错误');
ELSE
IF :new.Sal>5000 THEN
raise_application_error(-20003,'工资不能超过5000');
END IF;
END IF;
:new.Hiredate:=SYSDATE;
end myempinsert;
--调用执行
DECLARE
BEGIN
--添加错误信息
INSERT INTO myemp(empno,ename,job,mgr,sal,deptno)VALUES(9999,'Bdqn','MNAGER',7788,8000,10);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
END;

示例二、myemp工资涨幅不能超过10%

--创建触发器
CREATE OR REPLACE TRIGGER MYEMPADDSAL_TRIGGER
BEFORE UPDATE ON MYEMP
FOR EACH ROW
DECLARE BEGIN
IF ABS((:NEW.SAL - :OLD.SAL) / :OLD.SAL) > 0.1 THEN
raise_application_error(-20005,'工资最大涨幅不能超过10%');
END IF; END MYEMPADDSAL_TRIGGER; --调用
DECLARE
BEGIN
--添加错误信息
--INSERT INTO myemp(empno,ename,job,mgr,sal,deptno)VALUES(9999,'Bdqn','MNAGER',7788,8000,10);
UPDATE myemp SET sal=3000 WHERE empno=7369;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
END;
 
 

示例三、使用序列

--创建表
CREATE TABLE mt(
ID NUMBER,
NAME VARCHAR2(30),
address varchar2(50),
CONSTRAINT pd_mtid PRIMARY KEY(ID)
);
SELECT * FROM mt;
--创建序列
CREATE SEQUENCE mt_se;
--创建触发器
create or replace trigger mt_trigger
before insert on mt
for each row
declare
-- local variables here
begin
SELECT mt_se.NEXTVAL INTO :new.id FROM dual;
end mt_trigger;
--插入数据
INSERT INTO mt(name,address)VALUES('张三','深圳');
INSERT INTO mt(name,address)VALUES('李四','深圳');
SELECT * FROM mt;
--发现ID自动增加

12c自动序列

 

oracle12C中可以用以下写法:更直观

--创建表
CREATE TABLE mt(
ID NUMBER,
NAME VARCHAR2(30),
address varchar2(50),
CONSTRAINT pd_mtid PRIMARY KEY(ID)
);
CREATE TABLE mtme AS SELECT * FROM mt WHERE 1=2;
SELECT * FROM mt;
SELECT * FROM mtme;
--创建序列
CREATE SEQUENCE mt_se;
--创建触发器
create or replace trigger mtme
before insert on mtme
for each row
declare BEGIN
DELETE mtme;
INSERT INTO mt(id,name,address)VALUES(mt_se.nextval,:NEW.NAME,:NEW.ADDRESS);
end mtme; --插入数据
INSERT INTO mt(name,address)VALUES('张三','深圳');
INSERT INTO mt(name,address)VALUES('李四','深圳');

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

  1. Oracle触发器Trigger2行级

    create table trigger_t2( id int, name ), age int ); /* --创建一个before update的触发器-控制每一行,行级 --只有行级的才会有:n ...

  2. (三)Netty源码学习笔记之boss线程处理流程

    尊重原创,转载注明出处,原文地址:http://www.cnblogs.com/cishengchongyan/p/6160194.html  本文我们将先从NioEventLoop开始来学习服务端的 ...

  3. 第三天:MDN CSS学习笔记

    一:CSS基础 1:DOM 当浏览器显示文档时,它必须将文档的内容与其样式信息结合.它分两个阶段处理文档: 浏览器将 HTML 和 CSS 转化成 DOM (文档对象模型).DOM在计算机内存中表示文 ...

  4. 小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(三)Activity Indicators视图 学习笔记

    当我们应用程序执行一个比较耗时的操作,我们需要给用户一个提示,那么这个提示比较好的方式方法呢就是  进度条  或者  一个齿轮转.我们就需要Activity Indicators组件 Indicato ...

  5. Oracle学习笔记十三 触发器

    简介 触发器是当特定事件出现时自动执行的存储过程,特定事件可以是执行更新的DML语句和DDL语句,触发器不能被显式调用.   触发器的功能: 1.自动生成数据 2.自定义复杂的安全权限 3.提供审计和 ...

  6. (八)Oracle学习笔记—— 触发器

    1. 触发器简介 触发器在数据库里以独立的对象存储,类似于过程(procedure)和函数(function),都有声明,执行和异常处理过程的PL/SQL块.它与存储过程和函数不同的是,存储过程与函数 ...

  7. 触发器学习笔记(:new,:old用法)

    触发器学习笔记(:new,:old用法) 触发器是数据库发生某个操作时自动运行的一类的程序         用于保持数据的完整性或记录数据库操作信息方面         触发器不能够被直接调用,只能够 ...

  8. Oracle 学习笔记 19 -- 触发器和包浅析(PL/SQL)

    触发器是存放在数据库中的一种特殊类型的子程序.不能被用户直接调用,而是当特定事件或操作发生时由系统自己主动 调用执行.触发器不能接受參数.所以执行触发器就叫做触发或点火.Oracle事件指的是数据库的 ...

  9. DML触发器1

    数据库触发器是特殊的存储程序.通常不直接调用它们,而是由数据库的事件触发. 触发器分类: >DML触发器 >instead-of触发器 >系统事件触发器,还可以是DDL 一. DML ...

随机推荐

  1. Codeforces Round #260 (Div. 2) B. Fedya and Maths

    B. Fedya and Maths time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  2. centos7安装apache 新手入门 图文教程

    操作系统 64位CentOS Linux release 7.2.1511 (Core) 下载apache相关软件 1.apr和apr-util,下载地址: http://apr.apache.org ...

  3. hadoop学习;Streaming,aggregate;combiner

    hadoop streaming同意我们使用不论什么可运行脚本来处理按行组织的数据流,数据取自UNIX的标准输入STDIN,并输出到STDOUT 我们能够用 linux命令管道查看文本有多少行,cat ...

  4. JTAG Pinouts

    http://www.jtagtest.com/pinouts/ Pinouts ARM-20 (used with almost all ARM-based microcontrollers) AR ...

  5. mysql 源代码讲解

    http://www.zhdba.com/mysqlops/category/mysql-source-code/

  6. java基础学习总结——static关键字

    一.static关键字

  7. 怎样用Java代码来把SSL的证书自己主动导入到Java的秘钥存储文件(keystore)

    我们在开发或者使用SSL的过程中,非常多的软件须要我们提供java的keystore.特别是一些基于Java的中间件产品. 我们常规的做法是JDK自带的工具命令(keytool)去做.比方,以下的样例 ...

  8. 清理IIS Express上的网站

    默认情况下,当使用Visual Studio浏览网页时,网站会被保存在IIS Express上,这些网站需要手动清理.可以通过命令行或界面进行清理. □ 通过命令行 →找到appcmd.exe在C:\ ...

  9. java 内存溢出 栈溢出的原因与排查方法

     1. 内存溢出的原因是什么?        内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出.如果出现这种现象可行代码排查: 一)是否App中的类中和引用变量过多使用了 ...

  10. duplicate symbol _main in: / linker command failed with exit code 1

    duplicate symbol _main in: /Users/mb467/Library/Developer/Xcode/DerivedData/barChartDemo-gevlnavnpan ...