Oracle Forms - 如何加快 POST_QUERY 触发器?

Posted

技术标签:

【中文标题】Oracle Forms - 如何加快 POST_QUERY 触发器?【英文标题】:Oracle Forms - how to speed up POST_QUERY trigger? 【发布时间】:2019-04-15 13:23:00 【问题描述】:

这是我正在处理的代码:

declare
    --some cursors here

begin
    if some_condition = 'N' then
        raise form_trigger_failure;
    end if;

    --some fetches here
end;

它来自查询后触发器,基本上我的问题是我在 Oracle 表单中的块返回 20k 行,并且查询后触发器正在为每一行触发。执行需要几分钟,我想加快几秒钟。在 some_condition 中验证数据(它是一个函数,但它返回值非常快)。如果不满足条件,则会引发 form_trigger_failure。有什么方法可以在不改变逻辑的情况下加快验证速度? (应该返回相同的行数,这个验证很重要)

我尝试更改块属性,但没有帮助。 此外,当我删除整个 if 语句时,数据返回的速度非常快,但它没有经过验证,并且返回的行不应该是可见的。

【问题讨论】:

我认为当您打开表单模块时,不应为块中的每一行触发 POST-QUERY 触发器它应该在达到提取限制时停止(例如 50 行)和当您获取下一批行时再次触发。 【参考方案1】:

在 some_condition 中验证数据 ...

没关系;但是,为什么要在POST-QUERY 触发器中执行验证?它获取数据库中已经存在的数据,所以它必须是有效的。不然你当初为什么要存起来?

POST-QUERY 应该用于填充非数据库项。

验证应在WHEN-VALIDATE-ITEMWHEN-VALIDATE-RECORD 触发器中处理,而不是在POST-QUERY 中。

我建议你把这两个动作分开。如果代码的某些部分可以/应该在这两种类型的触发器之间共享,请将其放入一个过程(在一个表单中)并在适当的时候调用它。

顺便说一句,POST-QUERY 不会为所有 20K 行触发(除非您缓冲了那么多行,并且 - 如果您这样做了 - 您不应该这样做)。

此外,说函数返回结果真的很快 - 可能,如果它运行单行。让它在 200、2000、20000 行上运行

select your_function(some_parameters) 
from that_table
where rownum < 2;  --> change 2 to 200 to 2000 to 20000 and see what happens

另一方面,获取 20.000 行的目的是什么?谁来审查这个?你确定这是你应该这样做的方式吗?如果是这样,考虑切换到存储过程;让它在数据库中执行那些验证,然后让表单获取“干净”的数据。

【讨论】:

以上是关于Oracle Forms - 如何加快 POST_QUERY 触发器?的主要内容,如果未能解决你的问题,请参考以下文章

Using Post_Query Trigger in Oracle Forms

如何从 Oracle Forms 中的触发器修改按钮的状态

oracle forms 12. 如何显示十进制数的前导零

Download Oracle Forms 6i

Oracle Forms:无法使用数组引用项目名称

django_5:表单1——文件上传