アプリケーションレベルで「サーバーで何が起こるか」の正確な説明を表示するには、次のことを試してください。手順:
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;
そしてトップレベルの手順:
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;
p1
の例外の後 次のようなものが表示されます:
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"
プロシージャraise_application_error
の3番目のパラメータ false
を使用 valueは、以前のすべてのエラーメッセージをカットします。手順p3
でfalse値を使用する場合 、コードORA-20003
のエラーメッセージが1つだけ表示されます。 この例では。
P. S.また、独自の例外を定義して、WHEN .. THEN
で使用することもできます。 句。詳細と例は次のとおりです。
P.P.S.ログに記録する方法。ログ手順:
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;
通話記録手順:
when <one_more_error> then
<do something>
log(..., dbms_utility.format_error_backtrace);
raise_application_error(-20004, dbms_utility.format_error_backtrace);