关于触发器修改自身数据表实例
来源:百度文库 编辑:神马文学网 时间:2024/04/26 04:32:03
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;
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;
当然,在触发器修改自身数据表,对于有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;
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;
关于触发器修改自身数据表实例
关于触发器修改自身数据表实例
SQL触发器实例讲解
SQL触发器实例讲解
Oracle触发器语法及实例
Redboot修改实例
触发器
触发器
修改MYSQL数据库,数据表,字段的编码(解决JSP乱码)
Visual C#数据表操作之删除和修改记录 - 51CTO.COM
写作修改校对符号应用实例
Oracle历程(关于触发器的创建及注意事项)
Oracle历程(关于触发器的创建及注意事项)
全国人民代表大会常务委员会关于修改
曝光数据表
关于修改注册表提高网速
深圳市人民代表大会常务委员会 关于修改
关于用户界面标准自身的可用性
关于人类自身的10个秘密
关于人类自身的10个秘密
sql 触发器
触发器基本知识
JavaScript触发器
Oracle触发器