【问题标题】:Loop trough data block with different time elapsed循环遍历具有不同经过时间的数据块
【发布时间】:2019-04-25 02:17:52
【问题描述】:

我在 Oracle 数据库版本 7 上使用 Oracle Forms 10g。 我有一个数据块,它通过两种不同的方式刷新(新的 execute_query):

1.A按钮如何实现:

PROCEDURE refresh
IS
   ID   NUMBER;
BEGIN
   ID := :myblock.id;
   GO_BLOCK ('myBlock');
   EXECUTE_QUERY;
   -- Keep the record selected after the refresh
   POSITION (ID);
END;

PROCEDURE POSITION (ID IN NUMBER)
IS
   L_record   NUMBER (5) := NULL;
BEGIN
   GO_BLOCK ('myBlock');
   GO_ITEM ('myBlock.ID');

   FIRST_RECORD;

   LOOP

      IF :myblock.id = myID THEN
         L_record := GET_BLOCK_PROPERTY ('myBlock', CURRENT_RECORD);
      END IF;

      EXIT WHEN :SYSTEM.LAST_RECORD = 'TRUE' OR :myblock.ID = myID;
      NEXT_RECORD;
   END LOOP;

   IF L_record IS NOT NULL THEN
      GO_RECORD (L_record);
   END IF;
END;

2.另一个是另一个按钮:

PROCEDURE newRefresh
IS
   ID   NUMBER;
BEGIN
   ID := :myblock.id;
   refresh;
   POSITION (ID);
END;

忽略这两个按钮的原因,我的问题是当我调用第二个按钮时,POSITION 过程的第一次调用耗时太长(因为我们有很多记录和POST_QUERY 触发器),但是第二个相同程序的调用速度非常快。 这种行为的原因是什么?有没有最快的方法将焦点定位在之前选择的同一条记录上?

【问题讨论】:

    标签: oracle oracle10g oracleforms


    【解决方案1】:

    为什么慢?谁知道……我们所能做的就是盲目猜测,离实际原因还很远。数据太少,无法计算。我建议你在调试模式下运行表单(因为 Forms 10g 允许它)并跟踪它的执行以查看发生了什么。

    定位更快:考虑这种方法:

    • 创建一个参数,我们称之为position
    • 刷新按钮会:

      -- save current position
      :parameter.position := :system.trigger_record;
      
      go_block('myBlock');
      execute_query;
      
      -- go to previously saved position
      go_record(:parameter.position);
      

    (顺便说一句,您真的使用的是 Oracle 数据库 7.x 版吗?哇!)

    【讨论】:

    • (顺便说一句,你真的在​​使用 Oracle 数据库 7.x 版吗?哇!) -> 是的... :( 不是我的错!
    • 没问题。我们仍然有 Digital Alpha 服务器,在 OpenVMS 下运行,带有 Oracle 7.1 数据库。我想它会工作得很好,只要我们启动它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    相关资源
    最近更新 更多