【问题标题】:Loop over datablock extremely slow (oracle forms, pl/sql)循环数据块非常慢(oracle 形式,pl/sql)
【发布时间】:2014-02-17 14:05:23
【问题描述】:

我创建了一个小循环来从 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 条记录的块也需要很长时间。

或者有没有更简单的方法从块中的列中选择最大值?

提前致谢,

【问题讨论】:

  • 嗨!你不能修改块的默认位置吗?

标签: sql forms performance oracle plsql


【解决方案1】:

您的 post_query 触发器中可能有很多计算和额外的提取?这将针对每一行执行。

或者,您可以设置块参数“FETCH ALL RECORDS=true”,然后在 post_query 触发器中更新一个全局变量(您在预查询触发器中已将其初始化为 0)。

例如 预查询:

: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;

之后就可以使用全局变量了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 2023-04-01
    • 2020-12-31
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多