博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
触发器四(学习笔记)
阅读量:7110 次
发布时间:2019-06-28

本文共 3512 字,大约阅读时间需要 11 分钟。

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 rowdeclare   begin  IF ABS((:myemp_new.sal - :myemp_old.SAL) / :myemp_old.SAL) > 0.1 THEN     raise_application_error(-20005,'工资最大涨幅不能超过10%');  END IF;end myempaddsal_trigger;

使用WHEN子句定义触发条件:

在WHEN子句中也可以用":new"和":old"访问修改前后的数据,在WHEN子句中使用new和old时可以不加前面的":"号
示例一、增加员工中判断员工工资是否存在,如果工资为0则报错
--创建触发器create or replace trigger myemptestadd1  before insert on myemp    for each ROW     WHEN(new.Sal=0)declarebegin  raise_application_error(-20003,:NEW.EMPNO||'的工资为0,不合规定!');end myemptestadd1;--执行添加DECLAREBEGININSERT INTO myemp(empno,ename,job,mgr,sal,deptno)VALUES(9999,'Bdqn','MNAGER',7788,0,10);EXCEPTION  WHEN OTHERS THEN    dbms_output.put_line(SQLERRM);END;--结果ORA-20003: 9999的工资为0,不合规定!ORA-06512: 在 "TESTS.MYEMPTESTADD1", line 4ORA-04088: 触发器 'TESTS.MYEMPTESTADD1' 执行过程中出错

示例二、要求工资只能涨不能降

--创建触发器create or replace trigger myemptestadd1  before UPDATE on myemp    for each ROW     WHEN(new.Sal

触发器谓词:

 

在触发器定义中专门提供了三个触发器谓词:INSERTING、UPDATING、DELETING
 
No. 触发器谓词 描述
1 INSERTING 如果触发语句为INSERT,返回TRUE,否则返回FALSE
2 UPDATING 如果触发语句为UPDATE,返回TRUE,否则返回FALSE
3 DELETING 如果触发语句为DELETE,返回TRUE,否则返回FALSE
 

 

示例三、使用日志表deptlog表记录相关操作dept表

-创建deptlog表CREATE TABLE deptlog(             logid        NUMBER,             TYPE        VARCHAR2(20)       NOT NULL,             deptno       NUMBER(2),             logdate      DATE,             dname        Varchar2(14)      NOT NULL,             loc          Varchar2(13)      NOT NULL,             CONSTRAINT pk_logid PRIMARY KEY(logid));--创建序列CREATE SEQUENCE deptlog_seq;--创建触发器create or replace trigger dept_trigger  before INSERT OR UPDATE OR DELETE on dept    for each rowdeclare BEGIN   IF inserting THEN     INSERT INTO deptlog(logid,type,deptno,logdate,dname,loc)     VALUES(deptlog_seq.nextval,'insert',:new.Deptno,SYSDATE,:NEW.DNAME,:new.Loc);   ELSIF updating THEN       INSERT INTO deptlog(logid,type,deptno,logdate,dname,loc)     VALUES(deptlog_seq.nextval,'update',:new.Deptno,SYSDATE,:NEW.DNAME,:new.Loc);   ELSIF deleting THEN         INSERT INTO deptlog(logid,type,deptno,logdate,dname,loc)     VALUES(deptlog_seq.nextval,'delete',:old.Deptno,SYSDATE,:old.DNAME,:old.Loc);   END IF;  end dept_trigger;--测试数据INSERT INTO dept(deptno,dname,loc)VALUES(87,'测试','SZ');INSERT INTO dept(deptno,dname,loc)VALUES(43,'公关','SZ');UPDATE dept SET dname='拓展部' WHERE deptno=66;DELETE FROM dept WHERE deptno=87;commit;--查询SELECT * FROM dept;--查询表SELECT * FROM deptlog;

使用FOLLOWS子句

为一个表创建了多个触发器,在触发时,是不会按照用户希望的顺序执行触发的,

在FOR EACH ROW后增加FOLLOWS 触发器1名称,表示在 触发器1后触发

 

--创建3个相同的触发器--触发器1create or replace trigger dept1  before INSERT OR UPDATE OR DELETE on dept    for each rowdeclare  begin  dbms_output.put_line('执行第1个触发器 dept1');end dept1;--触发器2create or replace trigger dept2  before INSERT OR UPDATE OR DELETE on dept    for each ROW  follows dept1declare  begin  dbms_output.put_line('执行第2个触发器 dept2');end dept1;--触发器3create or replace trigger dept3  before INSERT OR UPDATE OR DELETE on dept    for each ROW    follows dept2declare  begin  dbms_output.put_line('执行第3个触发器 dept3');end dept1;

 

执行更新,删除,添加操作

INSERT INTO dept(deptno,dname,loc)VALUES(87,'测试','SZ');INSERT INTO dept(deptno,dname,loc)VALUES(43,'公关','SZ');UPDATE dept SET dname='拓展部' WHERE deptno=66;DELETE FROM dept WHERE deptno=87;

结果:

执行第1个触发器 dept1执行第2个触发器 dept2执行第3个触发器 dept3

按指定顺序触发

 

 

转载地址:http://uslhl.baihongyu.com/

你可能感兴趣的文章
Flash Builder4.6 无法启动,并且报 Failed to create the Java Virtual Machine(1-不行的话可以参考下2)...
查看>>
责任链模式
查看>>
select 下的option删除,复制,修改
查看>>
QML与c++交互学习笔记(八) qt c++直接调用QML中的函数, 直接设置属性
查看>>
QT VS配置UNICODE问题
查看>>
Web基础知识和技术
查看>>
各种操作系统
查看>>
Angularjs调用公共方法与共享数据
查看>>
Unix/Linux环境C编程新手教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建
查看>>
[原创]LoadRunner 12.02 录制脚本时提示无Internet访问,如何解决?
查看>>
【转】2012年6月26 – 盛大PHP工程师最新面试题
查看>>
ubuntu:undefined reference to `snd_pcm_open'
查看>>
undefined reference to libiconv_open ext/iconv/.libs/iconv.o by install phpsource
查看>>
Jquery使容器自适应浏览器窗口
查看>>
Tensorflow学习笔记——安装和运行
查看>>
《JavaScript》——DOM
查看>>
【ios开发学习 - 第二课】iOS项目文件夹结构
查看>>
【基础练习】【线性DP】codevs3027 线段覆盖2题解
查看>>
Session分布式共享 = Session + Redis + Nginx
查看>>
ES6中的迭代器(Iterator)和生成器(Generator)(二)
查看>>