2013-02-20 11 views
10

Mam następującą procedurę, która jest wykorzystywana przez niektóre aplikacje:Jak ponownie wygenerować wyjątek pl/sql w bloku obsługi wyjątków?

procedure p1 
is 
begin 
    bla bla bla; 
end; 

Ale nie ma blok obsługi wyjątków. Więc aplikacje zostały napisane zgodnie z tą funkcją.

Teraz muszę zalogować błędy w p1. Ale nie powinno to wpływać na aplikacje korzystające z tej procedury.

tak:

procedure p1 
is 
begin 
    bla bla bla; 

    exception when others then 
    log_error(sqlcode, sqlerrm); 
    raise_new_exception (sqlcode, sqlerrm); 
end; 

W przypadku raise_application_error pierwszy parametr powinien być w zakresie [-20000, -20999]. Więc jeśli podniesie wyjątek no_data_found, nie może podnieść tego błędu.

W przypadku exception_init drugi parametr nie powinien być zmienny. Musi to być literał numeryczny.

PS: Jako tymczasowe rozwiązanie, Używam wykonać natychmiastową

Odpowiedz

21

Jeśli błąd pozostaje ten sam, zmiany

... 
exception when others then 
    log_error(sqlcode, sqlerrm); 
    raise; 
end; 
/

to wyjaśniono in the documentation.

+1

@AlexPoole Link nie działa. – ceving

+0

@ceving - dziękuję, dodałem bieżący link na żywo do odpowiedzi, aby łatwiej było go aktualizować w przyszłości. –

+1

prądu [link] (http://docs.oracle.com/cd/B10501_01/appdev.920/a96624/07_errs.htm#1049) –