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

Xử lý ngoại lệ thủ tục lồng nhau Pl / SQL

Để hiển thị giải thích chính xác về "điều gì xảy ra với máy chủ" cho cấp ứng dụng, bạn có thể thử làm theo. Trong các thủ tục:

create or replace procedure p1 is
...
exception
  when <some_error> then
    <do something>
    -- re-raise error:
    raise_application_error(-20001, 'Client with ID '|| ID || ' has no right to perform action "' || ACTION_NAME || '"', true);
end;

create or replace procedure p2 is
begin
  p1;
exception
  when <another_error> then
    <do something>
    -- re-raise error:
    raise_application_error(-20002, 'Action "' || ACTION_NAME || '" is not completed', true);
end;

create or replace procedure p3 is
begin
  p2;
exception
  when <another_error> then
    <do something>
    -- re-raise error:
    raise_application_error(-20003, 'Purchasing of "' || CAR_NAME || '" cancelled', true);
end;

Và trong thủ tục cấp cao nhất:

create or replace procedure top_level_procedure is
begin
  p1;
exception
  when <one_more_error> then
    <do something>
    raise_application_error(-20004, dbms_utility.format_error_backtrace);
end;

Sau ngoại lệ trong p1 bạn sẽ thấy một cái gì đó như thế này:

ORA-20003: Purchasing of "Cool red Ferrari" cancelled
ORA-20002: Action "car purchase" is not completed
ORA-20001: Client with ID 123 has no right to perform action "Spent all money of Bill Gates"

Tham số thứ ba của thủ tục raise_application_error với false giá trị cắt tất cả các thông báo lỗi trước đó. Nếu bạn sử dụng giá trị sai trong thủ tục p3 , bạn sẽ chỉ thấy một thông báo lỗi có mã ORA-20003 trong ví dụ này.

P. S. Ngoài ra, bạn có thể xác định các ngoại lệ của riêng mình và sử dụng chúng trong WHEN .. THEN mệnh đề. Tại đây, bạn tìm thấy thêm thông tin và ví dụ: https:/ /docs.oracle.com/cd/B28359_01/appdev.111/b28370/errors.htm#LNPLS00704

P. P. S. Cách đăng nhập. Thủ tục ghi nhật ký:

create or replace procedure log(p_log_message varchar2) is
pragma autonomous_transaction;
begin
  insert into log_table(..., log_message) values (..., p_log_message);
  commit;
end;

Thủ tục nhật ký cuộc gọi:

  when <one_more_error> then
    <do something>
    log(..., dbms_utility.format_error_backtrace);
    raise_application_error(-20004, dbms_utility.format_error_backtrace);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lưu trữ Mảng có thể tìm kiếm trong trường cơ sở dữ liệu SQL

  2. Tạo tất cả các kết hợp có thể có của các chuỗi có độ dài nhất định trong oracle

  3. Làm cách nào để tạo một bảng có các ràng buộc trong khi lấy dữ liệu từ một bảng khác

  4. Lỗi cú pháp trong câu lệnh SQL ngoại lệ ném từ khóa “WITH”

  5. Làm cách nào để lấy thông tin theo dõi cho các biến ràng buộc được chuyển qua OracleParameter trong ODP.NET?