关于触发器修改自身数据表实例
2016-01-03 11:43
531 查看
--需要建立一个行触发器、一个表触发器以及一个程序包。
--1 创建测试环境
--创建数据表
Create Table xxx(
xKey Number(4),
xDate Date,
xData number(10));
--2 创建程序包,设立全局变量G_xKe
Create Or Replace Package Pkg_xxx_Update
as
G_xKey xxx.xKey%Type;
End Pkg_xxx_Update;
/
--3 创建行触发器,并将xKey的值存入程序包的全局变量中
Create Or Replace Trigger TRG_Upd_xxx_Rec
After Insert On xxx
For Each Row
Begin
Pkg_xxx_update.G_xKey:=:New.xKey;
End;
/
--4 创建表触发器,根据程序包的全局变量,对数据表的xDate字段进行更新
Create Or Replace Trigger TRG_Upd_xxx_TB
After Insert On xxx
Begin
Update xxx set xDate=SysDate
Where xKey=PKG_xxx_Update.G_xKey;
End;
/
--4 测试触发器
Insert Into xxx(xkey,xdata) values(1,1);
commit;
Select * From xxx;
==========================================================
1 前言
当然,在触发器修改自身数据表,对于有ORACLE数据库后台编程人员来说,并不应该算是一个难题,可能在平时的工作中就经常要遇到。
但对于刚刚使用ORACLE数据库后台编程人员来说,的确是一个比较烦人的问题。
2 说明
ORACLE的触发器分为两类:行触发器(For Each Row)和表触发器,在行触发器中,不得将Insert/Update/Delete语句作用于自身数据表;在表触发器中,不得使用:New/:Old语句。
但在实际编程过程中,我们往往需要对自身数据表进行DML(Insert/Update/Delete)操作,同时引用:New/:Old对象。
如:使用Insert Into xxx (Select * From yyy Where xKey=123456)语句后,我们需要保存插入记录的时间,由于数据库操作的时间差,我们不可以使用:New.xDate:=SysDate语句 <使用这一语句后,插入的每笔记录xDate的数值会不一样,可相差数秒>。
对我们来说,最好的语句是:Update xxx Set xDate=SysDate Where xKey=:New.xKey。此时,我们使用Update语句的同时,又使用了:New对象,ORACLE认为不合法。
3 解决提案
实现此需求,我们需要建立一个行触发器、一个表触发器以及一个程序包。
--3.0 创建测试环境
Drop Table xxx;
Drop Table yyy;
--创建数据表
Create Table xxx(
xKey Number(4),
xDate Date,
xData number(10));
Create Table yyy(
xKey Number(4),
xDate Date,
xData number(10));
--3.1 创建程序包,设立全局变量G_xKe
Create Or Replace Package Pkg_xxx_Update
as
G_xKey xxx.xKey%Type;
End Pkg_xxx_Update;
/
--3.2 创建行触发器,并将xKey的值存入程序包的全局变量中
Create Or Replace Trigger TRG_Upd_xxx_Rec
After Insert On xxx
For Each Row
Begin
Pkg_xxx_update.G_xKey:=:New.xKey;
End;
/
--3.3 创建表触发器,根据程序包的全局变量,对数据表的xDate字段进行更新
Create Or Replace Trigger TRG_Upd_xxx_TB
After Insert On xxx
Begin
Update xxx
set
xDate=SysDate
Where
xKey=PKG_xxx_Update.G_xKey; bbs.bitsCN.com;
End;
/
--3.4 插入大量数据
<>
Declare
L_Count Number:=1;
Begin
Delete from yyy;
While L_Count<100000
Loop
insert into yyy
values(1, SysDate, L_Count);
L_Count:=L_Count+1;
End Loop;
Commit;
End InsertMultiRecord;
--3.5 测试触发器
Insert Into xxx
(Select * from yyy);
Commit;
Select * From xxx;
--1 创建测试环境
--创建数据表
Create Table xxx(
xKey Number(4),
xDate Date,
xData number(10));
--2 创建程序包,设立全局变量G_xKe
Create Or Replace Package Pkg_xxx_Update
as
G_xKey xxx.xKey%Type;
End Pkg_xxx_Update;
/
--3 创建行触发器,并将xKey的值存入程序包的全局变量中
Create Or Replace Trigger TRG_Upd_xxx_Rec
After Insert On xxx
For Each Row
Begin
Pkg_xxx_update.G_xKey:=:New.xKey;
End;
/
--4 创建表触发器,根据程序包的全局变量,对数据表的xDate字段进行更新
Create Or Replace Trigger TRG_Upd_xxx_TB
After Insert On xxx
Begin
Update xxx set xDate=SysDate
Where xKey=PKG_xxx_Update.G_xKey;
End;
/
--4 测试触发器
Insert Into xxx(xkey,xdata) values(1,1);
commit;
Select * From xxx;
==========================================================
1 前言
当然,在触发器修改自身数据表,对于有ORACLE数据库后台编程人员来说,并不应该算是一个难题,可能在平时的工作中就经常要遇到。
但对于刚刚使用ORACLE数据库后台编程人员来说,的确是一个比较烦人的问题。
2 说明
ORACLE的触发器分为两类:行触发器(For Each Row)和表触发器,在行触发器中,不得将Insert/Update/Delete语句作用于自身数据表;在表触发器中,不得使用:New/:Old语句。
但在实际编程过程中,我们往往需要对自身数据表进行DML(Insert/Update/Delete)操作,同时引用:New/:Old对象。
如:使用Insert Into xxx (Select * From yyy Where xKey=123456)语句后,我们需要保存插入记录的时间,由于数据库操作的时间差,我们不可以使用:New.xDate:=SysDate语句 <使用这一语句后,插入的每笔记录xDate的数值会不一样,可相差数秒>。
对我们来说,最好的语句是:Update xxx Set xDate=SysDate Where xKey=:New.xKey。此时,我们使用Update语句的同时,又使用了:New对象,ORACLE认为不合法。
3 解决提案
实现此需求,我们需要建立一个行触发器、一个表触发器以及一个程序包。
--3.0 创建测试环境
Drop Table xxx;
Drop Table yyy;
--创建数据表
Create Table xxx(
xKey Number(4),
xDate Date,
xData number(10));
Create Table yyy(
xKey Number(4),
xDate Date,
xData number(10));
--3.1 创建程序包,设立全局变量G_xKe
Create Or Replace Package Pkg_xxx_Update
as
G_xKey xxx.xKey%Type;
End Pkg_xxx_Update;
/
--3.2 创建行触发器,并将xKey的值存入程序包的全局变量中
Create Or Replace Trigger TRG_Upd_xxx_Rec
After Insert On xxx
For Each Row
Begin
Pkg_xxx_update.G_xKey:=:New.xKey;
End;
/
--3.3 创建表触发器,根据程序包的全局变量,对数据表的xDate字段进行更新
Create Or Replace Trigger TRG_Upd_xxx_TB
After Insert On xxx
Begin
Update xxx
set
xDate=SysDate
Where
xKey=PKG_xxx_Update.G_xKey; bbs.bitsCN.com;
End;
/
--3.4 插入大量数据
<>
Declare
L_Count Number:=1;
Begin
Delete from yyy;
While L_Count<100000
Loop
insert into yyy
values(1, SysDate, L_Count);
L_Count:=L_Count+1;
End Loop;
Commit;
End InsertMultiRecord;
--3.5 测试触发器
Insert Into xxx
(Select * from yyy);
Commit;
Select * From xxx;
相关文章推荐
- 我是运营,我没有假期
- DB2数据库的安装
- C#实现把指定数据写入串口
- “传奇”图象数据存储方式
- 交换机升级排障实例
- 修复mysql数据库
- 浅析SQL数据操作语句
- SQLServer 数据导入导出的几种方法小结
- MySQL数据备份之mysqldump的使用详解
- C#实现窗体间传递数据实例
- 给你的数据库文件减肥
- Oracle数据更改后出错的解决方法
- Oracle数据库数据丢失恢复的几种方法总结
- sql2008启动代理未将对象应用到实例解决方案
- C#将Sql数据保存到Excel文件中的方法
- MFC实现在文件尾追加数据的方法
- 把excel表格里的数据导入sql数据库的两种方法
- 用文本作数据处理
- 桌面中心(一)创建数据库
- 桌面中心(四)数据显示