这是我正在处理的代码:
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语句时,数据返回的速度非常快,但没有经过验证,并且返回了不可见的行。
答案 0 :(得分:2)
数据在某种条件下得到验证...
没关系;但是,为什么要在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行的目的是什么?谁来审查?您确定这是应该采取的方式吗?如果是这样,请考虑切换到存储过程。让它在数据库中执行那些 validation ,并让表单获取“干净”数据。