@@ -444,6 +444,7 @@ create or replace package body ut_compound_data_helper is
444444 ut_utils.append_to_clob(a_equal_stmt,l_sql_stmt);
445445 end;
446446
447+ --TODO : Scenario where join by is on whole type not a column of type e.g. NESTEDTABLE
447448 procedure generate_partition_stmt(a_data_info ut_cursor_column, a_partition_stmt in out nocopy clob,a_pk_table in ut_varchar2_list,a_col_name in varchar2) is
448449 l_alias varchar2(10) := 'ucd.';
449450 l_pk_tab ut_varchar2_list := coalesce(a_pk_table,ut_varchar2_list());
@@ -486,10 +487,20 @@ create or replace package body ut_compound_data_helper is
486487 begin
487488 if a_data_info.is_sql_diffable = 0 then
488489 l_col_type := 'XMLTYPE';
490+ --TODO : Is it right to use timestamp ?
489491 elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type = 'DATE' then
490492 l_col_type := 'TIMESTAMP';
493+ elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('TIMESTAMP','TIMESTAMP WITH TIME ZONE') then
494+ l_col_type := a_data_info.column_type;
495+ --TODO : Oracle bug : https://community.oracle.com/thread/1957521
496+ elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type = 'TIMESTAMP WITH LOCAL TIME ZONE' then
497+ l_col_type := 'VARCHAR2(50)';
498+ elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('INTERVAL DAY TO SECOND','INTERVAL YEAR TO MONTH') then
499+ l_col_type := a_data_info.column_type;
491500 else
492- l_col_type := a_data_info.column_type||case when a_data_info.column_len is not null then '('||a_data_info.column_len||')' else null end;
501+ l_col_type := a_data_info.column_type||case when a_data_info.column_len is not null then
502+ '('||a_data_info.column_len||')'
503+ else null end;
493504 end if;
494505 l_sql_stmt := ' '||a_col_name||' '||l_col_type||q'[ PATH ']'||a_data_info.access_path||q'[',]';
495506 ut_utils.append_to_clob(a_sql_stmt, l_sql_stmt);
@@ -654,7 +665,7 @@ create or replace package body ut_compound_data_helper is
654665 end if;
655666 ut_utils.append_to_clob(l_compare_sql,l_temp_string);
656667
657- dbms_output.put_line(l_compare_sql);
668+ -- dbms_output.put_line(l_compare_sql);
658669 return l_compare_sql;
659670 end;
660671
@@ -689,15 +700,17 @@ create or replace package body ut_compound_data_helper is
689700 l_sql varchar2(32767) :=
690701 q'[with
691702 sorted as
692- (select r_num,regexp_substr(t.column_value, '[^/]+', 1, commas.column_value) as colval,commas.column_value lev
703+ (select r_num,regexp_substr(t.column_value, '[^/]+', 1, commas.column_value) as colval,commas.column_value lev,
704+ t.column_value access_path
693705 from (select row_number() over(order by 1) r_num, column_value from ((table(:a_current_list)))) t,
694706 table(cast(multiset
695707 (select level from dual connect by level <= length(regexp_replace(t.column_value,'[^/]+')) + 1) as sys.odcinumberlist)) commas
696708 order by r_num,lev),
697709 hier as
698- (select r_num,lev,colval column_name,lag(colval, 1) over(partition by r_num order by lev) parent_name from sorted),
710+ (select r_num,lev,colval column_name,lag(colval, 1) over(partition by r_num order by lev) parent_name , access_path
711+ from sorted),
699712 constructed as (
700- select lev,column_name,parent_name from hier),
713+ select lev,column_name,parent_name,access_path from hier),
701714 t1(column_name, parent_name) AS (
702715 select column_name,parent_name from table(:a_cursor_info) where parent_name is null
703716 union all
@@ -712,7 +725,7 @@ create or replace package body ut_compound_data_helper is
712725 l_result ut_cursor_column_tab := ut_cursor_column_tab();
713726 begin
714727 l_sql := l_sql || q'[select ut_cursor_column(i.column_name,i.column_schema,i.column_type_name, i.column_prec,i.column_scale,i.column_len, i.parent_name,
715- i.hierarchy_level,i.column_position, i.column_type)
728+ i.hierarchy_level,i.column_position, i.column_type, i.is_collection )
716729 from t1 join table(:a_cursor_info) i on ( nvl(t1.parent_name,1) = nvl(i.parent_name,1) and t1.column_name = i.column_name)]';
717730 if a_include then
718731 l_sql := l_sql || ' join constructed c on ( nvl(t1.parent_name,1) = nvl(c.parent_name,1) and t1.column_name = c.column_name)';
@@ -732,7 +745,7 @@ create or replace package body ut_compound_data_helper is
732745 l_sql varchar2(32767) := get_cursor_vs_list_sql;
733746 l_result ut_varchar2_list := ut_varchar2_list();
734747 begin
735- l_sql := l_sql || q'[select c.parent_name || case when c.parent_name is null then null else '/' end ||c.column_name
748+ l_sql := l_sql || q'[select c.access_path
736749 from t1 join table(:a_cursor_info) i on ( nvl(t1.parent_name,1) = nvl(i.parent_name,1) and t1.column_name = i.column_name)]';
737750 l_sql := l_sql ||'right outer join constructed c on ( nvl(t1.parent_name,1) = nvl(c.parent_name,1) and t1.column_name = c.column_name)
738751 where t1.column_name is null';
0 commit comments