Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle表单-如何加快POST_查询触发?_Sql_Oracle_Plsql_Oracleforms - Fatal编程技术网

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行)时停止,并在获取下一批行时再次激发。