What ORA-06512: At Line Means in Oracle and How to Find the Error

Read an Oracle error stack from the top, follow ORA-06512 to the code line that raised the error, and keep the location when handling errors.

ORA-06512 is not an error of its own. It is a line of the error stack that says where an error passed through PL/SQL code: which program unit, and which line. The real error is the first line of the stack, above the ORA-06512 lines. To fix the problem, read that first error, then follow the ORA-06512 lines to the code that raised it.

See It in an Error Stack

One procedure checks a quantity and raises an error; another calls it:

Example:

create or replace procedure demo_check_qty (p_qty number) is
begin
  if p_qty > 10 then
    raise_application_error(-20001, 'At most 10 seats per order');
  end if;
end;
/
create or replace procedure demo_place_order (p_qty number) is
begin
  demo_check_qty(p_qty);
end;
/
exec demo_place_order(12)

Output:

Procedure DEMO_CHECK_QTY compiled

Procedure DEMO_PLACE_ORDER compiled

BEGIN demo_place_order(12); END;
*
ERROR at line 1:
ORA-20001: At most 10 seats per order
ORA-06512: at "NIMBUS.DEMO_CHECK_QTY", line 4
ORA-06512: at "NIMBUS.DEMO_PLACE_ORDER", line 3
ORA-06512: at line 1
  • ORA-20001 is the actual error, the one to fix.
  • The ORA-06512 lines go from where it was raised, line 4 of DEMO_CHECK_QTY, outward to the caller, line 3 of DEMO_PLACE_ORDER, and to line 1 of the anonymous block.
  • For an anonymous block, the line number counts from its first line, DECLARE or BEGIN.

Find the Line in the Source

Example:

-- the line each ORA-06512 points to
select name, line, text
from   user_source
where  (name = 'DEMO_CHECK_QTY' and line = 4)
or     (name = 'DEMO_PLACE_ORDER' and line = 3)
order  by name desc;

Output:

NAME                   LINE TEXT
___________________ _______ _____________________________________________________________________
DEMO_PLACE_ORDER          3   demo_check_qty(p_qty);
DEMO_CHECK_QTY            4     raise_application_error(-20001, 'At most 10 seats per order');

Keep the Line Numbers When You Handle Errors

An exception handler that logs SQLERRM alone loses the location. DBMS_UTILITY.FORMAT_ERROR_BACKTRACE returns the ORA-06512 lines:

Example:

set serveroutput on
begin
  demo_place_order(12);
exception
  when others then
    dbms_output.put_line(sqlerrm);
    dbms_output.put_line(dbms_utility.format_error_backtrace);
end;
/

Output:

ORA-20001: At most 10 seats per order
ORA-06512: at "NIMBUS.DEMO_CHECK_QTY", line 4
ORA-06512: at "NIMBUS.DEMO_PLACE_ORDER", line 3
ORA-06512: at line 2

PL/SQL procedure successfully completed.

Things to Know

  • A handler that catches and raises a new error, for example with RAISE_APPLICATION_ERROR, starts a new stack at the handler; pass TRUE as its third argument to keep the original errors.
  • An ORA-06512 line without a program name, such as "at line 1", refers to the anonymous block that was run.
  • ORA-06512 lines also appear below errors raised by Oracle, such as ORA-01403 or ORA-01476.

Related Guides

Conclusion

ORA-06512 shows where an error traveled through PL/SQL. Fix the error at the top of the stack, use the first ORA-06512 line to find where it was raised, and log FORMAT_ERROR_BACKTRACE in handlers so the location is not lost.

Get more Vinish.dev tutorials on Google

See my articles more often when you search Google.

Vinish Kapoor
Vinish Kapoor

An Oracle ACE, author of four books on Oracle APEX, SQL and PL/SQL, and Oracle Forms, and a software developer building Oracle database applications since 2001.

guest

0 Comments
Oldest
Newest Most Voted