Цикл блока данных корыта с истекшим временем - PullRequest
0 голосов
/ 24 апреля 2019

Я использую Oracle Forms 10g в базе данных Oracle версии 7. У меня есть блок данных, который обновляется (новый 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 голосов
/ 24 апреля 2019

Почему это медленно? Кто знает ... Все, что мы можем сделать, это слепо угадывать и все же быть ОЧЕНЬ далеки от реальной причины. Слишком мало данных для вычисления. Я бы посоветовал вам запустить форму в режиме отладки (поскольку формы 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? Вау!)

...