【发布时间】:2019-04-18 08:21:37
【问题描述】:
我正在尝试在我的 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%';
但是什么也没出现。有什么想法吗?
【问题讨论】:
-
我看过一次。可能是作业正在运行并已冻结。您丢弃了它,它被“丢弃”了,但不能重新创建,因为可以说它仍在“运行”。试试 dbms_scheduler.drop_job(job_name => 'refresh_cop_union', force=>TRUE)
-
感谢@MiroslavDuník 的评论,但不幸的是它没有用。它显示了与您在上面看到的相同的错误。对象似乎仍然不存在。
-
有没有办法查看通过命令查询
SELECT * FROM USER_JOBS获得的作业的名称? -
在我的情况下,错误是因为作业正在执行,正在运行,所以应该检查
user_scheduler_running_jobs