Me encontré con este patrón después de mucha investigación, golpes de cabeza y crujir de dientes:
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;
El DBMS_UTILITY.FORMAT_ERROR_STACK
la función parece dar el código y el mensaje de error, y DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
parece dar un seguimiento de la pila honesto a la bondad, completo con números de línea y nombres de procedimientos almacenados en Oracle 10g al menos.
No estoy seguro si esas funciones están disponibles en Oracle 9i. No pude encontrar mucha información sobre este tipo de cosas, incluso para Oracle 10g, así que pensé que al menos publicaría esta respuesta ya que 9i es bastante antiguo (y por lo tanto es 10g).