Có hai mẫu chính bạn có thể áp dụng để xử lý ngoại lệ; "hãy nhìn trước khi bạn nhảy" (LBYL) và "dễ dàng xin sự tha thứ hơn là xin phép" (EAFP). LBYL sẽ ủng hộ việc kiểm tra xem công việc có tồn tại hay không trước khi cố gắng từ bỏ nó. EAFP sẽ liên quan đến việc cố gắng bỏ công việc, sau đó nắm bắt và bỏ qua lỗi cụ thể đó, nếu nó xảy ra.
Nếu bạn áp dụng LBYL, bạn có thể truy vấn chế độ xem hệ thống USER_SCHEDULER_JOBS
để xem liệu công việc của bạn có tồn tại hay không. Nếu có, hãy thả nó xuống.
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;
Đối với EAFP thì hơi khác; xác định ngoại lệ của riêng bạn bởi đặt tên cho một ngoại lệ được xác định nội bộ và khởi tạo nó bằng mã lỗi mà bạn đang tìm cách bắt. Nếu lỗi đó sau đó được nâng lên, không làm gì cả.
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;
Cần lưu ý hai điều về phương pháp thứ hai này.
-
Tôi là chỉ bắt lỗi do ngoại lệ cụ thể này đưa ra. Có thể đạt được điều tương tự bằng cách sử dụng
EXCEPTION WHEN OTHERS
nhưng tôi thực sự khuyên bạn nên chống lại đang làm điều này.Nếu bạn xử lý một ngoại lệ, bạn nên biết chính xác những gì bạn sẽ làm với nó. Không chắc bạn có khả năng xử lý mọi ngoại lệ Oracle đúng cách bằng cách sử dụng
OTHERS
và nếu bạn làm như vậy, bạn có thể nên ghi lại chúng ở đâu đó mà chúng sẽ được chú ý. Trích dẫn từ Nguyên tắc Tránh và Xử lý Ngoại lệ của Oracle : -
Oracle của truyền ngoại lệ hoạt động từ khối bên trong sang khối bên ngoài nên nguyên nhân ban đầu gây ra lỗi sẽ là ngoại lệ đầu tiên.