Im working on a pl-sql script, in which I have about 10 TO_CHAR conversions.
One of them is throwing an
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
exception.
Currently, im logging the message with this piece of code
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('Exception message is '||SQLERRM(sqlcode));
ROLLBACK;
I'd like to add (mostly for debugging purposes) the line where the exception is thrown, in order to receive a message in the form of
ORA-06502: PL/SQL: numeric or value error: character string buffer too small (at line x)
Is there an easy way to do this?
you need 10g or above. Check DBMS_UTILITY.FORMAT_ERROR_BACKTRACE.
http://www.oracle.com/technetwork/issue-archive/2005/05-mar/o25plsql-093886.html
You could put your exception handler around every statement.
The answers have mentioned both,
$$PLSQL_LINE & DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
. But I would like to add a bit about the difference between them:$$PLSQL_LINE & $$PLSQL_UNIT
PLSQL_LINE predefined inquiry directive is a PLS_INTEGER literal value indicating the line number reference to $$PLSQL_LINE in the current program unit.
From its definition, PLSQL_LINE is not suitable for exceptions logging because it will provide the line number of the exception, rather than the line number of the error occurred itself. This makes it difficult to detect the error location especially with big program units, unless you wrap every statement with exception handler as Jeffrey answer's stated.
However, the good thing about PLSQL_LINE, it provides the number without the need of any extraction, or string parsing. Hence, it could be more suitable for other logging purposes.
This procedure displays the call stack at the point where an exception was raised, even if the procedure is called from an exception handler in an outer scope.
The advantage of using this procedure, is that it provides the exact line number in the program using where the error occurs, and not where the procedure call appears However, the procedure returns a string like
ORA-XXXXX: at "<program_unit_name>", line xx
. So if you are interested in extracting the line number itself, for whatever logging purpose you want, you will need parse the string.Finally, to make the difference clear, below are two procedures, with the same content. You can run them and notice the output difference
And
Execution:
The DBMS_UTILITY.format_error_backtrace statement will give you the line number
You need 10g to use
also look into using
there is an article in Oracle Magazine from april '05 by Steven Feuerstein:
http://www.oracle.com/technetwork/issue-archive/2005/05-mar/o25plsql-093886.html
Cheers, niels