Ada dua pola utama yang dapat Anda terapkan pada penanganan pengecualian; "lihat sebelum Anda melompat" (LBYL) dan "lebih mudah meminta maaf daripada izin" (EAFP). LBYL akan menganjurkan pemeriksaan untuk melihat apakah pekerjaan itu ada sebelum mencoba untuk menghentikannya. EAFP akan melibatkan upaya untuk menghentikan pekerjaan dan kemudian menangkap dan mengabaikan kesalahan tertentu, jika itu terjadi.
Jika Anda menerapkan LBYL, Anda dapat menanyakan tampilan sistem USER_SCHEDULER_JOBS
untuk melihat apakah pekerjaan Anda ada. Jika ya, jatuhkan.
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;
Untuk EAFP sedikit berbeda; menentukan pengecualian Anda sendiri oleh memberi nama pengecualian yang ditentukan secara internal dan membuat instance dengan kode kesalahan yang ingin Anda tangkap. Jika kesalahan itu kemudian dimunculkan, jangan lakukan apa pun.
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;
Ada dua hal yang perlu diperhatikan tentang metode kedua ini.
-
Saya hanya menangkap kesalahan yang ditimbulkan oleh pengecualian khusus ini. Hal yang sama dapat dicapai dengan menggunakan
EXCEPTION WHEN OTHERS
tapi saya sangat merekomendasikan melawan melakukan ini.Jika Anda menangani pengecualian, Anda harus tahu persis apa yang akan Anda lakukan dengannya. Sepertinya Anda tidak memiliki kemampuan untuk menangani setiap pengecualian Oracle dengan benar menggunakan
OTHERS
dan jika Anda melakukannya, Anda mungkin harus mencatatnya di suatu tempat di mana mereka akan diperhatikan. Mengutip dari Oracle Pedoman untuk Menghindari dan Menangani Pengecualian : -
propagasi pengecualian Oracle bekerja dari blok internal ke blok eksternal sehingga penyebab awal kesalahan akan menjadi pengecualian pertama.