【问题标题】:Error when creating a batch job in Oracle: already exists?在 Oracle 中创建批处理作业时出错:已经存在?
【发布时间】: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

标签: database oracle jobs


【解决方案1】:

问题可能是由于您可能有一个名为 REFRESH_COP_UNION 的存储过程或函数。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,并在我的开发伙伴的帮助下设法解决了它。 我删除了一个包,然后尝试为 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】:

      在我的情况下,由于作业正在运行而发生错误。应该检查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;
      /
      

      【讨论】:

        【解决方案4】:

        您必须选择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)。根据甲骨文的解决方案/解决方法是

        将作业名称更改为不同于该作业拥有的任何对象 用户将解决该问题。

        【讨论】:

        • 我不知道这个区别,感谢您指出,但不幸的是,如果我执行SELECT * FROM USER_SCHEDULER_JOBS,只会显示三个作业,并且没有一个被命名为我要创建的作业,所以我得到的错误仍然无法解释。
        • 你试过ALL_SCHEDULER_JOBS甚至DBA_SCHEDULER_JOBS吗?
        • 是的,还是我之前提到的三份工作,没有我要找的名字。
        • 更改作业的名称使其工作。感谢您的帮助。
        猜你喜欢
        • 2010-09-08
        • 1970-01-01
        • 2010-11-07
        • 2017-02-16
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 2020-02-23
        相关资源
        最近更新 更多