触发器三(学习笔记)

行级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(‘李四‘,‘深圳‘);
时间: 2024-10-15 23:42:44

触发器三(学习笔记)的相关文章

触发器四(学习笔记)

REFERENCING子句: 使用“:new.字段”或者是“:old.字段”标记不清,那么也可以通过REFERENCING子句为这两个标识符设置别名,例如可以将“:new”设置为:emp_new,或者将“:old”设置为:emp_old. create or replace trigger myempaddsal_trigger before update on myemp REFERENCING OLD AS myemp_old NEW AS myemp_new for each row de

触发器一(学习笔记)

语法: CREATE [ OR REPLACE ] TRIGGER trigger_name:创建一个触发器,设置名称,如果选择了OR REPLACE,则表示如果已经有这个触发器就替换 [BEFOR | AFTER]:指的是触发器的触发日间,在操作之间就BEFORC,在操作之后就AFTER触发 INSTEAD OF:替代触发器,对于视图操作所定义的触发器类型 INSERT | UPDATE | UPDATE OF列名称| DELETE,触发的事件,可以是数据表的增加INSERT,更新UPDATE

SQL server 触发器简单学习笔记

触发器属于特殊的存储过程,运行在数据库,但是不能通过调用名称调用触发器,触发器是自动响应的. 触发器也是一种事务,出错回滚. 触发器分为DDL触发器和DML触发器 1:触发对象不同: DML触发器属于表或者视图:DDL触发器属于数据库或服务器. 2:触发模式不同: DML 触发器在 Insert.Update 和 Delete 语句上操作,可以作为After 触发器 和 Instead Of 触发器. DDL 触发器对 Create.Alter.Drop 和其他 DDL 语句以及执行 DDL 式

Oracle体系结构三(学习笔记)

科目三学习笔记

考试项目: 模拟灯光-> 起步->靠边停车->左转->右转出路口->直行通过路口,公交站,左转->直行->左转->加减档->直行->掉头->超车->变更车道 注意事项: 起步==踩离合刹车,挂1档,松手刹,打左灯,按喇叭 靠边停车==打右灯,3秒后停车,空档,拉手刹,松离合 车未停不能挂空档. 转弯掉头挂1档, 红灯左转只能过2部车.

[原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

义隆单片机学习笔记之(三) 应用例程

常用寄存器: 0x01 (R1) 计时器 0x02 (R2)程序计数器 PC 0x03 (R3)状态寄存器 0x04 (R4)间址寄存器 0x05 (R5)IO PORT 5 0x06 (R6)IO PORT 6 ----- (IOC5)P5的输入输出配置 ----- (IOC6)P6的输入输出配置 0x0f (ISR,读)中断信号指示寄存器(第三位有效,分别对应于3个中断源) 0x0f (IOCF,写)中断屏蔽标志 0x0E (IOCE)(IO60作为中断输入的配置与看门狗的开关在一个寄存器中

《CSS网站布局实录》学习笔记(三)

第三章 CSS网页布局与定位 3.1 div 几乎XHTML中的任何标签都可以用于浮动与定位,而div首当其冲.对于其他标签而言,往往有它自身存在的目的,而div元素存在的目的就是为了浮动与定位. 3.1.1 div是什么 div是XHTML中制定的.专门用于布局设计的容器对象.在传统表格式布局中,之所以能够进行页面的排版布局设计,完全依赖于表格对象table.如今,接触另一种布局方式--CSS布局.div正是这种布局方式的核心对象.仅从div的使用上说,做一个简单的布局只需要依赖两样东西:di

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T>

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T> 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现和源码 下一篇用它们做一个多语言的demo 这两个是事件的订阅和广播,很强大,但用的时候要小心发生不必要的冲突. 先看一下它的实现思想 在Caliburn.Micro里EventAggregator要以单例的形式出现这样可以