- 浏览: 407068 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (158)
- SpringBoot (10)
- vue.js (4)
- 2017基础知识 (2)
- jquery (4)
- extjs (8)
- spring (13)
- Java基础 (24)
- ibatis (2)
- oracle (18)
- 服务器配置 (8)
- maven (7)
- web应用开发 (14)
- 数据库 (9)
- 第三方依赖 (3)
- 百味人生 (7)
- svn (1)
- 问题一堆 (2)
- 测试驱动开发 (1)
- webServices (2)
- 网络编程 (2)
- 其它 (4)
- hibernate (2)
- ec标签序号列 (1)
- javascript (1)
- ActiveMQ (2)
- linux (5)
- UI (1)
- 问题汇集 (1)
- redis (1)
最新评论
-
jackson200:
讲解的狠不错!谢谢!
spring注入原理 -
阳光泛滥的日子:
讲的很透彻,受教了 。
spring中注解的实现原理 -
liudechao9:
最近在研究这方面,很不错,但是多线程并发的时候可能会出问题,而 ...
spring中注解的实现原理 -
小帅1127:
厉害啊 我的哥
spring中注解的实现原理 -
phoenixpaul:
...
Oracle存储过程和程序包
1、触发器的定义?
触发器是在触发一定事件的时候隐式执行的一段sql语句,触发器不能接收参数。其中oracle事件指的是对数据库进行insert、update、delete操作或对视图进行类似的操作,还有一些系统的事件,比如数据库的关闭或开启。
2、触发器的分类?
(1)、数据操纵语言(DML)触发器:创建在表上,有DML时间来触发的触发器;
(2)、替代(instead of)触发器:创建在视图上,用来替换对视图进行添加、修改和删除操作。
(3)、数据定义语言(DDL)触发器:定义在模式上,触发事件是对数据库对象的创建和修改操作。
(4)、数据库系统触发器:定义在整个数据库上,触发的时间是数据库的操作,比如数据库的启动和关闭。
3、触发器的组成?
(1)、触发的事件:即在何种情况下触发trigger,例如:insert、update、delete。
(2)、触发的时间:即该trigger是在触发事件之前(before)还是在触发事件之后(after),也就是触发的事件和该trigger主体的先后顺序。
(3)、触发器本身:即触发器在触发事件的时候要执行的操作,例如:pl/sql块。
(4)、触发的频率:说明该触发器内定义的动作被执行的次数。即语句级触发器和行级触发器。语句级触发器是指当某个事件发生时,该触发器只执行一次。而行级触发器,在某个事件发生时,对受到该操作影响的每一行数据,都会单独执行一次触发器。
创建表:
--创建表 --员工表 CREATE TABLE emp( emp_ID NUMBER(10) PRIMARY KEY, emp_name VARCHAR2(20) NOT NULL, emp_sex VARCHAR2(10), emp_address VARCHAR2(15) ); --日志表 CREATE TABLE logs( LOG_ID NUMBER(10) PRIMARY KEY, LOG_TABLE VARCHAR2(10) NOT NULL, LOG_DML VARCHAR2(10), LOG_KEY_ID NUMBER(10), LOG_DATE DATE, LOG_USER VARCHAR2(15) ); --创建序列 CREATE SEQUENCE logs_id_squ INCREMENT BY 1 START WITH 1 MAXVALUE 9999999 NOCYCLE NOCACHE; CREATE SEQUENCE emp_id_squ INCREMENT BY 1 START WITH 1 MAXVALUE 9999999 NOCYCLE NOCACHE;
一、创建DML触发器:
--创建触发器:当添加一条员工信息的时候,同事添加一条日志信息 create or replace trigger add_trigger after insert on emp for each row begin insert into logs values(logs_id_squ.nextval,'emp','insert',:new.emp_id,sysdate,'zxf'); end; --行级触发器,如果修改的行的条数有10条,那么也将触发10次行级触发器,也就会插入10条日志记录 create or replace trigger edit_trigger after update of emp_name on emp for each row begin insert into logs values(logs_id_squ.nextval,'emp','update',:old.emp_id,sysdate,'zxf'); end; update emp e set e.emp_name='zxf_noimp' where e.emp_name='zxf_noimp1' --禁用触发器 alter trigger edit_trigger disable --语句级触发器,如果修改的行数有10条,只会触发一次事件 create or replace trigger edit2_trigger after update of emp_name on emp begin insert into logs values(logs_id_squ.nextval,'emp','update',0,sysdate,'语句触发器'); end; --使用when子句 create or replace trigger edit3_trigger after delete on emp for each row --行级触发器 when (old.emp_id=3) begin insert into logs values(logs_id_squ.nextval,'emp','delete',:old.emp_id,sysdate,'zxf'); end;
二、创建instead of 触发器:只能对视图建立instead of触发器,不能对表、模式和数据库建立instead of触发器。
--创建视图 create or replace view emp_view as select * from emp e left join logs l on l.log_key_id=e.emp_id --查询视图 select * from emp_view --删除视图中的一条记录,此时会报错 delete emp_view e where e.emp_id=2 --创建instead of触发器 create or replace trigger instead_del_trigger instead of delete on emp_view for each row begin delete emp e where e.emp_id = :old.emp_id; end; --再执行,就没有错误了 delete emp_view e where e.emp_id=2
三、创建DDL触发器:
--系统触发器 create or replace trigger drop_table_trigger after drop on database begin insert into logs values(logs_id_squ.nextval,'emp','drop',0,sysdate,'zxf'); end;
四、创建数据库系统触发器:
--系统触发器:数据库启动的时候触发 create or replace trigger drop_table_trigger after startup on database begin insert into logs values(logs_id_squ.nextval,'emp','drop',0,sysdate,'zxf'); end; --数据库关闭的时候触发 create or replace trigger drop_table_trigger before shutdown on database begin insert into logs values(logs_id_squ.nextval,'emp','drop',0,sysdate,'zxf'); end;
其中:for each row说明触发器为行级触发器。行级触发器和语句级触发器的区别在于:行级触发器要求当一个DML语句操作影响数据库中的多行数据时,对于其中的每行数据,只要他们符合触发约束条件,均激活一次触发;而语句级触发器将整个语句操作作为一个触发事件,当它符合约束条件时,只激发一次触发器操作。当省略for each row语句时,before和after触发器为语句级触发器,而instead of为行级触发器。
4、触发器的限制?
(1)、create trigger 语句的字符长度不能超多32kb;
(2)、触发器体内的select语句只能为select .....into .....结构,或者为定义游标所使用的select语句;
(3)、触发器中不能使用数据库事务控制语句,如:commit、rollback、savepoint语句;
(4)、由触发器调用的过程或函数也不能使用数据库事务控制语句;
(5)、触发器中不能使用lang、lang row类型;
(6)、触发器可以参照lob类型类的列值,但不能通过:new 来修改lob列中的值;
(6)、触发器所涉及的表收到表约束的限制
发表评论
-
linux下操作oracle
2017-12-14 13:26 412进入 : su - oracle ... -
oracle 用户被锁定解锁方法
2017-10-09 08:57 340修改了用户密码,第二天过来发现用户被锁定,晚上走的时候还好好 ... -
mysql、oracle定时备份
2012-11-03 10:26 11731、oracle定时备份 @echo off set NL ... -
ORACLE数据库的体系结构
2011-08-16 11:33 1417一、Oracle服务器是由Orac ... -
数据库中的事务
2011-08-15 15:30 990一、事务(Transaction)是由 ... -
Oracle存储过程和程序包
2011-08-11 11:10 16766一、为什么要用存储过程? 如果在应用程序中经常需要执行特定的 ... -
Oracle游标
2011-08-10 15:23 1704一、什么是游标? PL/SQ ... -
Oracle子查询
2011-08-09 10:56 12961、子查询in 、any 、all select * fro ... -
Oracle连接查询
2011-08-09 10:53 10021、内连接 /* 内连接 返回满足条件的记录,其中inn ... -
Oracle中DBLink、同义词、DDL语句、序列
2011-08-09 10:47 20071、创建database link create datab ... -
oracle存储过程、游标、函数
2010-12-01 10:41 1321、长时间没有写过oracle过程、函数之类的东东了,最近比较 ... -
oracle主键自增触发器
2010-11-05 10:01 1346CREATE OR REPLACE TRIGGER mycol ... -
oracle 索引
2010-11-05 09:32 1416当索引键列用户SQL语句的where子句中时,该索引将直接指向 ... -
oracle 函数
2010-11-02 09:12 1065/************************判断null ... -
Oracle汉字排序SQL
2010-11-01 14:06 14461、使用拼音排序 select * from t o ... -
oracle删除重复记录
2010-04-07 15:18 919删除表中多余的重复记录,重复记录是根据单个字段(peopleI ... -
oracle分页查询
2010-04-07 15:17 981SELECT b.* FROM ( SELECT RO ... -
oracle创建表空间
2010-04-07 15:16 1783//创建临时表空间 create temporary ...
相关推荐
调试oracle触发器文档,自己整理的,不懂的可以聊系我
个人亲测oracle触发器调用java程序
1、行级触发器不支持 update 、select 、delete 对自身表的操作。 2、表级触发器 不支持 :new 和 :old对象 所以想要触发器对自身表数据做修该,则用行级触发器得到 :new 和 :old对象中的相关数据,然后将这样的数据...
oracle insert数据成功之后调用触发器,触发器调用存储过程,存储实时调用java http
oracle触发器语法要点
ORACLE触发器、内置程序包教学.doc )
Oracle 触发器 备份 表数据
oracle触发器功能介绍内附具体说明和简单介绍
oracle 触发器 调用 存储过程 Oracle自治事务(Autonomous Transaction)
oracle触发器与存储过程高级编程
Oracle触发器与存储过程高级编程Oracle触发器与存储过程高级编程
触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。数据库触发器有以下的作用:
Oracle触发器与存储过程高级编程 中文 PDF
oracle触发器 练习,语句,应用,用法
Oracle触发器的概念和类型
oracle触发器执行顺序.pdf
介绍数据库触发器的PPT。内容包括:存储过程的创建与使用;存储过程的查看、编辑和删除;触发器的创建与使用;触发器的查看、编辑、重命名和删除
Oracle触发器与pl/sql存储过程编程 chm格式的
《Oracle触发器与存储过程高级编程》电子版,由于单个压缩文件超过20M,所以压缩成了两个包,这是第二个包。