触发器三(行级DML触发器)(学习笔记)
行级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触发器)(学习笔记)的更多相关文章
- Oracle触发器Trigger2行级
create table trigger_t2( id int, name ), age int ); /* --创建一个before update的触发器-控制每一行,行级 --只有行级的才会有:n ...
- (三)Netty源码学习笔记之boss线程处理流程
尊重原创,转载注明出处,原文地址:http://www.cnblogs.com/cishengchongyan/p/6160194.html 本文我们将先从NioEventLoop开始来学习服务端的 ...
- 第三天:MDN CSS学习笔记
一:CSS基础 1:DOM 当浏览器显示文档时,它必须将文档的内容与其样式信息结合.它分两个阶段处理文档: 浏览器将 HTML 和 CSS 转化成 DOM (文档对象模型).DOM在计算机内存中表示文 ...
- 小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(三)Activity Indicators视图 学习笔记
当我们应用程序执行一个比较耗时的操作,我们需要给用户一个提示,那么这个提示比较好的方式方法呢就是 进度条 或者 一个齿轮转.我们就需要Activity Indicators组件 Indicato ...
- Oracle学习笔记十三 触发器
简介 触发器是当特定事件出现时自动执行的存储过程,特定事件可以是执行更新的DML语句和DDL语句,触发器不能被显式调用. 触发器的功能: 1.自动生成数据 2.自定义复杂的安全权限 3.提供审计和 ...
- (八)Oracle学习笔记—— 触发器
1. 触发器简介 触发器在数据库里以独立的对象存储,类似于过程(procedure)和函数(function),都有声明,执行和异常处理过程的PL/SQL块.它与存储过程和函数不同的是,存储过程与函数 ...
- 触发器学习笔记(:new,:old用法)
触发器学习笔记(:new,:old用法) 触发器是数据库发生某个操作时自动运行的一类的程序 用于保持数据的完整性或记录数据库操作信息方面 触发器不能够被直接调用,只能够 ...
- Oracle 学习笔记 19 -- 触发器和包浅析(PL/SQL)
触发器是存放在数据库中的一种特殊类型的子程序.不能被用户直接调用,而是当特定事件或操作发生时由系统自己主动 调用执行.触发器不能接受參数.所以执行触发器就叫做触发或点火.Oracle事件指的是数据库的 ...
- DML触发器1
数据库触发器是特殊的存储程序.通常不直接调用它们,而是由数据库的事件触发. 触发器分类: >DML触发器 >instead-of触发器 >系统事件触发器,还可以是DDL 一. DML ...
随机推荐
- hdu 4163 Stock Prices 花式排序
Stock Prices Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- ZOJ 1940 Dungeon Master 三维BFS
Dungeon Master Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Desc ...
- UIAutomator2.0初始
1. 先直接上样例,谷歌官方Demo: https://github.com/googlesamples/android-testing 2. 一句话说明改动思路 Most importantly, ...
- http://qurtyy.blog.163.com/blog/static/5744368120130221419244/
我们先来看它的思路:把控制不透明度和控向上移动的动画分别存储在两个队列中,控制向上移动的队列按默认情况进行(在2000毫秒内完成),而不透明度的控制在1000毫秒内执行,但这个队列要晚于默认队列100 ...
- php 获取开始日期与结束日期之间所有日期
话不多说,源码奉上! function getDateRange($startdate, $enddate) { $stime = strtotime($startdate); $etime = st ...
- jrebel使用
背景与愿景:开发环境下,tomcat对热布署的支持还不够全面,致使开发人员浪费大量时间在重起服务上.为了提高开发效率,决定引入Jrebel,它对热布署的支持相对比较全面.虽然Jrebel官方号称使用它 ...
- oracle数据库存储过程中NO_DATA_FOUND不起作用解决
oracle数据库存储过程中NO_DATA_FOUND不起作用 1.首先创建一个表lengzijiantest,表中只有一个字段f_id ? 1 2 3 4 5 [cpp] CREATE TABLE ...
- mysql查询null异常:attempted to return null from a method with a primitive return type
select sum(deposit_amount)from tb_commission_ib_day mysql查询时报异常: attempted to return null from a met ...
- appium+python自动化59-appium命令行参数
Appium服务器参数 许多Appium 1.5服务器参数已被弃用,以支持--default-capabilities标志. 用法: node . [flags] help 1.cmd端口输入,app ...
- T4 生成实体和简单的CRUD操作
<#@ template debug="false" hostspecific="false" language="C#" #> ...