Form中触发器trigger的执行层次关系

Oracle Form的触发器模型类似Windows系统的事件驱动模型,即当某个事件,比如鼠标Click,发生的时候,Forms Engine会去找是否有相应的代码,如果有,就执行之,没有的话就忽略该事件。当界面上某个动作发生的时候,Forms Engine会把一系列要发生的事件按照“先后关系”压入执行堆栈,然后再从堆栈中一个个事件POP出来逐一执行,任一事件遇到Raise Form-Trigger-Failure,Forms Engine就停止执行、清空堆栈、Rollback事务、设置光标回合适的Item。

当一个事件发生的时候,Forms Engine可一并触发由低到高3个级别(Item、Block、Form)的同名事件,触发顺序由定义低级别的事件时所设置的执行层次决定。

执行层次关系:

(1)Override模式,默认模式,不再触发高级别事件

(2)Before模式,触发完本级别的事件后,再触发高级别事件

(3)After模式,先触发高级别事件,再回来触发本级别事件

当然了,如果某一层次我们没定义事件代码,Forms Engine就跳过该级别,直接进入下一级别。

此外,Block中任何Item发生的事件,都可能引发该Block级事件,所以在Block级写本属于Item级的事件,要特别性能问题;Form级事件更有类似问题。

例子(假设):

(1)Item XXX的WHEN-VALIDATE-ITEM的代码是“代码1”,模式是“After”;

(2)Item XXX所在BlockWHEN-VALIDATE-ITEM的代码是“代码2”,模式是“Override”;

(3)Form级WHEN-VALIDATE-ITEM的代码是“代码3”。

这是三个层次的同名时间,由低到高来看,item级模式是after,则item在block和form以后执行;block级模式是override,则不再执行比block高(form)的同名触发器,只执行block级触发器;form级的模式没有设置,默认为override,但是由于block级已经是override,所以form级触发器不执行。所以,最后执行的顺序是先执行block级再执行item级,不执行form级。如果在某一事件如pre-block中raise-trigger-failure,那么form engine就会停止其后面的所有事件的执行,并认为“光标从块A到块B”失败,把光标仍然留在块A中。

本文标题:Form中触发器trigger的执行层次关系

本文链接:http://yedward.net/?id=56

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章