It uses a view on a table function to access the error stack. Very neat.
Here is the cut and paste:
create or replace type string_tbl_type is table of(4000); / create or replace function get_qms_errors return string_tbl_type is l_string_tbl string_tbl_type:= string_tbl_type(); l_message_rectype_tbl hil_message.message_tabtype; l_message_count number := 0; l_error varchar2(2000); l_raise_error boolean := false; procedure add(p_text in varchar2) is begin l_string_tbl.extend; l_string_tbl(l_string_tbl.last):= p_text; end add; begin add('CG$Error Stack:'); add('---------------'); cg$errors.get_error_messages ( l_message_rectype_tbl , l_message_count , l_raise_error ); if l_message_count > 0 then for i in 1..l_message_count loop l_error := cg$errors.get_display_string ( p_msg_code => l_message_rectype_tbl(i).msg_code , p_msg_text => l_message_rectype_tbl(i).msg_text , p_msg_type => l_message_rectype_tbl(i).severity ); add( l_error); end loop; end if; return l_string_tbl; end; / create or replace view qms_errors as select* from table(get_qms_errors) / select * from qms_errors; drop view qms_errors; / drop function get_qms_errors; / drop type string_tbl_type; /
No comments:
Post a Comment