代码之家  ›  专栏  ›  技术社区  ›  Rexam

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

  •  0
  • Rexam  · 技术社区  · 7 年前


    我试图在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:“主数据库”“刷新COP联合”已存在
    ORA-06512:“系统数据库管理系统”第175行

    ORA-06512:在第2行
    27477.00000-“\%s\”\%s\“已存在”
    *原因:试图创建名称为的对象 已被同一架构中的另一个对象使用。

    因此,我的数据库中似乎有另一个同名对象,可能是另一个作业。因此,我尝试执行以下代码将其删除并替换为新版本:

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

    但它失败了,出现以下错误:


    ORA-27475:未知作业“主数据库”。“刷新COP联合”
    ORA-06512:“系统数据库管理系统”第274行
    ORA-06512:在“SYS.DBMS_调度程序”第753行
    ORA-06512:在第2行

    或者对象的类型不正确。
    *操作:指定您具有权限的正确类型的对象。


    我试图列出我所有的工作,以便找到我的工作:

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

    1 回复  |  直到 7 年前
        1
  •  3
  •   Wernfried Domscheit    7 年前

    您必须选择 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%';
    

    Bug 4055853 )在甲骨文中。根据Oracle的说法,解决方案/解决方案是

    将作业名称更改为不同于 用户将解决该问题。

        2
  •  0
  •   Jakub P    5 年前

    在我的例子中,发生错误是因为作业正在运行。我们应该检查一下 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;
    /
    
        3
  •  0
  •   NebojÅ¡a Stanković    5 年前

    我有一个类似的问题,并设法解决它的帮助下,我的同事开发。 我删除了一个包,然后尝试为dbms_调度程序作业重新使用相同的名称,但作业创建失败,出现了相同的错误ORA-27475。。。

    解决方案:

    1. 运行此查询:

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

    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/

        4
  •  0
  •   buddemat nerdWannabe    4 年前

    REFRESH_COP_UNION .