La variante DBMS_TRACE a la capacité d'enregistrer des exceptions même lorsqu'elles sont interceptées par un gestionnaire d'exceptions. Mais vous devrez installer les tables de soutien.
D:\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN>sqlplus/as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Dec 14 09:24:45 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
SQL> @tracetab.sql
SQL> CREATE PUBLIC SYNONYM plsql_trace_runs FOR plsql_trace_runs;
SQL> CREATE PUBLIC SYNONYM plsql_trace_events FOR plsql_trace_events;
SQL> CREATE PUBLIC SYNONYM plsql_trace_runnumber FOR plsql_trace_runnumber;
SQL> GRANT SELECT, INSERT, UPDATE, DELETE ON plsql_trace_runs TO PUBLIC;
SQL> GRANT SELECT, INSERT, UPDATE, DELETE ON plsql_trace_events TO PUBLIC;
SQL> GRANT SELECT ON plsql_trace_runnumber TO PUBLIC;
maintenant pour une démonstration:
create or replace
procedure test_trace is
v_test varchar2(3);
begin
select '12' into v_test from dual;
select '123' into v_test from dual;
select '1234' into v_test from dual;
select '12345' into v_test from dual;
exception
when value_error then
null;
end;
/
Exécutez le test en dégageant la table de tout vieilleries, mettre le drapeau et exécuter la procédure
delete from plsql_trace_events;
commit;
exec DBMS_TRACE.set_plsql_trace (DBMS_TRACE.trace_all_exceptions);
exec test_trace;
ensuite interroger les résultats .
select event_kind, event_unit, event_line, stack_depth, excp, event_comment, callstack, errorstack
from plsql_trace_events
where event_kind not in (38,40,43,44)
order by event_seq;
EVENT_KIND EVENT_UNIT EVENT_LINE STACK_DEPTH EXCP
----------- ------------------------------- ----------- ----------- -----------
EVENT_COMMENT
----------------------------------------------------------------------------------
CALLSTACK
----------------------------------------------------------------------------------
ERRORSTACK
----------------------------------------------------------------------------------
52.00 TEST_TRACE 6.00 2.00 6,502.00
Exception raised
----- PL/SQL Call Stack -----
object line object
handle number name
3BF0F6D4 6 procedure GARY.TEST_TRACE
3BDF1764 1 anonymous block
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
53.00 TEST_TRACE 11.00 2.00 6,502.00
Exception handled
On peut voir une exception a été soulevée à la ligne 6 et le fait qu'il a été pris à la ligne 11. Ce dernier est aussi très important. Si vous avez du code complexe, il n'est pas impossible qu'un gestionnaire d'exceptions à un ou deux niveaux de la hiérarchie d'appels puisse 'gérer' une exception pour laquelle il n'a jamais été prévu. Vous pouvez même voir le numéro d'erreur qui est pratique si elle a été attrapée par un autre.
quelle exception? quel type de dbms? mysql/sql server/oracle? – shahkalpesh
En supposant que le SGBDR est Oracle. Si vous n'avez pas de contrainte telle que currency_code avec Status = 'A' est unique, vous risquez d'avoir une trop grande exception de lignes. (Le nom exact m'échappe.) –
Autre que l'exception NO DATA FOUND, j'utilise proC avec la base de données oracle –