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-ITEM
或 WHEN-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" 数据。
这是我正在处理的代码:
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-ITEM
或 WHEN-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" 数据。