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

时间:2019-04-15 13:23:01

标签: sql oracle plsql oracleforms

这是我正在处理的代码:

declare
    --some cursors here

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

    --some fetches here
end;

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

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

1 个答案:

答案 0 :(得分:2)

  

数据在某种条件下得到验证...

没关系;但是,为什么要在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行的目的是什么?谁来审查?您确定这是应该采取的方式吗?如果是这样,请考虑切换到存储过程。让它在数据库中执行那些 validation ,并让表单获取“干净”数据。