具有不同时间的循环槽数据块

时间:2019-04-24 14:07:01

标签: oracle oracle10g oracleforms

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

1。一个按钮如何实现:

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触发器) ,但是同一过程的第二次调用非常快。 这种行为的原因是什么?是否有最快的方法将焦点放在之前选择的同一条记录上?

1 个答案:

答案 0 :(得分:0)

为什么慢?谁知道呢...我们所能做的就是盲目猜测,并且与实际原因相距甚远。要计算的数据太少。我建议您在调试模式下运行该表单(如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版?哇!)