分享
 
 
 

Oracle初学者笔记(十五)--触发器和内置程序包

王朝oracle·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

------触发器------

是PL/SQL块或存储过程;

是在对关联表执行DML操作时触发的;

是隐式执行的;

还可能具有声明部分和异常处理部分;

DML触发器有三类:

1, insert触发器;

2, update触发器;

3, delete触发器;

触发器的组成部分:

触发器的声明,指定触发器定时,事件,表名以类型

触发器的执行,PL/SQL块或对过程的调用

触发器的限制条件,通过where子句实现

类型:

应用程序触发器,前台开发工具提供的;

数据库触发器,定义在数据库内部由某种条件引发;分为:

DML触发器;

数据库级触发器;

替代触发器;

DML触发器组件:

1,触发器定时

2,触发器事件

3,表名

4, 触发器类型

5, When子句

6, 触发器主体

可创建触发器的对象:数据库表,数据库视图,用户模式,数据库实例

创建DML触发器:

Create [or replace] trigger [模式.]触发器名

Before| after insert|delete|(update of 列名)

On 表名

[for each row]

When 条件

PL/SQL块

For each row的意义是:在一次操作表的语句中,每操作成功一行就会触发一次;不写的话,表示是表级触发器,则无论操作多少行,都只触发一次;

When条件的出现说明了,在DML操作的时候也许一定会触发触发器,但是触发器不一定会做实际的工作,比如when 后的条件不为真的时候,触发器只是简单地跳过了PL/SQL块;

Insert触发器的创建:

create or replace trigger tg_insert

before insert on student

begin

dbms_output.put_line('insert trigger is chufa le .....');

end;

/

执行的效果:

SQL> insert into student

2 values(202,'dongqian','f');

insert trigger is chufa le .....

update表级触发器的例子:

create or replace trigger tg_updatestudent

after update on student

begin

dbms_output.put_line('update trigger is chufale .....');

end;

/

运行效果:

SQL> update student set se='f';

update trigger is chufale .....

已更新8行;

可见,表级触发器在更新了多行的情况下,只触发了一次;

如果在after update on student后加上

For each row的话就成为行级触发器,运行效果:

SQL> update student set se='m';

update trigger is chufale .....

update trigger is chufale .....

update trigger is chufale .....

update trigger is chufale .....

update trigger is chufale .....

update trigger is chufale .....

update trigger is chufale .....

update trigger is chufale .....

已更新8行;

:new 与: old:必须是针对行级触发器的,也就是说要使用这两个变量的触发器一定有for each row

这两个变量是系统自动提供的数组变量,:new用来记录新插入的值,old用来记录被删除的值;

使用insert的时候只有:new里有值;

使用delete的时候只有:old里有值;

使用update的时候:new和:old里都有值;

可以这样使用: dbms_output.put_line('insert trigger is chufa

dbms_output.put_line('new id is : '||:new.stui

dbms_output.put_line('new name is : '||:new.st

dbms_output.put_line('new se is : '||:new.se);

可以这样从数据字典中查看一个表上有哪几个触发器:

SQL> select trigger_name from user_triggers

2 where table_name=upper('student');

TRIGGER_NAME

------------------------------

TG_INSERT

TG_UPDATESTUDENT

带有:old变量的行级delete触发器:

create or replace trigger tg_deletestudent

before delete on student

for each row

begin

dbms_output.put_line('old is: '||:old.stuid);

dbms_output.put_line('old name: '||:old.stuname);

end;

/

运行效果:

SQL> delete from student;

old is: 202

old name: dongqian

old is: 101

old name: liudehua

old is: 102

old name: lingqingxia

old is: 103

old name: lichanggong

old is: 104

old name: zhenxiuwen

old is: 1001

old name: lilianjie

old is: 1009

old name: tongleifuck

old is: 203

old name: kfdj

old is: 209

old name: fuck

已删除9行

When的使用:如果在begin也就是说触发器的PL/SQL主体块执行前加上when(old.se=’f’)的话,DML操作照做不误,但是只会在删除

Se=’f’的那行的时候才会执行触发器的主体动作,执行效果:

SQL> delete from student;

old is: 209

old name: fuck

已删除9行; 这里虽然删了9行,但是只执行了一次触发器的主体,做为一个行级触发器;

混合类型触发器:

Inserting,deleting,updating三个谓词可以分别指示当前操作到底是哪个;

create or replace trigger hunhetrigger

before insert or update or delete on student

for each row

begin

if inserting then

dbms_output.put_line('insert le.........');

end if;

if deleting then

dbms_output.put_line('delete le .......');

end if;

end;

/

插入的时候就自动判断当前动作为插入:

SQL> insert into student values(303,'me','f');

insert le.........

删除的时候就自动判断当前动作为删除:

SQL> delete from student;

delete le .......

注意,既然触发器内部的主体PL/SQL是语句,那么它同样也可以是插入删除操作而不一定只是dbms_output打印一些信息;

这正是日志表的原理:在用户执行了DML语句的时候触发主体为插入日志表以记录操作轨迹的触发器;

为什么用触发器? 当我们有两个表用来记录商品的出库入库情况,good_store用来记录库存的产品类别和数量,

而good_out用来记录出库的产品类别和数量,那么每当我们出库的某个类别的产品一定数量的时候,我们应该在good_out中插入该产品的类别和

出库数量,而同时也应该在good_store表中用update来更新库存的相应类别的产品的数量;这就交给了我们两个必须完成的任务:插入good_out

表后更新good_store表,这样的手工过程使得我们觉得非常ugly,如果只做其中一个那造成数据的不一致;所以现在我们可以用触发器,在

Good_out表的插入操作上绑定一个对good_store进行更新的触发器;当然这个过程应该是一个事务,你不必担心插入good_out表执行了,而绑定在这个动作上的触发器操作不会执行,相信Oracle设计为原子性了;

注意:触发器会使得原来的SQL语句速度变慢;

替代触发器:

创建在视图上的触发器,就是替代触发器,只能是行级触发器;

为什么要用替代触发器?

假如你有一个视图是基于多个表的字段连接查询得到的;现在如果你想直接对着这个视图insert;那你一定在想,我对视图的插入操作

怎么来反应到组成这个视图的各个表中呢?事实上,除了定义一个触发器来绑定在对视图上的插入动作上外,你没有别的办法通过系统的报错而直接向视图中插入数据;这就是我们用替代触发器的原因;替换的意思实际上是触发器的主体部分把对视图的插入操作转换成详细的对各个表的插入;

变异表:变异表就是当前SQL语句正在修改的表,所以在一个变异表上绑定的触发器不可以使用cout()函数,原因很简单:SQL语句刚刚修改了表,你怎么统计??

约束表:

维护:

Alter trigger …..disenable; 使得触发器不可用;

Alter trigger ……enable; 开启触发器;

Oracle的内置程序包

扩展数据库的功能;

为PL/SQL提供对SQL功能的访问;

一般具有sys权限的高级管理人员使用;

一个典型的程序包就是dbms_output,你老是用它的过程put_line();

Dbms_standard 提供语言工具;

Dbms_lob操作Oracle LOB;就是针对大型数据的操作设计的;

Dbms_lock用户定义的锁;

Dbms_job 允许对PL/SQL过程进行调度;

Dbms_alert 支持数据库事件的异步通知;

1,dbms_output的一些过程:

&

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有