@@ -36,79 +36,13 @@ create or replace type body ut_data_value_anydata as
3636 return l_path;
3737 end;
3838
39- overriding member procedure extract_cursor(self in out nocopy ut_data_value_anydata, a_value sys_refcursor)
40- is
41- c_bulk_rows constant integer := 10000;
42- l_cursor sys_refcursor := a_value;
43- l_ctx number;
44- l_xml xmltype;
45- l_ut_owner varchar2(250) := ut_utils.ut_owner;
46- l_set_id integer := 0;
47- l_elements_count number := 0;
48- begin
49- -- We use DBMS_XMLGEN in order to:
50- -- 1) be able to process data in bulks (set of rows)
51- -- 2) be able to influence the ROWSET/ROW tags
52- -- 3) be able to influence the way NULL values are handled (empty TAG)
53- -- 4) be able to influence the way TIMESTAMP is formatted.
54- -- Due to Oracle feature/bug, it is not possible to change the DATE formatting of cursor data
55- -- AFTER the cursor was opened.
56- -- The only solution for this is to change NLS settings before opening the cursor.
57- --
58- -- This would work fine if we could use DBMS_XMLGEN.restartQuery.
59- -- The restartQuery fails however if PLSQL variables of TIMESTAMP/INTERVAL or CLOB/BLOB are used.
60- ut_expectation_processor.set_xml_nls_params();
61- l_ctx := dbms_xmlgen.newContext(l_cursor);
62- dbms_xmlgen.setNullHandling(l_ctx, dbms_xmlgen.empty_tag);
63- dbms_xmlgen.setMaxRows(l_ctx, c_bulk_rows);
64- loop
65- l_xml := dbms_xmlgen.getxmltype(l_ctx);
66- exit when dbms_xmlgen.getNumRowsProcessed(l_ctx) = 0;
67- l_elements_count := l_elements_count + dbms_xmlgen.getNumRowsProcessed(l_ctx);
68- execute immediate
69- 'insert into ' || l_ut_owner || '.ut_compound_data_tmp(data_id, item_no, item_data) ' ||
70- 'values (:self_guid, :self_row_count, :l_xml)'
71- using in self.data_id, l_set_id, l_xml;
72- l_set_id := l_set_id + c_bulk_rows;
73- end loop;
74- ut_expectation_processor.reset_nls_params();
75- dbms_xmlgen.closeContext(l_ctx);
76- self.elements_count := l_elements_count;
77- exception
78- when others then
79- ut_expectation_processor.reset_nls_params();
80- dbms_xmlgen.closeContext(l_ctx);
81- raise;
82- end;
83-
8439 member procedure init(self in out nocopy ut_data_value_anydata, a_value anydata) is
8540 l_refcursor sys_refcursor;
8641 l_ctx number;
8742 l_ut_owner varchar2(250) := ut_utils.ut_owner;
8843 cursor_not_open exception;
8944 l_cursor_number number;
90- l_anydata_sql varchar2(4000);
91- l_cursor_sql varchar2(2000);
92-
93- function resolve_name(a_object_name in varchar2) return varchar2 is
94- l_schema varchar(250);
95- l_object varchar(250);
96- l_procedure_name varchar(250);
97- begin
98- ut_metadata.do_resolve(a_object_name,7,l_schema,l_object, l_procedure_name);
99- return l_object;
100- end;
101-
102- function get_object_name(a_value anydata) return varchar2 is
103- begin
104- return resolve_name(ut_metadata.get_collection_element(a_value));
105- end;
106-
107- function get_object_name(a_datatype in varchar2) return varchar2 is
108- begin
109- return resolve_name(a_datatype);
110- end;
111-
45+ l_anydata_sql varchar2(4000);
11246 begin
11347 self.data_type := ut_metadata.get_anydata_typename(a_value);
11448 self.compound_type := get_instance(a_value);
@@ -131,15 +65,18 @@ create or replace type body ut_data_value_anydata as
13165 begin
13266 l_status := l_value.get'||self.compound_type||'(l_data); '||
13367 case when self.compound_type = 'collection' then
134- q'[ open :l_tmp_refcursor for select value(x) as "]'||get_object_name(a_value)||q'[" from table(l_data) x;]'
68+ q'[ open :l_tmp_refcursor for select value(x) as "]'||
69+ ut_metadata.get_object_name(ut_metadata.get_collection_element(a_value))||
70+ q'[" from table(l_data) x;]'
13571 else
136- q'[ open :l_tmp_refcursor for select l_data as "]'||get_object_name(self.data_type)||q'[" from dual;]'
72+ q'[ open :l_tmp_refcursor for select l_data as "]'||ut_metadata.get_object_name(self.data_type)||
73+ q'[" from dual;]'
13774 end ||
13875 'end;';
13976 execute immediate l_anydata_sql using in a_value, in out l_refcursor;
14077
14178 if l_refcursor%isopen then
142- extract_cursor(l_refcursor);
79+ self. extract_cursor(l_refcursor);
14380 l_cursor_number := dbms_sql.to_cursor_number(l_refcursor);
14481 self.cursor_details := ut_cursor_details(l_cursor_number);
14582 dbms_sql.close_cursor(l_cursor_number);
0 commit comments