Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Obsługa wyjątków procedur zagnieżdżonych Pl/SQL

Aby pokazać dokładne wyjaśnienia "co dzieje się z serwerem" dla poziomu aplikacji, możesz spróbować śledzić. W procedurach:

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;

A w procedurze najwyższego poziomu:

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;

Po wyjątku w p1 zobaczysz coś takiego:

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"

Trzeci parametr procedury raise_application_error z false value wycina wszystkie poprzednie komunikaty o błędach. Jeśli użyjesz wartości false w procedurze p3 , zobaczysz tylko jeden komunikat o błędzie z kodem ORA-20003 w tym przykładzie.

PS. Możesz także zdefiniować własne wyjątki i używać ich w WHEN .. THEN klauzula. Tutaj znajdziesz więcej informacji i przykładów:https:// /docs.oracle.com/cd/B28359_01/appdev.111/b28370/errors.htm#LNPLS00704

P. P. S. Jak się zalogować. Procedura rejestrowania:

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;

Procedura rejestru połączeń:

  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. Oracle:Jak stworzyć funkcję zwracającą wartości dla zakładki SELECT * FROM WHERE nazwa IN (function())

  2. Wykonywanie skryptu SQL w Oracle db po jednej instrukcji na raz

  3. Oracle DBMS_LOB.INSTR i zawiera wydajność

  4. Transformacja wierszy Oracle do kolumny

  5. Oracle ODP.NET wersja agnostyczna alternatywa