从SQL SERVER 向ORACLE 8迁移的技术实现方案(2)
2008-09-08 12:52:54 来源:WEB开发网(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 恢复误删除的表和误更新的表
- ››SQL Server 2008 R2 下如何清理数据库日志文件
- ››Oracle分页查询排序数据重复问题
- ››Oracle创建dblink报错:ORA-01017、ORA-02063解决
- ››Oracle 提高SQL执行效率的方法
- ››Oracle 动态查询,EXECUTE IMMEDIATE select into...
- ››sqlite 存取中文的解决方法
- ››SQL2005、2008、2000 清空删除日志
- ››SQL Server 2005和SQL Server 2000数据的相互导入...
- ››sql server 2008 在安装了活动目录以后无法启动服...
- ››Oracle 11g必须开启的服务及服务详细介绍
- ››oracle性能34条优化技巧
更多精彩
赞助商链接