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

Oracle Forms - how to speed up POST_QUERY trigger?

这是我正在处理的代码:

declare
    --some cursors here

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

    --some fetches here
end;

它来自 post-query 触发器,基本上我的问题是我在 Oracle 中的块形成 returns 20k 行并且 post-query 触发器正在为每一行触发。执行需要几分钟,我想加快到几秒钟。数据在 some_condition 中验证(它是一个函数,但它 returns 值真的很快)。如果不满足条件,则引发 form_trigger_failure。有没有办法在不改变逻辑的情况下加快验证速度? (应返回相同的行数,此验证很重要)

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

Data is validated in some_condition ...

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

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

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

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

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

此外,说函数 returns 结果 非常快 - 可能,如果它 运行 是单行。让它 运行 在 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 行的目的是什么?谁来审查那个?你确定这是你应该做的方式吗?如果是,考虑改用存储过程;让它在数据库中执行那些 验证 ,并让表单获取 "clean" 数据。