Один из вариантов может состоять в том, чтобы запустить процедуру как фоновое задание с использованием 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;