Eu me deparei com esse padrão depois de muita pesquisa, batendo cabeça e rangendo de dentes:
CREATE OR REPLACE PACKAGE BODY my_schema.package_name
IS
PROCEDURE foo
IS
BEGIN
-- Call stored procedures/functions that throw unhandled exceptions
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERROR! - '
|| DBMS_UTILITY.FORMAT_ERROR_STACK
|| DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
END foo;
END;
O
DBMS_UTILITY.FORMAT_ERROR_STACK
função parece dar o código de erro e mensagem, e DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
parece dar um rastreamento de pilha honesto, completo com números de linha e nomes de procedimentos armazenados no Oracle 10g, pelo menos. Não tenho certeza se essas funções estão disponíveis no Oracle 9i. Não consegui encontrar muitas informações sobre esse tipo de coisa, mesmo para o Oracle 10g, então pensei em pelo menos postar essa resposta, já que 9i é bastante antigo (e, portanto, 10g).