Je suis tombé sur ce modèle après de nombreuses recherches, des coups de tête et des grincements de dents :
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;
Le DBMS_UTILITY.FORMAT_ERROR_STACK
la fonction semble donner le code d'erreur et le message, et DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
semble donner une trace de pile honnête, complète avec les numéros de ligne et les noms de procédures stockées dans Oracle 10g au moins.
Je ne sais pas si ces fonctions sont disponibles dans Oracle 9i. Je n'ai pas trouvé beaucoup d'informations sur ce genre de choses, même pour Oracle 10g, alors j'ai pensé que je posterais au moins cette réponse puisque 9i est assez vieux (et donc 10g d'ailleurs).