Oracle
 sql >> база данни >  >> RDS >> Oracle

Pl/SQL обработка на изключения от вложена процедура

За да покажете точни обяснения на "какво се случва със сървър" за ниво на приложение, можете да опитате да следвате. В процедури:

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 с false стойност изрязва всички предишни съобщения за грешка. Ако ще използвате невярна стойност в процедурата p3 , ще видите само едно съобщение за грешка с код ORA-20003 в този пример.

P. S. Също така можете да дефинирате свои собствени изключения и да ги използвате в WHEN .. THEN клауза. Тук ще намерите повече информация и примери:https:/ /docs.oracle.com/cd/B28359_01/appdev.111/b28370/errors.htm#LNPLS00704

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. shell скрипт за намиране на име на файл и брой редове на всеки файл, сега вмъкнете този запис в таблицата на Oracle

  2. Има ли начин да се съхранява Unicode текст в база данни на Oracle, конфигурирана като 'US7ASCII'

  3. SQL не е валиден месец

  4. Работата ми със 11g Optimizer Stats се отказа от мен – коригирано

  5. Какво представляват скритите полета на Oracle?