У меня есть таблица из примерно миллиона строк, и мне нужно обновить каждую строку в таблице с результатом длинного вычисления (вычисление получает потенциально различный результат для каждой строки). Поскольку это занимает много времени, администратор базы данных должен иметь возможность контролировать выполнение. Этот конкретный расчет должен выполняться один раз в год (он делает итоги на конец года). Я хотел создать задание, используя DBMS_SCHEDULER.CREATE_JOB, которое получит 100 строк из таблицы, обновит их и затем остановит; при следующем выполнении задания будет выбрано место, где было прервано предыдущее выполнение.
Моей первой мыслью было включить этот код в конец моей хранимой процедуры:
-- update 100 rows, storing the primary key of the last
-- updated row in last_id
-- make a new job that will run in about a minute and will
-- start from the primary key value just after last_id
dbms_scheduler.create_job
( job_name=>'yearly_summary'
, job_type=>'STORED_PROCEDURE'
, job_action=>'yearly_summary_proc(' || last_id || ')'
, start_date=>CURRENT_TIMESTAMP + 1/24/60
, enabled=>TRUE
);
Но я получаю эту ошибку при запуске хранимой процедуры:
ORA-27486: insufficient privileges
ORA-06512: at "SYS.DBMS_ISCHED", line 99
ORA-06512: at "SYS.DBMS_SCHEDULER", line 262
ORA-06512: at "JBUI.YEARLY_SUMMARY_PROC", line 37
ORA-06512: at line 1
Предложения о других способах сделать это приветствуются. Я бы предпочел использовать DBMS_SCHEDULER, и я бы предпочел не создавать никаких таблиц; поэтому я передаю last_id хранимой процедуре.