11create or replace type body ut_executable is
22
3- static procedure execute_call(a_owner varchar2, a_object varchar2, a_procedure_name varchar2) is
4- l_stmt varchar2(200 );
5- l_cursorid number;
6- l_rowsprocessed number;
7-
3+ static function execute_call(a_owner varchar2, a_object varchar2, a_procedure_name varchar2) return varchar2 is
4+ l_statement varchar2(4000 );
5+ l_status number;
6+ l_cursor_number number;
7+ l_error_stack varchar2(4000);
88 l_owner varchar2(200) := a_owner;
99 l_object_name varchar2(200) := a_object;
1010 l_procedure_name varchar2(200) := a_procedure_name;
@@ -13,20 +13,34 @@ create or replace type body ut_executable is
1313
1414 ut_metadata.do_resolve(a_owner => l_owner, a_object => l_object_name, a_procedure_name => l_procedure_name);
1515
16- l_stmt := 'begin ' || ut_metadata.form_name(l_owner, l_object_name, l_procedure_name) || '; end;';
17-
18- ut_utils.debug_log('ut_executable.execute_call stmt:' || l_stmt);
16+ l_statement :=
17+ 'declare' || chr(10) ||
18+ ' l_error_stack varchar2(4000);' || chr(10) ||
19+ 'begin' || chr(10) ||
20+ ' begin' || chr(10) ||
21+ ' ' || ut_metadata.form_name(l_owner, l_object_name, l_procedure_name) || ';' || chr(10) ||
22+ ' exception' || chr(10) ||
23+ ' when others then ' || chr(10) ||
24+ ' --raise on ORA-04068: existing state of packages has been discarded to avoid unrecoverable session exception' || chr(10) ||
25+ ' if sqlcode = -04068 then' || chr(10) ||
26+ ' raise;' || chr(10) ||
27+ ' end if;' || chr(10) ||
28+ ' l_error_stack := dbms_utility.format_error_stack || dbms_utility.format_error_backtrace;' || chr(10) ||
29+ ' end;' || chr(10) ||
30+ ' :l_error_stack := l_error_stack;' || chr(10) ||
31+ 'end;';
32+
33+ ut_utils.debug_log('ut_executable.execute_call l_statement: ' || l_statement);
34+
1935
20- l_cursorid := dbms_sql.open_cursor;
21- dbms_sql.parse(c => l_cursorid, statement => l_stmt, language_flag => dbms_sql.native);
22- l_rowsprocessed := dbms_sql.execute(l_cursorid);
23- dbms_sql.close_cursor(l_cursorid);
24- exception
25- when others then
26- if l_cursorid is not null and dbms_sql.is_open(l_cursorid) then
27- dbms_sql.close_cursor(l_cursorid);
28- end if;
29- raise;
36+ l_cursor_number := dbms_sql.open_cursor;
37+ dbms_sql.parse(l_cursor_number, statement => l_statement, language_flag => dbms_sql.native);
38+ dbms_sql.bind_variable(l_cursor_number, 'l_error_stack', l_error_stack, 8000);
39+ l_status := dbms_sql.execute(l_cursor_number);
40+ dbms_sql.variable_value(l_cursor_number, 'l_error_stack', l_error_stack);
41+ dbms_sql.close_cursor(l_cursor_number);
42+
43+ return rtrim(l_error_stack,chr(10));
3044 end;
3145
3246 member function is_valid(a_proc_type varchar2) return boolean is
@@ -66,8 +80,14 @@ create or replace type body ut_executable is
6680 end;
6781
6882 member procedure do_execute(self in ut_executable) is
83+ l_exception_stack varchar2(32767);
84+ begin
85+ l_exception_stack := do_execute();
86+ end do_execute;
87+
88+ member function do_execute(self in ut_executable) return varchar2 is
6989 begin
70- ut_executable.execute_call(self.owner_name, self.object_name, self.procedure_name);
90+ return ut_executable.execute_call(self.owner_name, self.object_name, self.procedure_name);
7191 end do_execute;
7292
7393end;
0 commit comments