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 ответ

Решение

Повторяя мнение других комментаторов - создание таблиц на лету - это красный флаг, который часто указывает, что вам действительно следует использовать глобальные временные таблицы - пара вопросов.

  1. Есть ли причина, по которой вам нужно DBMS_JOB.RUN вызов? Ваш звонок в DBMS_JOB.SUBMIT сообщает Oracle выполнить задание асинхронно, как только родительская транзакция фиксируется. Итак, обычно, вы бы позвонили DBMS_JOB.SUBMIT а затем просто `COMMIT'.
  2. Имеет ли пользователь, отправляющий работу, CREATE TABLE привилегия предоставлена ​​напрямую? Я предполагаю, что пользователь имеет только CREATE TABLE привилегия предоставляется через роль. Это позволит вам запускать анонимный блок PL/SQL в интерактивном режиме, но не в работе. Если это так, вам понадобится администратор базы данных, чтобы предоставить вам CREATE TABLE привилегия напрямую, а не через роль.
  3. При сбое задания запись записывается в журнал предупреждений с сообщением об ошибке. Можете ли вы (или, что более вероятно, администратор БД) получить сообщение об ошибке и стек ошибок из журнала предупреждений и опубликовать его здесь (при условии, что это нечто иное, чем проблема привилегий из #2).
Другие вопросы по тегам