Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

DBMS_SCHEDULER.DROP_JOB chỉ khi tồn tại

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.

  1. 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 :

  2. 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng thủ tục được lưu trữ Oracle PL / SQL để cấp quyền trên bảng của người dùng khác

  2. Có thể đọc CLOB từ cơ sở dữ liệu Oracle từ xa không?

  3. Tại sao tôi không thể sử dụng một biến ràng buộc trong một câu lệnh thực thi ngay lập tức?

  4. Lỗi khôi phục giao dịch JDBC khi kết nối đã đóng

  5. Oracle Streams Step by Step Replication Ví dụ