Làm thế nào để bắt và xử lý chỉ các ngoại lệ cụ thể của Oracle?


20

Từ điều nàyđiều này tôi đoán, rằng không có Ngoại lệ hệ thống được đặt tên trước cho ORA-00955.

Làm cách nào tôi có thể viết lại phần sau để chỉ bắt lỗi ORA-00955?

begin
      EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
exception when OTHERS then
    Null;
end;

BTW Có cú pháp nào để bắt lỗi chỉ bằng cách cung cấp mã lỗi không?

Câu trả lời:


33

Bạn có hai lựa chọn:


Tham khảo ngoại lệ trực tiếp theo số:

BEGIN
    EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
EXCEPTION
    WHEN OTHERS THEN
      IF SQLCODE = -955 THEN
        NULL; -- suppresses ORA-00955 exception
      ELSE
         RAISE;
      END IF;
END; 

Tùy chọn khác là sử dụng EXCEPTION_INITchỉ thị thực dụng để liên kết một số lỗi Oracle đã biết với ngoại lệ do người dùng xác định;

DECLARE
   name_in_use exception; --declare a user defined exception
   pragma exception_init( name_in_use, -955 ); --bind the error code to the above 
BEGIN
    EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
EXCEPTION
    when name_in_use then
       null; --suppress ORA-00955 exception
END; 

BTW Có cú pháp nào để bắt lỗi chỉ bằng cách cung cấp mã lỗi không?

Vâng, tôi đã chứng minh điều đó trong ví dụ đầu tiên

Đọc thêm cho các biến thể về điều này:


1
Tôi không thể đi mà không đi khi người khác nâng cao?
bernd_k

@bernd_k vâng, bạn làm điều đó, tuy nhiên nó là một ngoại lệ chưa được xử lý
Sathyajith Bhat

2
Vui lòng thêm mức tăng trong KHI NGƯỜI KHÁC của bạn khi sqlcodeKHÔNG phải là 955 =)
Vincent Malgrat

OP vẫn có thể muốn có các lỗi khác được nêu ra. Khối ngoại lệ của bạn "nguyên trạng" hoạt động chính xác như một KHI NGƯỜI KHÁC THÌ NULL. Tôi nghĩ OP muốn một cái gì đó chính xác và tinh tế hơn một chút.
Vincent Malgrat

@VincentMalgrat Bạn đã đúng.
Sathyajith Bhat

5

Tương tự như những gì Sathya đã đề xuất, nhưng tôi muốn tránh when othershoàn toàn nếu có thể - một ngoại lệ chưa được xử lý thường là kết quả chính xác cho các trường hợp ngoại lệ mà bạn không xử lý cụ thể:

create sequence foo;
/*
sequence FOO created.
*/
declare
  name_is_already_used_955 exception;
  pragma exception_init(name_is_already_used_955,-955);
begin
  execute immediate 'create sequence foo';
exception when name_is_already_used_955 then null;
end;
/
/*
anonymous block completed
*/

Đó chính xác là những gì tôi cô đọng từ đề xuất của Sathyas.
bernd_k
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.