oracle – DBMS_SCHEDULER.DROP_JOB只有存在

前端之家收集整理的这篇文章主要介绍了oracle – DBMS_SCHEDULER.DROP_JOB只有存在前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个sql脚本,我必须在导入转储后运行.除了其他的脚本,它执行以下操作:
BEGIN 
--remove program          
SYS.DBMS_SCHEDULER.DROP_PROGRAM(program_name=>'STATISTICS_COLUMNS_PROG',FORCE=>TRUE);
--remove job
SYS.DBMS_SCHEDULER.DROP_JOB (job_name => 'STATISTICS_COLUMNS_JOB');
END;

在原始模式中,工作已经被删除了,转储没有作业,脚本失败:

ERROR at line 1:
ORA-27475: "DMP_6633.STATISTICS_SET_COLUMNS_JOB" must be a job 
ORA-06512: at "SYS.DBMS_ISCHED",line 213 
ORA-06512: at "SYS.DBMS_SCHEDULER",line 657 
ORA-06512: at line 5

如果工作不存在但如果仍然可以删除,我该如何避免这种失败?

有两种主要的模式可以应用于异常处理; (LBYL),“请求宽恕比许可更容易”(EAFP).在尝试放弃之前,LBYL将主张检查该作业是否存在. EAFP将涉及尝试放弃该作业,然后捕获并忽略该特定错误(如果发生).

如果您要应用LBYL,您可以查询系统视图USER_SCHEDULER_JOBS查看您的作业是否存在.如果这样做,请放下.

declare
   l_job_exists number;
begin
   select count(*) into l_job_exists
     from user_scheduler_jobs
    where job_name = 'STATISTICS_COLUMNS_JOB'
          ;

   if l_job_exists = 1 then
      dbms_scheduler.drop_job(job_name => 'STATISTICS_COLUMNS_JOB');
   end if;
end;

对于EAFP它略有不同; define your own exception by naming an internally defined exception,并将其与正在寻找的错误代码进行实例化.如果那个错误然后被提出,什么都不做.

declare
   job_doesnt_exist EXCEPTION;
   PRAGMA EXCEPTION_INIT( job_doesnt_exist,-27475 );
begin
   dbms_scheduler.drop_job(job_name => 'STATISTICS_COLUMNS_JOB');
exception when job_doesnt_exist then
   null;
end;

值得注意的是关于第二种方法的两件事情.

>我只是捕捉到这个特定异常提出的错误.使用EXCEPTION WHEN OTHERS可以实现同样的事情,但我强烈建议不要这样做.

如果你处理一个例外,你应该知道你将要做的事情.您不可能使用OTHERS正确处理每一个Oracle异常,并且如果您这样做,您应该将它们记录在他们会被注意的地方.引用Oracle的Guidelines for Avoiding and Handling Exceptions

Whenever possible,write exception handlers for named exceptions instead of using OTHERS exception handlers.

> Oracle的exception propagation工作从内部块到外部块,所以原来的错误原因将是第一个例外.

原文链接:https://www.f2er.com/oracle/204921.html

猜你在找的Oracle相关文章