Ошибка при создании пакетного задания в Oracle: уже существует? - PullRequest
0 голосов
/ 15 ноября 2018


Я пытаюсь создать задание в моей базе данных Oracle, чтобы обновлять материализованное представление каждые пять минут.Вот код, который я сделал:

BEGIN
SYS.DBMS_SCHEDULER.create_job(
    job_name => 'refresh_cop_union',
    job_type => 'PLSQL_BLOCK',
    job_action => 'BEGIN DBMS_SNAPSHOT.REFRESH(''COP_UNION'',''C''); END;',
    start_date => SYSTIMESTAMP,
    repeat_interval => 'freq=minutely;interval=5',
    end_date => NULL,
    enabled => TRUE,
    auto_drop => FALSE,
    comments => 'Refresh COP_UNION matview'
);
END;
/

Когда я его выполнил, я получил следующую ошибку:

Отчет об ошибке -
ORA-27477: "MASTER_DB". "REFRESH_COP_UNION" уже существует
ORA-06512: в "SYS.DBMS_ISCHED", строка 175
ORA-06512: в "SYS.DBMS_SCHEDULER", строка 288
ORA-06512: в строке 2
27477. 00000 - "\"% s \ ". \"% S \ "уже существует"
* Причина: была предпринята попытка создать объект с именем, которое уже использовалось другим объектом в том жесхемы.
* Действие: Повторите команду, используя другое имя или схему.

Так что, похоже, в моей базе данных есть другой объект с тем же именем, возможно, другое задание.Поэтому я попытался выполнить следующий код, чтобы удалить его и заменить его новой версией:

BEGIN
  sys.dbms_scheduler.drop_job(job_name => 'refresh_cop_union');
END;
/

Но произошла ошибка со следующей ошибкой:

Отчет об ошибке -
ORA-27475: неизвестное задание "MASTER_DB". "REFRESH_COP_UNION"
ORA-06512: в "SYS.DBMS_ISCHED", строка 274
ORA-06512: в "SYS.DBMS_SCHEDULER", строка 753
ORA-06512: в строке 2
27475. 00000 - "неизвестно% s \"% s \ ". \"% S \ ""
* Причина: указанный объект не существует, привилегии не предоставлены илиобъект был неправильного типа.
* Действие: укажите объект правильного типа, для которого у вас есть права.

Что в основном говорит о том, что объект, который я пытаюсь удалить, не существует.Как это возможно?Как я могу найти этот объект, увидеть, что это такое, и в конце концов удалить его?Я также просмотрел все объекты, которые могут иметь похожее имя в моей базе данных: другие таблицы, представления, триггеры, но ничего не нашел.
Я попытался перечислить все имеющиеся у меня вакансии, чтобы найти мою с:

SELECT * FROM USER_JOBS
WHERE WHAT LIKE '%COP_UNION%';

Но ничего не обнаружилось.Есть идеи?

1 Ответ

0 голосов
/ 15 ноября 2018

Вы должны выбрать USER_SCHEDULER_JOBS вместо USER_JOBS:

SELECT * 
FROM USER_SCHEDULER_JOBS
where JOB_NAME LIKE '%COP_UNION%';

DBMS_SCHEDULER являются (новыми) заданиями планировщика , тогда как (старые) заданий поддерживаются пакетом DBMS_JOB

Похоже, задание планировщика не должно иметь того же имени, что и любой другой объект. Проверьте с

SELECT * 
FROM ALL_OBJECTS 
WHERE OBJECT_NAME LIKE '%COP_UNION%';

и выбрал другое имя.

Кажется, что это ошибка ( Ошибка 4055853 ) в Oracle. Согласно Oracle решение / обходной путь -

Изменение имени задания, чтобы оно отличалось от любого объекта, принадлежащего пользователь будет обходить проблему.

...