Oracle
 sql >> база данни >  >> RDS >> Oracle

DBMS_SCHEDULER.DROP_JOB само ако съществува

Има два основни модела, които можете да приложите за обработка на изключения; „погледни, преди да скочиш“ (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 е малко по-различно; дефинирайте свое собствено изключение от именуване на вътрешно дефинирано изключение и го инстанцирайте с кода за грешка, който искате да хванете. Ако след това се появи тази грешка, не правете нищо.

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;

Струва си да се отбележат две неща относно този втори метод.

  1. Аз съм само улавяне на грешката, предизвикана от това конкретно изключение. Би било възможно да се постигне същото с помощта на EXCEPTION WHEN OTHERS но силно препоръчвам срещу правейки това.

    Ако обработвате изключение, трябва да знаете точно какво ще правите с него. Малко вероятно е да имате способността да обработвате правилно всяко отделно изключение на Oracle, като използвате OTHERS и ако го направите, вероятно трябва да ги регистрирате някъде, където ще бъдат забелязани. За да цитирам насоки на Oracle за избягване и обработка на изключения :

  2. разпространение на изключения на Oracle работи от вътрешен блок към външен блок, така че първоначалната причина за грешката ще бъде първото изключение.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка (подзаявката с един ред връща повече от един ред)

  2. Функция JSON_OBJECT() в Oracle

  3. Как мога да получа разликата в часовете между две дати?

  4. просто произволно вземане на проби при изтегляне на данни от склад (oracle engine) с помощта на proc sql в sas

  5. UID – Връща ID на текущата сесия в Oracle