DDL-операторы в DBMS_JOB
Я пытаюсь запланировать работу, используя DBMS_JOB (я не могу использовать DBMS_SCHEDULER по соображениям безопасности), которая использует оператор DDL.
DECLARE
job_num NUMBER;
BEGIN
DBMS_JOB.SUBMIT(job => job_num,
what => 'BEGIN EXECUTE IMMEDIATE ''CREATE TABLE temp1 (ID NUMBER)''; END;'
);
DBMS_OUTPUT.PUT_LINE('JobID'||job_num);
DBMS_JOB.RUN(job_num);
END;
/
Не удается выполнить, выдавая мне сообщение об ошибке:
ORA-12011: сбой при выполнении 1 задания ORA-06512: в "SYS.DBMS_IJOB", строка 548 ORA-06512: в "SYS.DBMS_JOB", строка 278 ORA-06512: в строке 8
После удаления оператора DBMS_JOB.RUN() из анонимного блока я могу по крайней мере создать (и сохранить) задание. Когда я проверяю задание, он сохраняет его как код для выполнения BEGIN EXECUTE IMMEDIATE 'CREATE TABLE temp1 (id NUMBER) '; КОНЕЦ;
Если я выполняю его автономно, он, очевидно, выполняется. Единственный раз, когда это терпит неудачу, когда я пытаюсь выполнить все это через вызов DBMS_JOB.RUN().
Существует ли ограничение на использование операторов DDL в качестве параметра в DBMS_JOB? Я не могу найти указатель в документации для этого.
1 ответ
Повторяя мнение других комментаторов - создание таблиц на лету - это красный флаг, который часто указывает, что вам действительно следует использовать глобальные временные таблицы - пара вопросов.
- Есть ли причина, по которой вам нужно
DBMS_JOB.RUN
вызов? Ваш звонок вDBMS_JOB.SUBMIT
сообщает Oracle выполнить задание асинхронно, как только родительская транзакция фиксируется. Итак, обычно, вы бы позвонилиDBMS_JOB.SUBMIT
а затем просто `COMMIT'. - Имеет ли пользователь, отправляющий работу,
CREATE TABLE
привилегия предоставлена напрямую? Я предполагаю, что пользователь имеет толькоCREATE TABLE
привилегия предоставляется через роль. Это позволит вам запускать анонимный блок PL/SQL в интерактивном режиме, но не в работе. Если это так, вам понадобится администратор базы данных, чтобы предоставить вамCREATE TABLE
привилегия напрямую, а не через роль. - При сбое задания запись записывается в журнал предупреждений с сообщением об ошибке. Можете ли вы (или, что более вероятно, администратор БД) получить сообщение об ошибке и стек ошибок из журнала предупреждений и опубликовать его здесь (при условии, что это нечто иное, чем проблема привилегий из #2).