从SQL SERVER 向ORACLE 8迁移的技术实现方案(2)
http://tech.ddvip.com 2008年09月08日 社区交流
本文详细介绍从SQL SERVER 向ORACLE 8迁移的技术实现方案(2)
(4)触发器的主体是一个PL/SQL块,在PL/SQL块中可以使用的所有语句在触
发器主体中都是合法的,但是要受到下面的限制:
1> 触发器不能使用事务控制语句,包括COMMIT、ROLLBACK或
SAVEPOINT。ORACLE保持这种限制的原因是:如果触发器遇到错误时,
由触发器导致的所有数据库变换均能被回滚(roll back)取消;但如果
触发器确认(commit)了对数据库进行的部分变换,ORACLE就不能完全
回滚(roll back)整个事务。
2> 在触发器主体中调用到的存储过程的实现语句里也不能使用事务控制语
句。
3> 触发器主体不能声明任何LONG或LONG RAW变量。而且,:new和:old
不能指向定义触发器的表中的LONG或LONG RAW列。
4> 当声明触发器的表中有外键约束时,如果将定义触发器的表和需要作为
DELETE CASCADE参考完整性限制的结果进行更新的表称为变化表,
将外键相关联的表称为限制表,则在此触发器主体中的SQL语句不允许
读取或修改触发语句的任何变化表,也不允许读取或修改限制表中的主
键、唯一值列或外键列。
(5)以下是建立一个事前插入触发器的示例:
CREATE OR REPLACE TRIGGER Credit_Charge_Log_Ins_Before
BEFORE insert ON Credit_Charge_Log
FOR EACH ROW
DECLARE
Total_for_past_3days number ;
BEGIN
-- Check the credit charges for the past 3 days.
-- If they total more than $1000.00, log this entry
-- int the Credit_Charge_Attempt_Log for further handling.
select sum ( amount ) into total_for_past_3days
from Credit_Charge_Log
where Card_Number = :new.Card_Number
and Transaction_Date >= sysdate – 3;
IF total_for_past_3days > 1000.00 THEN
insert into credit_Charge_Attemp_Log
(Card_Number, Amount, Vendor_ID, Transaction_Date)
values
(:new.Card_Number, :new.Amount,
:new.Vendor_ID, :new.Transaction_Date);
END IF ;
END ;
责编:豆豆技术应用
- Oracle 10g 教程
- Oracle 故障处理
- Oracle 存储过程
- Oracle 备份恢复
- Oracle 性能调优
- Oracle 9i 教程
- Oracle 11g 教程
- Oracle 启动
- Oracle 命令
- Oracle 数据库管理
- Oracle 时间
- Oracle 密码
- Oracle 用户
- Oracle 常见错误
- Oracle 建数据表
- Oracle 索引
- Oracle 数据库连接
- Oracle 锁
- Oracle RAC 专题
- Oracle exp/imp 命令
- Oracle 表空间
- Oracle 查询
- Oracle 函数
- Oracle PL/SQL 专题
- 更多Oracle 专题>>>