Sql Oracle表单-如何加快POST_查询触发?
这是我正在处理的代码:Sql Oracle表单-如何加快POST_查询触发?,sql,oracle,plsql,oracleforms,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表单中的块返回20k行,而查询后触发器会为每一行触发。执行需要几分钟,我想把速度提高到几秒钟。数据在某些条件下进行验证(它是一
declare
--some cursors here
begin
if some_condition = 'N' then
raise form_trigger_failure;
end if;
--some fetches here
end;
它来自查询后触发器,基本上我的问题是Oracle表单中的块返回20k行,而查询后触发器会为每一行触发。执行需要几分钟,我想把速度提高到几秒钟。数据在某些条件下进行验证(它是一个函数,但返回值非常快)。如果不满足条件,则引发form_trigger_failure。是否有任何方法可以在不改变逻辑的情况下加速验证?(应返回相同数量的行,此验证非常重要)
我试图更改块属性,但没有帮助。
另外,当我删除整个if语句时,数据返回速度非常快,但并没有经过验证,返回的行不应该是可见的
数据在某些条件下得到验证
没关系;但是,为什么要在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
选择您的_函数(一些_参数)
从那张桌子上
其中rownum<2;-->将2更改为200,将2000更改为20000,然后看看会发生什么
另一方面,获取20000行的目的是什么?谁来评论这个?你确定你应该这样做吗?如果是这样,考虑切换到存储过程;让它在数据库中执行这些验证,并让表单获取“干净”的数据
数据在某些条件下得到验证
没关系;但是,为什么要在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
选择您的_函数(一些_参数)
从那张桌子上
其中rownum<2;-->将2更改为200,将2000更改为20000,然后看看会发生什么
另一方面,获取20000行的目的是什么?谁来评论这个?你确定你应该这样做吗?如果是这样,考虑切换到存储过程;让它在数据库中执行这些验证,并让表单获取“干净”数据。我认为,在打开表单模块时,不应该为块中的每一行触发查询后触发器,而应该在达到获取限制(例如50行)时停止并在获取下一批行时再次激发。我认为,在打开表单模块时,不应为块中的每一行激发后查询触发器。它应在达到获取限制(例如50行)时停止,并在获取下一批行时再次激发。