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-ITEM
或WHEN-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 触发器?的主要内容,如果未能解决你的问题,请参考以下文章