也许有必要弄清楚为什么有“不触发”规则。
对于触发器有很多很好的论据,尤其是关于将业务规则放入触发器的论据,但是日志记录对于它们的使用来说是一个很好的例子。
还值得一看Oracle的内置表版本控制(每次更新都会记录一行),这使历史记录的形状与当前表的形状保持一致。
它不会给你“什么改变了”的历史,但是当你看历史的时候,最好做“什么改变了”,而不是在每次更新上增加成本。
我找到的唯一方法就是动态访问%rowtype的属性,将变量放在包头上(这样它是公开的),然后执行动态pl/sql。只要动态PL/SQL块在每次检查之前包含本地副本,就可以封装行变量。也就是说,把它想象成您的立即执行模板。
DECLARE
lNew myTab%ROWTYPE;
lOld myTab%ROWTYPE;
lReturn PLS_INTEGER := 0;
BEGIN
lNew := pStatefulPackage.NewRow;
lOld := pStatefulPackage.OldRow;
IF NVL(lNew.,'~') != NVL(lOld..,'~') THEN
:lReturn := 1;
END IF;
END;
在动态SQL中,无法绑定记录变量或布尔值这一事实是很麻烦的。
它还增加了很多按列计算的开销。
最后,我发现对于这类事情来说,所有的列都太慢了——您需要将元数据缓存在本地PL/SQL内存中。