2013-11-24 27 views
12

Bir dökümü içe aktardıktan sonra çalıştırmam gereken bir sql komut dosyası var. Kabuk programı diğer şeyler arasında, o şunları yapar: DBMS_SCHEDULER.DROP_JOB yalnızca varsa

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; 

Somtimes iş zaten orijinal şemada düştü

, döküm iş olmadan gelir ve komut başarısız:

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 

Nasıl İşin olmaması durumunda bu başarısızlıktan kaçınıyorum, ancak yine de düşebilir mi?

cevap

28

İstisna işlemeye uygulanabilecek iki ana kalıp vardır; "sıçramaya başlamadan önce" (LBYL) ve "izin istemekten af ​​dilemek daha kolay" (EAFP). LBYL, işi bırakmaya çalışmadan önce işin olup olmadığını kontrol etmeyi savunur. EAFP, işi bırakmaya ve daha sonra gerçekleşirse, belirli bir hatayı yakalamaya ve göz ardı etmeye çalışmayı içerecektir.

LBYL'yi uygularsanız, işinizin olup olmadığını görmek için sistem görünümünü USER_SCHEDULER_JOBS sorgulayabilirsiniz. Eğer varsa, bırakın.

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 için biraz farklıdır; define your own exception tarafından naming an internally defined exception ve yakalamak istediğiniz hata koduyla eşleştiriliyor. Bu hata yükseltilirse, hiçbir şey yapmayın.

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; 

Bu ikinci yöntem hakkında iki şey farketmeye değer.

  1. Ben sadece bu özel istisna tarafından gündeme hatayı yakalamak değilim. EXCEPTION WHEN OTHERS kullanarak aynı şeyi elde etmek mümkün olurdu ama bunu karşı tavsiye ederim.

    Bir özel durumla başa çıkacak olursanız, bununla tam olarak ne yapacağınızı bilmelisiniz. Her bir Oracle istisnasını, OTHERS'u kullanarak düzgün bir şekilde işleme kabiliyetine sahip olmanız pek olası değildir ve eğer bunu yaparsanız, muhtemelen fark edilecekleri bir yere giriş yapmalısınız. Oracle'ın Guidelines for Avoiding and Handling Exceptions alıntı için:

    Mümkün olduğunda, yerine DİĞERLERİ istisna işleyicileri kullanarak adlandırılmış istisnalar istisna işleyicileri yazma. Dış bloğa iç bloktan

  2. Oracle'ın exception propagation eserler hata için orijinal nedeni ilk istisna olacak böylece.

+1

Keşke bu cevabı iki kez oylayabilseydim! –

+0

Teşekkürler! Bu bir Pazar, daha fazla zaman ... ve daha önce biraz önce bunu yazdım. – Ben

+1

Bu, profesyonel bir cevabın nasıl göründüğüne gerçekten iyi bir örnek! Mükemmel yanıt için teşekkürler! – SaschaM78