sql >> Databáze >  >> RDS >> Oracle

Zpracování výjimek vnořených procedur Pl/SQL

Chcete-li zobrazit přesná vysvětlení „co se stane se serverem“ pro aplikační úroveň, můžete zkusit následující. V postupech:

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 v postupu nejvyšší úrovně:

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 výjimce v p1 uvidíte něco takového:

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"

Třetí parametr procedury raise_application_error s false hodnota vymaže všechny předchozí chybové zprávy. Pokud použijete false hodnotu v proceduře p3 , zobrazí se pouze jedna chybová zpráva s kódem ORA-20003 v tomto příkladu.

P. S. Můžete také definovat své vlastní výjimky a použít je v WHEN .. THEN doložka. Zde najdete další informace a příklady:https:/ /docs.oracle.com/cd/B28359_01/appdev.111/b28370/errors.htm#LNPLS00704

P. P. S. Jak se přihlásit. Postup protokolu:

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;

Postup protokolu hovorů:

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



  1. Jaký je doporučený způsob ukládání aktuálního času pomocí PHP a MySQL?

  2. Vyhnutí se přeskočení řádku Metodou next() sady ResultSet

  3. YEAR() Příklady v SQL Server (T-SQL)

  4. zkontrolujte, zda sloupec obsahuje VŠECHNY hodnoty jiného sloupce - Mysql