行级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. git命令行使用帮助

    克隆代码库 git clone git_project_url 提交代码 git commit -m 'commit messge'

  2. MySQL的冷备份和热备份概念理解(转)

    一.冷备份(off, 慢, 时间点上恢复) 冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库.冷备份是将关键性文件拷贝到另外位置的一种说法.对于备份数据库信息而言,冷备 ...

  3. Polly简介 — 1. 故障处理策略

    Polly 是 .Net 下的一套瞬时故障处理及恢复的函式库,可让开发者以fluent及线程安全的方式来应用诸如Retry.Circuit Breaker.Timeout.Bulkhead Isola ...

  4. C++中使用REST操作

    REST现在是非常流行的一种接口了,但对于C++这种古董语言来说,用起来并不很方便.无论是json操作还是http交互,用起来都比较麻烦. 如果你需要在c++中使用rest操作时,不妨试一下微软的cp ...

  5. 03把IL编译成可执行文件

    1.在记事本中编写IL代码如下: .assembly HelloWorld{} .assembly extern mscorlib{}   .method public static void Mai ...

  6. MVC使用Entity Framework Code First,用漂亮表格显示1对多关系

    部门和职员是1对多关系.用一个表格列出所有部门,并且在每行显示该部门下的所有职员名称.如下: 部门和职员的Model: using System.Collections.Generic; namesp ...

  7. org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection

    org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection 这个问题困扰许久,许久 ...

  8. Linux 操作当前时间

    一.查看和修改Linux的时区 1. 查看当前时区 命令 : "date -R" 2. 修改设置Linux服务器时区 方法 A 命令 : "tzselect" ...

  9. CLR查找和加载程序集 z

    C#开发者在开发WinForm程序.Asp.Net Web(MVC)程序等,不可避免的在项目中引用许多第三方的DLL程序集, 编译后引用的dll都放在根目录下.以我个人作品 AutoProject S ...

  10. 修改后无警告全面支持non-ARC以及ARC的OpenUDID

    OpenUDID Open source initiative for a universal and persistent UDID solution for iOS. 首创的给iOS提供设备唯一标 ...