在数据块上循环非常慢(Oracle表单、PL/SQL)

jutyujz0  于 2023-11-17  发布在  Oracle
关注(0)|答案(2)|浏览(165)

我创建了一个小循环来从Oracle Forms中的数据块中选择最大值。我必须这样做,因为块有时会从另一个表单获取全局参数,或者有时它有不同的默认where子句等。它从不同的源填充,所以我不能创建游标,或者我必须动态地这样做。
我的循环是这样声明的:

loop
exit when :system.last_record = 'TRUE';
if (:block.number > v_max) then
    v_max := :block.number;
end if;
next_record;
end loop;

字符串
为什么这么慢?即使检查一个有10条记录的块也需要很长时间。
或者有没有更简单的方法从块中的列中选择最大值?
先谢了,

2sbarzqh

2sbarzqh1#

在post_query触发器中,您可能有很多计算和额外的读取,这将对每一行执行。
或者,您可以设置块参数“FETCH ALL RECORDS=true”,并在post_query触发器中更新一个全局变量(在预查询触发器中已初始化为0)。
例如,pre_query:

:gobal.maxvalue := 0;

字符串
post_query(注意,这会对每一行执行):

if :block.number > :gobal.maxvalue then   
           :gobal.maxvalue := :block.number;
    end if;
    if :system.last_record = 'TRUE' then
       do something with :global.maxvalue;  -- we are on the last record of the query, so do something with the max value
    end if;


在此之后,您可以使用全局变量

wf82jlnq

wf82jlnq2#

第一个任务是在Block1中设置块参数"FETCH ALL RECORDS=true",就像其他用户回答的那样。第二个任务是创建一个新的控制块Block2,其中一列Max是数值。在计算属性设置中:计算模式=汇总,汇总函数= Max,汇总块= Block1,汇总项= ValueColumn No代码。

相关问题