2009-10-19 11 views
12

Pracuję nad skryptem pl-sql, w którym mam około 10 konwersji TO_CHAR.Czy istnieje sposób uzyskania numeru wiersza, w którym został zgłoszony wyjątek?

Jeden rzuca wyjątek

ORA-06502: PL/SQL: numeric or value error: character string buffer too small 

.

Obecnie im zalogowaniu komunikat ten kawałek kodu

EXCEPTION 
    WHEN OTHERS THEN 
    DBMS_OUTPUT.put_line('Exception message is '||SQLERRM(sqlcode)); 
    ROLLBACK; 

Chciałbym dodać (głównie do celów debugowania) linię gdzie jest wyjątek, aby odbierać wiadomości w formularz

ORA-06502: PL/SQL: numeric or value error: character string buffer too small (at line x) 

Czy istnieje prosty sposób na zrobienie tego?

Odpowiedz

0

Możesz umieścić swój wyjątek wokół każdego wyciągu.

9

W odpowiedziach podano zarówno $$PLSQL_LINE & DBMS_UTILITY.FORMAT_ERROR_BACKTRACE. Ale chciałbym dodać trochę o różnicach między nimi:

  1. Predefined Inquiry Directives$$PLSQL_LINE & $$PLSQL_UNIT
    PLSQL_LINE dyrektywa predefiniowane zapytanie jest PLS_INTEGER dosłowna wartość wskazującą numer linii odniesienia do $$ PLSQL_LINE w jednostce aktualnej programu.
    Z definicji PLSQL_LINE nie nadaje się do rejestrowania wyjątków, ponieważ podaje numer wiersza wyjątku, a nie numer wiersza samego błędu. To sprawia, że ​​trudno jest wykryć lokalizację błędu, szczególnie w przypadku dużych jednostek programowych, chyba że zawiniesz każdą instrukcję za pomocą obsługi wyjątku, o czym wspomniał Jeffrey.
    Jednak dobrą rzeczą w PLSQL_LINE jest liczba bez potrzeby ekstrakcji lub parsowania. Dlatego może być bardziej odpowiedni do innych celów rejestracyjnych.
  2. DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
    Ta procedura wyświetla stos wywołań w punkcie, w którym został zgłoszony wyjątek, nawet jeśli procedura jest wywoływana z procedury obsługi wyjątku w zewnętrznym zasięgu.
    Zaletą korzystania z tej procedury jest podanie dokładnego numeru linii w programie, w którym występuje błąd , a nie w miejscu, w którym pojawia się wywołanie procedury. Jednak procedura zwraca ciąg znaków, taki jak ORA-XXXXX: at "<program_unit_name>", line xx.Więc jeśli jesteś zainteresowany wyodrębnieniem samego numeru linii, niezależnie od tego, jaki cel chcesz osiągnąć, musisz przeanalizować ciąg znaków.

Na koniec, aby wyjaśnić różnicę, poniżej przedstawiono dwie procedury o tej samej treści. Można je uruchomić i zauważyć różnicę wyjściowy

CREATE OR REPLACE PROCEDURE proc_plsql_line 
    IS 
    BEGIN 
     RAISE VALUE_ERROR; 
    EXCEPTION 
     WHEN VALUE_ERROR 
     THEN 
      DBMS_OUTPUT.put_line ('Error raised in: '|| $$plsql_unit ||' at line ' || $$plsql_line || ' - '||sqlerrm); 
    END; 
/

I

CREATE OR REPLACE PROCEDURE proc_backtrace 
    IS 
    BEGIN 
     RAISE VALUE_ERROR; 
    EXCEPTION 
     WHEN VALUE_ERROR 
     THEN 
      DBMS_OUTPUT.put_line ('Error raised: '|| DBMS_UTILITY.FORMAT_ERROR_BACKTRACE || ' - '||sqlerrm); 
    END; 
/

Wykonanie:

exec proc_plsql_line; 

Error raised in: PROC_PLSQL_LINE at line 8 - ORA-06502: PL/SQL: numeric or value error 


exec proc_backtrace; 

Error raised: ORA-06512: at "PROC_BACKTRACE", line 4 - ORA-06502: PL/SQL: numeric or value error 
+2

to powinna być odpowiedź "ZAAKCEPTOWANA"! –

0

Oświadczenie DBMS_UTILITY.format_error_backtrace daje numer linii

begin 
select 1/0 from dual; 
exception 
    when others then 
    dbms_output.put_line('ERROR_STACK: ' || DBMS_UTILITY.FORMAT_ERROR_STACK); 
    dbms_output.put_line('ERROR_BACKTRACE: ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); 
end; 
Powiązane problemy