Завершить текущий вызов процедуры sub - PullRequest
1 голос
/ 26 марта 2019

У меня есть процедура, которая будет вызывать другую процедуру, но иногда подпроцедура занимает более 2 минут или более. Я пытаюсь найти способ:

  • завершить вызванную подпроцедуру, если она все еще выполняется через 20 секунд
  • или принудительное выполнение подпроцесса RETURN для процедуры вызывающей стороны через 20 секунд

Есть ли способ добиться этого?

Функция вызывающего абонента:

 IF .... THEN ...
   l_result := PKG_B.TRXN_PROC (PI_QUOT_NUM => pi_quot_num );    
END IF;

1 Ответ

4 голосов
/ 26 марта 2019

Один из вариантов может состоять в том, чтобы запустить процедуру как фоновое задание с использованием dbms_scheduler, поспать 20 секунд и затем завершить работу.

dbms_scheduler.run_job('MY_JOB_NAME');
DBMS_LOCK.sleep(seconds => '20');
SELECT STATE INTO v_state FROM USER_SCHEDULER_JOBS
   WHERE JOB_NAME = 'MY_JOB_NAME';
IF v_state = 'RUNNING' THEN
   dbms_scheduler.STOP_JOB(job_name=>'MY_JOB_NAME',force=>true);
END IF;

Это просто для того, чтобы дать вам представление, а неполностью функциональный код.Рекомендуется добавить дополнительные проверки / исключения, если это необходимо.Также желательно проверять каждую секунду в цикле или около того, вместо того, чтобы ждать full 20 , выбор за вами.

Пользователю, выполняющему его, могут потребоваться следующие разрешения.

grant create job , manage scheduler to your_user;
grant execute on dbms_lock to your_user;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...