Để 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);