我试图在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%';
但是什么都没出现。有想法吗?
答案 0 :(得分:1)
您必须选择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%';
并选择了其他名称。
似乎是Oracle中的错误(Bug 4055853)。根据Oracle的说法,解决方案/解决方法是
更改工作名称,使其与 用户将解决此问题。
答案 1 :(得分:0)
在我的情况下,由于作业正在运行而发生错误。应该检查USER_SCHEDULER_RUNNING_JOBS
。
DECLARE
v_count NUMBER;
v_job_name VARCHAR2(30) := 'BP_SCHEMA_STATS';
BEGIN
SELECT count(*) INTO v_count FROM user_scheduler_running_jobs WHERE job_name = v_job_name;
IF v_count = 1 THEN
NULL; -- job is running
ELSE
DBMS_SCHEDULER.CREATE_JOB (
JOB_NAME => v_job_name,
JOB_TYPE => 'PLSQL_BLOCK',
JOB_ACTION => 'BEGIN dbms_stats.gather_schema_stats(SYS_CONTEXT(''USERENV'',''CURRENT_SCHEMA'')); END;',
ENABLED => TRUE);
END IF;
END;
/
答案 2 :(得分:0)
我遇到了类似的问题,并在开发人员的帮助下设法解决了这个问题。 我放下一个程序包,然后尝试为dbms_scheduler作业重用相同的名称,但是作业创建失败,并出现相同的错误ORA-27475 ...
解决方案:
运行此查询:
select * from OBJ$ where name = 'REFRESH_COP_UNION';
如果找到任何记录(通常为2行),请查找名为TYPE#的列。如果值为10,则表示该对象已删除,但名称保留重用。显然,DBMS_SCHEDULER软件包不知道如何重新使用删除的软件包名称。显然这是一个Oracle错误。
解决方法是创建然后删除具有相同名称的表:
create table "MASTER_DB"."REFRESH_COP_UNION" (id number);
drop table "MASTER_DB"."REFRESH_COP_UNION";
此后,作业创建将正常进行。 有用的链接:https://gotodba.com/2018/06/28/non-existent-objects-and-possibly-a-bug/
答案 3 :(得分:0)
问题可能是由于您可能拥有名称为 REFRESH_COP_UNION
的存储过程或函数。