在Oracle中创建批处理作业时出错:已经存在?

时间:2018-11-15 09:13:46

标签: database oracle jobs


我试图在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%';

但是什么都没出现。有想法吗?

4 个答案:

答案 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 ...

解决方案:

  1. 运行此查询:

    select * from OBJ$ where name = 'REFRESH_COP_UNION';

    如果找到任何记录(通常为2行),请查找名为TYPE#的列。如果值为10,则表示该对象已删除,但名称保留重用。显然,DBMS_SCHEDULER软件包不知道如何重新使用删除的软件包名称。显然这是一个Oracle错误。

  2. 解决方法是创建然后删除具有相同名称的表:

    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 的存储过程或函数。