PL / SQL: пока цикл не ожидает завершения внутренних процедур - PullRequest
1 голос
/ 12 октября 2019

Я пытаюсь запустить 4 разные процедуры в одной 'основной' процедуре, используя while loop . Мне нужен этот цикл while для работы в течение 5 минут (Условие).

Мой основной код процедуры:

PROCEDURE P_TEMP_MAIN IS
    -- Declare Variables
    l_start           NUMBER;
    v_loop_window     DATE;
    v_purge_year      NUMBER(4);
    v_increment_limit NUMBER(10):= 100000; -- LIMIT INCREMENT to be set
    v_counter         NUMBER:= 0;   
  BEGIN
    l_start      := DBMS_UTILITY.get_time;
    v_purge_year := F_TEMP_GET_YEAR();

    SELECT sysdate + interval '5' minute INTO v_loop_window from dual; -- Set the TIME INTERVAL for the purging activity

    WHILE (SYSDATE <= v_loop_window) LOOP

      P_TEMP_CHECK_MIN(v_purge_year);
      -- TO-DO: Check year before purging.    
      P_TEMP_PURGE(F_TEMP_GET_MIN(v_purge_year),F_TEMP_GET_MAX(v_purge_year,v_increment_limit),v_increment_limit);
      P_TEMP_UPDATE_MIN(v_purge_year,v_increment_limit);

      v_counter := v_counter + 1;   
    END LOOP;

    -- TO-DO: Include Output Logs. (Ex: Mails and output data like Rows updated and time taken)
    DBMS_OUTPUT.PUT_LINE('LOOP count = ' ||
                         (v_counter));
    DBMS_OUTPUT.PUT_LINE('Time taken = ' ||
                         (DBMS_UTILITY.get_time - l_start));

  END P_TEMP_MAIN; 

Вывод:

SQL> execute P_TEMP_MAIN;
LOOP count = 804361
Time taken = 30049 
PL/SQL procedure successfully completed

ПРИМЕЧАНИЕ : Процедура P_TEMP_PURGE занимает 2 минуты для запуска каждый раз.

Вопрос : Почему WHILE LOOP Цикл без ожидания завершения внутренних процедур?

1 Ответ

1 голос
/ 12 октября 2019

Ваша проблема связана с неправильным толкованием того, как DBMS_UTILITY.GET_TIME функционирует. Если мы посмотрим на описание из документации :

"Эта функция определяет текущее время в сотых долях секунды. Эта подпрограмма в основном используется для определения истекшего времени. Подпрограмма вызывается дважды- в начале и в конце некоторого процесса - и затем первое (более раннее) число вычитается из второго (более позднего) числа, чтобы определить прошедшее время. "

Итак, по вашим результатам, Время взято = 30049в сотых долях секунды. Вам нужно преобразовать это в минуты:

            30049/100/60 = 5.0081666 minutes.

Таким образом, ваше время правильно. Поскольку в вашем цикле while нет условной логики, кроме завершения в исключении, вызовы в цикле while будут выполняться всегда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...