DBA Data[Home] [Help]

PACKAGE BODY: APPS.EDW_SRC_DANG_RECOVERY

Source


1 package body EDW_SRC_DANG_RECOVERY as
2 /*$Header: EDWSRDTB.pls 115.6 2004/02/13 05:10:17 smulye noship $*/
3 
4 /*will be called from setup in collection util
5 if p_db_link is null, then it assumes that source and warehouse are the same
6 */
7 function get_dangling_keys(p_dim_name varchar2,p_db_link varchar2,
8 p_pk_view varchar2,p_missing_key_view varchar2) return boolean is
9 Begin
10   g_object_name:=p_dim_name;
11   g_db_link:=p_db_link;
12   if p_missing_key_view is null then
13     write_to_log_file_n('Missing key view not specified for '||p_dim_name);
14     return true;
15   end if;
16   --if EDW_COLLECTION_UTIL.SOURCE_SAME_AS_TARGET then
17   if g_db_link is null then
18     g_src_same_wh_flag:=true;
19     g_db_link_stmt:=null;
20     write_to_log_file_n('Source and warehouse same');
21   else
22     g_src_same_wh_flag:=false;
23     g_db_link_stmt:='@'||g_db_link;
24     write_to_log_file_n('Source and warehouse different');
25   end if;
26   g_object_id:=get_dim_id(g_object_name);
27   g_missing_key_view:=p_missing_key_view;
28   g_pk_view:=p_pk_view;
29   write_to_log_file_n('Object name='||g_object_name||', ID='||g_object_id||', DB link='||g_db_link);
30   write_to_log_file_n('DB Link stmt '||g_db_link_stmt);
31   write_to_log_file('Missing Key view='||g_missing_key_view||',PK View='||g_pk_view);
32   if init_all=false then
33     return false;
34   end if;
35   if g_auto_dang_flag=false then
36     return true;
37   end if;
38   if get_dangling_keys=false then
39     return false;
40   end if;
41   return true;
42 Exception when others then
43   g_status_message:=sqlerrm;
44   write_to_log_file_n(g_status_message);
45   return false;
46 End;
47 
48 function get_dangling_keys return boolean is
49 Begin
50   if check_table(g_wh_dang_table||g_db_link_stmt)=false then
51     if g_debug then
52       write_to_log_file_n('Remote '||g_wh_dang_table||' does not exist. No dangling processing to do!');
53     end if;
54     return true;
55   end if;
56   if get_ll_keys_from_wh=false then
57     return false;
58   end if;
59   if get_hl_keys_from_view=false then
60     return false;
61   end if;
62   if create_missing_key_view=false then
63     return false;
64   end if;
65   return true;
66 Exception when others then
67   g_status_message:=sqlerrm;
68   write_to_log_file_n(g_status_message);
69   return false;
70 End;
71 
72 function get_ll_keys_from_wh return boolean is
73 l_stmt varchar2(20000);
74 l_table varchar2(200);
75 l_table2 varchar2(200);
76 l_table3 varchar2(200);
77 l_db_columns varcharTableType;
78 l_number_db_columns number;
79 l_found boolean;
80 Begin
81   if drop_table(g_level_table)=false then
82     null;
83   end if;
84   l_stmt:='create table '||g_level_table||' tablespace '||g_src_op_table_space;
85   l_stmt:=l_stmt||' as select upper(ltc.name) name,ltc.elementid id,upper(lvl.LEVEL_PREFIX) prefix from ';
86   l_stmt:=l_stmt||' edw_tables_md_v'||g_db_link_stmt||' ltc,edw_levels_md_v'||g_db_link_stmt||' lvl '||
87   'where lvl.DIM_ID='||g_object_id||' and lvl.LEVEL_TABLE_NAME=ltc.name';
88   if g_debug then
89     write_to_log_file_n(l_stmt||get_time);
90   end if;
91   execute immediate l_stmt;
92   if g_debug then
93     write_to_log_file_n('Created with '||sql%rowcount||' rows '||get_time);
94   end if;
95   analyze_table_stats(substr(g_level_table,instr(g_level_table,'.')+1,
96   length(g_level_table)),substr(g_level_table,1,instr(g_level_table,'.')-1));
97   if g_err_rec_flag then
98     l_table:=g_dang_table||'1';
99   else
100     l_table:=g_dang_table;
101   end if;
102   if drop_table(l_table)=false then
103     null;
104   end if;
105   if g_number_pk_cols>0 then
106     l_stmt:='create table '||l_table||' tablespace '||g_src_op_table_space;
107     l_stmt:=l_stmt||' as select * from '||g_wh_dang_table||g_db_link_stmt||
108     ' where 1=2';
109     if g_debug then
110       write_to_log_file_n(l_stmt||get_time);
111     end if;
112     execute immediate l_stmt;
113     if g_debug then
114       write_to_log_file_n('Created with '||sql%rowcount||' rows '||get_time);
115     end if;
116     l_number_db_columns:=0;
117     if get_db_columns_for_table(substr(l_table,instr(l_table,'.')+1),
118       l_db_columns,l_number_db_columns,g_src_bis_owner)=false then
119       null;
120     end if;
121     for i in 1..g_number_pk_cols loop
122       if value_in_table(l_db_columns,l_number_db_columns,g_pk_cols(i))=false then
123         if g_debug then
124           write_to_log_file_n('The remote table '||g_wh_dang_table||g_db_link_stmt||' does not have column ');
125           write_to_log_file(g_pk_cols(i)||'. So using value and PK. Cannot use columns listed in profile options');
126         end if;
127         g_number_pk_cols:=0;
128         g_number_profile_options:=0;
129         exit;
130       end if;
131     end loop;
132     l_number_db_columns:=0;
133     if drop_table(l_table)=false then
134       null;
135     end if;
136   end if;
137   l_stmt:='create table '||l_table||' tablespace '||g_src_op_table_space;
138   if g_src_parallel is not null then
139     l_stmt:=l_stmt||' parallel(degree '||g_src_parallel||') ';
140   end if;
141   l_stmt:=l_stmt||' as select distinct level_table,value';
142   for i in 1..g_number_pk_cols loop
143     l_stmt:=l_stmt||','||g_pk_cols(i);
144   end loop;
145   l_stmt:=l_stmt||' from '||g_wh_dang_table||g_db_link_stmt;
146   if g_debug then
147     write_to_log_file_n(l_stmt||get_time);
148   end if;
149   execute immediate l_stmt;
150   g_dang_table_count:=sql%rowcount;
151   if g_debug then
152     write_to_log_file_n('Created with '||g_dang_table_count||' rows '||get_time);
153   end if;
154   --truncate the remote table
155   if g_debug then
156     write_to_log_file_n('Going to truncate table '||g_wh_dang_table||' at '||g_db_link_stmt);
157   end if;
158   l_stmt:='begin EDW_OWB_COLLECTION_UTIL.truncate_table'||g_db_link_stmt||'('''||g_wh_dang_table||''');end;';
159   if g_debug then
160     write_to_log_file_n(l_stmt||get_time);
161   end if;
162   execute immediate l_stmt;
163   commit;
164   --if src is different from the warehouse, look at the source also for g_wh_dang_table on the src.
165   if g_src_same_wh_flag=false then
166     if does_table_have_data(g_wh_dang_table)=2 then
167       l_table2:=g_dang_table||'2';
168       l_table3:=g_dang_table||'3';
169       if drop_table(l_table2)=false then
170         null;
171       end if;
172       if drop_table(l_table3)=false then
173         null;
174       end if;
175       l_stmt:='create table '||l_table2||' tablespace '||g_src_op_table_space;
176       if g_src_parallel is not null then
177         l_stmt:=l_stmt||' parallel(degree '||g_src_parallel||') ';
178       end if;
179       l_stmt:=l_stmt||' as select distinct level_table,value';
180       for i in 1..g_number_pk_cols loop
181         l_stmt:=l_stmt||','||g_pk_cols(i);
182       end loop;
183       l_stmt:=l_stmt||' from '||g_wh_dang_table;
184       if g_debug then
185         write_to_log_file_n(l_stmt||get_time);
186       end if;
187       execute immediate l_stmt;
188       if g_debug then
189         write_to_log_file_n('Created with '||sql%rowcount||' rows '||get_time);
190       end if;
191       l_stmt:='create table '||l_table3||' tablespace '||g_src_op_table_space;
192       if g_src_parallel is not null then
193         l_stmt:=l_stmt||' parallel(degree '||g_src_parallel||') ';
194       end if;
195       l_stmt:=l_stmt||' as select * from '||l_table;
196       if g_debug then
197         write_to_log_file_n(l_stmt||get_time);
198       end if;
199       execute immediate l_stmt;
200       if g_debug then
201         write_to_log_file_n('Created with '||sql%rowcount||' rows '||get_time);
202       end if;
203       if drop_table(l_table)=false then
204         null;
205       end if;
206       l_stmt:='create table '||l_table||' tablespace '||g_src_op_table_space;
207       if g_src_parallel is not null then
208         l_stmt:=l_stmt||' parallel(degree '||g_src_parallel||') ';
209       end if;
210       l_stmt:=l_stmt||' as select level_table,value';
211       for i in 1..g_number_pk_cols loop
212         l_stmt:=l_stmt||','||g_pk_cols(i);
213       end loop;
214       l_stmt:=l_stmt||' from '||l_table2||' UNION  select level_table,value';
215       for i in 1..g_number_pk_cols loop
216         l_stmt:=l_stmt||','||g_pk_cols(i);
217       end loop;
218       l_stmt:=l_stmt||' from '||l_table3;
219       if g_debug then
220         write_to_log_file_n(l_stmt||get_time);
221       end if;
222       execute immediate l_stmt;
223       g_dang_table_count:=sql%rowcount;
224       if g_debug then
225         write_to_log_file_n('Created with '||g_dang_table_count||' rows '||get_time);
226       end if;
227       if drop_table(l_table2)=false then
228         null;
229       end if;
230       if drop_table(l_table3)=false then
231         null;
232       end if;
233     end if;
234   end if;
235   if get_db_columns_for_table(substr(l_table,instr(l_table,'.')+1),
236     g_wh_dang_table_cols,g_number_wh_dang_table_cols,g_src_bis_owner)=false then
237     return false;
238   end if;
239   if g_debug then
240     write_to_log_file_n('DB columns for '||l_table);
241     for i in 1..g_number_wh_dang_table_cols loop
242       write_to_log_file(g_wh_dang_table_cols(i));
243     end loop;
244   end if;
245   if g_err_rec_flag then
246     l_number_db_columns:=0;
247     l_found:=true;
248     if get_db_columns_for_table(substr(g_dang_table,instr(g_dang_table,'.')+1),
249       l_db_columns,l_number_db_columns,g_src_bis_owner)=false then
250       if get_db_columns_for_table(substr(g_dang_table,instr(g_dang_table,'.')+1),
251         l_db_columns,l_number_db_columns,null)=false then
252         return false;
253       end if;
254     end if;
255     for i in 1..g_number_wh_dang_table_cols loop
256       if value_in_table(l_db_columns,l_number_db_columns,g_wh_dang_table_cols(i))=false then
257         if g_debug then
258           write_to_log_file_n('Column '||g_wh_dang_table_cols(i)||' not found in dang table '||g_dang_table);
259         end if;
260         l_found:=false;
261         exit;
262       end if;
263     end loop;
264     if l_found=false then
265       --a very rare occurance. if someone changed the pk structure in the middle of an error recovery
266       if drop_table(g_dang_table)=false then
267         null;
268       end if;
269       l_stmt:='create table '||g_dang_table||' tablespace '||g_src_op_table_space;
270       if g_src_parallel is not null then
271         l_stmt:=l_stmt||' parallel(degree '||g_src_parallel||') ';
272       end if;
273       l_stmt:=l_stmt||' as select * from '||l_table;
274       if g_debug then
275         write_to_log_file_n(l_stmt||get_time);
276       end if;
277       execute immediate l_stmt;
278       if g_debug then
279         write_to_log_file_n('Created with '||sql%rowcount||' rows '||get_time);
280       end if;
281       g_err_rec_flag:=false;
282     else
283       l_table2:=g_dang_table||'2';
284       l_table3:=g_dang_table||'3';
285       l_stmt:='create table '||l_table2||' tablespace '||g_src_op_table_space;
286       if g_src_parallel is not null then
287         l_stmt:=l_stmt||' parallel(degree '||g_src_parallel||') ';
288       end if;
289       l_stmt:=l_stmt||' as select A.rowid row_id from '||l_table||' A,'||g_dang_table||' B '||
290       ' where ';
291       for i in 1..g_number_wh_dang_table_cols loop
292         if g_wh_dang_table_cols(i)<>'LEVEL_TABLE' then
293           l_stmt:=l_stmt||'nvl(A.'||g_wh_dang_table_cols(i)||',''null'')='||
294           'nvl(B.'||g_wh_dang_table_cols(i)||',''null'') and ';
295         else
296           l_stmt:=l_stmt||'A.'||g_wh_dang_table_cols(i)||'='||
297           'B.'||g_wh_dang_table_cols(i)||' and ';
298         end if;
299       end loop;
300       l_stmt:=substr(l_stmt,1,length(l_stmt)-4);
301       if drop_table(l_table2)=false then
302         null;
303       end if;
304       if g_debug then
305         write_to_log_file_n(l_stmt||get_time);
306       end if;
307       execute immediate l_stmt;
308       if g_debug then
309         write_to_log_file_n('Created with '||sql%rowcount||' rows '||get_time);
310       end if;
311       l_stmt:='create table '||l_table3||' tablespace '||g_src_op_table_space;
312       if g_src_parallel is not null then
313         l_stmt:=l_stmt||' parallel(degree '||g_src_parallel||') ';
314       end if;
315       l_stmt:=l_stmt||' as select rowid row_id from '||l_table||' MINUS select row_id from '||l_table2;
316       if drop_table(l_table3)=false then
317         null;
318       end if;
319       if g_debug then
320         write_to_log_file_n(l_stmt||get_time);
321       end if;
322       execute immediate l_stmt;
323       if g_debug then
324         write_to_log_file_n('Created with '||sql%rowcount||' rows '||get_time);
325       end if;
326       l_stmt:='insert into '||g_dang_table||'(';
327       for i in 1..g_number_wh_dang_table_cols loop
328         l_stmt:=l_stmt||g_wh_dang_table_cols(i)||',';
329       end loop;
330       l_stmt:=substr(l_stmt,1,length(l_stmt)-1);
331       l_stmt:=l_stmt||') select ';
332       for i in 1..g_number_wh_dang_table_cols loop
333         l_stmt:=l_stmt||'B.'||g_wh_dang_table_cols(i)||',';
334       end loop;
335       l_stmt:=substr(l_stmt,1,length(l_stmt)-1);
336       l_stmt:=l_stmt||' from '||l_table3||' A, '||l_table||' B where A.row_id=B.rowid';
337       if g_debug then
341       if g_debug then
338         write_to_log_file_n(l_stmt||get_time);
339       end if;
340       execute immediate l_stmt;
342         write_to_log_file_n('Inserted '||sql%rowcount||' rows '||get_time);
343       end if;
344       commit;
345     end if;
346     if drop_table(l_table)=false then
347       null;
348     end if;
349     if drop_table(l_table2)=false then
350       null;
351     end if;
352     if drop_table(l_table3)=false then
353       null;
354     end if;
355   end if;
356   analyze_table_stats(substr(g_dang_table,instr(g_dang_table,'.')+1,
357   length(g_dang_table)),substr(g_dang_table,1,instr(g_dang_table,'.')-1));
358   return true;
359 Exception when others then
360   g_status_message:=sqlerrm;
361   write_to_log_file_n(g_status_message);
362   return false;
363 End;
364 
365 function get_hl_keys_from_view return boolean is
366 l_stmt varchar2(20000);
367 l_stmt1 varchar2(20000);
368 TYPE CurTyp IS REF CURSOR;
369 cv   CurTyp;
370 l_level varcharTableType;
371 l_level_id numberTableType;
372 l_level_prefix varcharTableType;
373 l_number_level number;
374 l_table varchar2(400);
375 l_table2 varchar2(400);
376 l_table3 varchar2(400);
377 l_table4 varchar2(400);
378 l_lowest_level varchar2(400);
379 l_lowest_level_id number;
380 l_lowest_level_prefix varchar2(400);
381 l_lowest_level_pk varchar2(400);
382 l_level_pk varchar2(200);
383 Begin
384   if g_debug then
385     write_to_log_file_n('In get_hl_keys_from_view'||get_time);
386   end if;
387   l_table:=g_dang_table||'1';
388   if check_table(g_pk_view)=false then
389     if g_debug then
390       write_to_log_file_n('PK View '||g_pk_view||' not found. Cannot find higher level keys');
391     end if;
392     return true;
393   end if;
394   if get_db_columns_for_table(g_pk_view,g_pk_view_cols,g_number_pk_view_cols)=false then
395     return false;
396   end if;
397   if g_debug then
398     write_to_log_file_n('The DB columns of the view '||g_pk_view);
399     for i in 1..g_number_pk_view_cols loop
400       write_to_log_file(g_pk_view_cols(i));
401     end loop;
402   end if;
403   l_stmt:='select name,id,prefix from '||g_level_table;
404   if g_debug then
405     write_to_log_file_n(l_stmt||get_time);
406   end if;
407   l_number_level:=1;
408   open cv for l_stmt;
409   loop
410     fetch cv into l_level(l_number_level),l_level_id(l_number_level),l_level_prefix(l_number_level);
411     exit when cv%notfound;
412     l_number_level:=l_number_level+1;
413   end loop;
414   l_number_level:=l_number_level-1;
415   close cv;
416   if g_debug then
417     write_to_log_file_n('Level and prefix');
418     for i in 1..l_number_level loop
419       write_to_log_file(l_level(i)||' ('||l_level_id(i)||') ('||l_level_prefix(i)||')');
420     end loop;
421   end if;
422   l_stmt:='select EDW_OWB_COLLECTION_UTIL.get_lowest_level_table'||g_db_link_stmt||'(null,'||g_object_id||
423   ') from dual';
424   if g_debug then
425     write_to_log_file_n(l_stmt||get_time);
426   end if;
427   open cv for l_stmt;
428   fetch cv into l_lowest_level;
429   close cv;
430   for i in 1..l_number_level loop
431     if l_level(i)=l_lowest_level then
432       l_lowest_level_prefix:=l_level_prefix(i);
433       l_lowest_level_id:=l_level_id(i);
434       exit;
435     end if;
436   end loop;
437   if g_debug then
438     write_to_log_file_n('Lowest level '||l_lowest_level||'('||l_lowest_level_id||') '||l_lowest_level_prefix);
439   end if;
440   --l_lowest_level_pk
441   l_stmt:='select EDW_OWB_COLLECTION_UTIL.get_dim_pk'||g_db_link_stmt||'(null,'||g_object_id||
442   ') from dual';
443   if g_debug then
444     write_to_log_file_n(l_stmt||get_time);
445   end if;
446   open cv for l_stmt;
447   fetch cv into l_lowest_level_pk;
448   close cv;
449   l_lowest_level_pk:=substr(l_lowest_level_pk,1,instr(l_lowest_level_pk,'_KEY',-1)-1);
450   if g_debug then
451     write_to_log_file_n('Lowest level PK '||l_lowest_level_pk);
452   end if;
453   l_stmt:='create table '||l_table||' tablespace '||g_src_op_table_space;
454   if g_src_parallel is not null then
455     l_stmt:=l_stmt||' parallel(degree '||g_src_parallel||') ';
456   end if;
457   l_stmt:=l_stmt||' as select ';
458   for i in 1..g_number_pk_view_cols loop
459     if g_pk_view_cols(i)<>l_lowest_level_pk and value_in_table(g_pk_cols,g_number_pk_cols,
460       g_pk_view_cols(i))=false then
461       l_stmt:=l_stmt||'B.'||g_pk_view_cols(i)||',';
462     end if;
463   end loop;
464   l_stmt:=substr(l_stmt,1,length(l_stmt)-1);
465   l_stmt:=l_stmt||' from '||g_pk_view||' B where 1=2';
466   if drop_table(l_table)=false then
467     null;
468   end if;
469   if g_debug then
470     write_to_log_file_n(l_stmt||get_time);
471   end if;
472   execute immediate l_stmt;
473   if g_debug then
474     write_to_log_file_n('Created with '||sql%rowcount||' rows '||get_time);
475   end if;
476   l_stmt1:='insert ';
477   if g_src_parallel is not null then
478     l_stmt1:=l_stmt1||'/*+parallel(AA,'||g_src_parallel||')*/ ';
479   end if;
483       g_pk_view_cols(i))=false then
480   l_stmt1:=l_stmt1||' into '||l_table||' AA (';
481   for i in 1..g_number_pk_view_cols loop
482     if g_pk_view_cols(i)<>l_lowest_level_pk and value_in_table(g_pk_cols,g_number_pk_cols,
484       l_stmt1:=l_stmt1||g_pk_view_cols(i)||',';
485     end if;
486   end loop;
487   l_stmt1:=substr(l_stmt1,1,length(l_stmt1)-1);
488   l_stmt1:=l_stmt1||') select ';
489   for i in 1..g_number_pk_view_cols loop
490     if g_pk_view_cols(i)<>l_lowest_level_pk and value_in_table(g_pk_cols,g_number_pk_cols,
491       g_pk_view_cols(i))=false then
492       l_stmt1:=l_stmt1||'B.'||g_pk_view_cols(i)||',';
493     end if;
494   end loop;
495   l_stmt1:=substr(l_stmt1,1,length(l_stmt1)-1);
496   l_stmt1:=l_stmt1||' from '||g_dang_table||' A,'||g_pk_view||' B where ';
497   if g_number_profile_options>0 then
498     for k in 1..g_number_profile_options loop
499       l_stmt:=l_stmt1;
500       for i in 1..g_number_pk_cols loop
501         if g_pk_porfile_number(i)=k then
502           l_stmt:=l_stmt||' B.'||g_pk_cols(i)||'=A.'||g_pk_cols(i)||' and ';
503         end if;
504       end loop;
505       l_stmt:=substr(l_stmt,1,length(l_stmt)-4);
506       if g_err_rec_flag then
507         l_stmt:=l_stmt||' and A.level_table='||l_lowest_level_id;
508       end if;
509       if g_debug then
510         write_to_log_file_n(l_stmt||get_time);
511       end if;
512       execute immediate l_stmt;
513       if g_debug then
514         write_to_log_file_n('Inserted '||sql%rowcount||' rows '||get_time);
515       end if;
516       commit;
517     end loop;
518   else
519     l_stmt:=l_stmt1;
520     l_stmt:=l_stmt||' A.value=B.'||l_lowest_level_pk;
521     if g_err_rec_flag then
522       l_stmt:=l_stmt||' and A.level_table='||l_lowest_level_id;
523     end if;
524     if g_debug then
525       write_to_log_file_n(l_stmt||get_time);
526     end if;
527     execute immediate l_stmt;
528     if g_debug then
529       write_to_log_file_n('Inserted '||sql%rowcount||' rows '||get_time);
530     end if;
531     commit;
532   end if;
533   --insert into g_wh_dang_table
534   for i in 1..l_number_level loop
535     if l_level(i)<>l_lowest_level then
536       l_level_pk:=get_pk_for_level(l_level_prefix(i));
537       if l_level_pk is not null then
538         l_table2:=g_dang_table||'2';
539         l_stmt:='create table '||l_table2||' tablespace '||g_src_op_table_space;
540         if g_src_parallel is not null then
541           l_stmt:=l_stmt||' parallel(degree '||g_src_parallel||') ';
542         end if;
543         l_stmt:=l_stmt||' as select distinct '||l_level_pk||' from '||l_table;
544         if drop_table(l_table2)=false then
545           null;
546         end if;
547         if g_debug then
548           write_to_log_file_n(l_stmt||get_time);
549         end if;
550         execute immediate l_stmt;
551         if g_debug then
552           write_to_log_file_n('Created with '||sql%rowcount||' rows '||get_time);
553         end if;
554         if g_err_rec_flag then
555           l_table3:=g_dang_table||'3';
556           l_stmt:='create table '||l_table3||' tablespace '||g_src_op_table_space;
557           if g_src_parallel is not null then
558             l_stmt:=l_stmt||' parallel(degree '||g_src_parallel||') ';
559           end if;
560           l_stmt:=l_stmt||' as select value '||l_level_pk||' from '||g_dang_table||
561           ' where level_table='||l_level_id(i);
562           if drop_table(l_table3)=false then
563             null;
564           end if;
565           if g_debug then
566             write_to_log_file_n(l_stmt||get_time);
567           end if;
568           execute immediate l_stmt;
569           if g_debug then
570             write_to_log_file_n('Created with '||sql%rowcount||' rows '||get_time);
571           end if;
572           l_table4:=g_dang_table||'4';
573           l_stmt:='create table '||l_table4||' tablespace '||g_src_op_table_space;
574           if g_src_parallel is not null then
575             l_stmt:=l_stmt||' parallel(degree '||g_src_parallel||') ';
576           end if;
577           l_stmt:=l_stmt||' as select '||l_level_pk||' from '||l_table2||' MINUS select '||
578           l_level_pk||' from '||l_table3;
579           if drop_table(l_table4)=false then
580             null;
581           end if;
582           if g_debug then
583             write_to_log_file_n(l_stmt||get_time);
584           end if;
585           execute immediate l_stmt;
586           if g_debug then
587             write_to_log_file_n('Created with '||sql%rowcount||' rows '||get_time);
588           end if;
589           if drop_table(l_table2)=false then
590             null;
591           end if;
592           if drop_table(l_table3)=false then
593             null;
594           end if;
595         else
596           l_table4:=l_table2;
597         end if;
598         l_stmt:='insert into '||g_dang_table||'(level_table,value) select '||l_level_id(i)||','||l_level_pk||
599         ' from '||l_table4;
600         if g_debug then
601           write_to_log_file_n(l_stmt||get_time);
602         end if;
603         execute immediate l_stmt;
604         if g_debug then
605           write_to_log_file_n('Inserted '||sql%rowcount||' rows '||get_time);
606         end if;
607         commit;
608         if drop_table(l_table4)=false then
609           null;
610         end if;
611       else
612         if g_debug then
613           write_to_log_file_n('No pk found for level '||l_level(i)||' in PK view ');
614         end if;
615       end if;
616     end if;
617   end loop;
618   if drop_table(l_table)=false then
619     null;
620   end if;
621   return true;
622 Exception when others then
623   g_status_message:=sqlerrm;
624   write_to_log_file_n(g_status_message);
625   return false;
626 End;
627 
628 function init_all return boolean is
629 Begin
630   g_status_message:=null;
631   g_read_cfig_options:=false;
632   g_src_bis_owner:=get_db_user('BIS');
633   g_instance:=get_this_instance;
634   if g_instance is null then
635     write_to_log_file_n('No local instance found');
636     return false;
637   end if;
638   g_dang_table:=g_src_bis_owner||'.SADR_'||g_object_id||'_'||g_instance;
639   g_wh_dang_table:='EDW_ADR_'||g_object_id||'_'||g_instance;--view name
640   g_level_table:=g_src_bis_owner||'.SLID_'||g_object_id||'_'||g_instance;
641   g_number_pk_view_cols:=0;
642   g_number_wh_dang_table_cols:=0;
643   g_err_rec_flag:=false;
644   if g_read_cfig_options then
645     if read_cfig_options=false then
646       return false;
647     end if;
648   else
649     if read_profile_options=false then
650       return false;
651     end if;
652   end if;
653   g_debug:=true;
654   if g_debug then
655     write_to_log_file_n('Check for table '||g_dang_table||' for error recovery');
656   end if;
657   if does_table_have_data(g_dang_table)=2 then
658     g_err_rec_flag:=true;
659   end if;
660   if g_auto_dang_flag=false then
661     write_to_log_file_n('Auto Dangling Recovery NOT Implemented');
662     return true;
663   end if;
664   if get_pk_structure=false then
665     return false;
666   end if;
667   write_to_log_file_n('The option values');
668   write_to_log_file('g_src_bis_owner='||g_src_bis_owner);
669   write_to_log_file('g_instance='||g_instance);
670   write_to_log_file('g_src_op_table_space='||g_src_op_table_space);
671   write_to_log_file('g_src_parallel='||g_src_parallel);
672   return true;
673 Exception when others then
674   g_status_message:=sqlerrm;
675   write_to_log_file_n(g_status_message);
676   return false;
677 End;
678 
679 function get_dim_id(p_object_name varchar2) return number is
680 l_stmt varchar2(5000);
681 TYPE CurTyp IS REF CURSOR;
682 cv   CurTyp;
683 l_object_id number;
684 Begin
685   l_stmt:='select DIM_ID from edw_dimensions_md_v'||g_db_link_stmt||' where DIM_NAME=:a';
686   open cv for l_stmt using p_object_name;
687   fetch cv into l_object_id;
688   close cv;
689   return l_object_id;
690 Exception when others then
691   g_status_message:=sqlerrm;
692   write_to_log_file_n(g_status_message);
693   return null;
694 End;
695 
696 function get_db_user(p_product varchar2) return varchar2 is
697 l_stmt varchar2(5000);
698 TYPE CurTyp IS REF CURSOR;
699 cv   CurTyp;
700 l_dummy1 varchar2(2000);
701 l_dummy2 varchar2(2000);
702 l_schema varchar2(400);
703 Begin
704   if FND_INSTALLATION.GET_APP_INFO(p_product,l_dummy1, l_dummy2,l_schema) = false then
705     write_to_log_file_n('FND_INSTALLATION.GET_APP_INFO returned with error');
706     return null;
707   end if;
708   return l_schema;
709 Exception when others then
710   g_status_message:=sqlerrm;
711   write_to_log_file_n(g_status_message);
712   return null;
713 End;
714 
715 function get_this_instance return varchar2 is
716 l_stmt varchar2(5000);
717 TYPE CurTyp IS REF CURSOR;
718 cv   CurTyp;
719 l_instance varchar2(400);
720 Begin
721   l_stmt:='select instance_code from edw_local_instance';
722   open cv for l_stmt;
723   fetch cv into l_instance;
724   close cv;
725   return l_instance;
726 Exception when others then
727   g_status_message:=sqlerrm;
728   write_to_log_file_n(g_status_message);
729   return null;
730 End;
731 
732 function get_default_tablespace return varchar2 is
733 TYPE CurTyp IS REF CURSOR;
734 cv   CurTyp;
735 l_stmt varchar2(4000);
736 l_op_table_space varchar2(400);
737 Begin
738   l_stmt:='select default_tablespace from dba_users where username=:a';
739   if g_debug then
740     write_to_log_file_n('Going to execute '||l_stmt||' using '||g_src_bis_owner);
741   end if;
742   open cv for l_stmt using g_src_bis_owner;
743   fetch cv into l_op_table_space;
744   close cv;
745   return l_op_table_space;
746 Exception when others then
747   g_status_message:=sqlerrm;
748   write_to_log_file_n(g_status_message);
749   return null;
750 End;
751 
752 function read_profile_options return boolean is
753 l_value varchar2(400);
754 TYPE CurTyp IS REF CURSOR;
755 cv   CurTyp;
756 l_stmt varchar2(4000);
757 l_res number;
758 check_tspace_exist varchar(1);
759 check_ts_mode varchar(1);
760 physical_tspace_name varchar2(100);
761 Begin
762   l_value:=fnd_profile.value('EDW_DEBUG');
763   g_debug:=false;
764   if l_value='Y' then
765     g_debug:=true;
766   end if;
767   if g_debug then
768     write_to_log_file_n('Debug turned ON');
769   else
770     write_to_log_file_n('Debug turned OFF');
771   end if;
772   g_auto_dang_flag:=true;
773   l_stmt:='select 1 from edw_attribute_sets_md_v'||g_db_link_stmt||' sis where '||
774   'sis.ATTRIBUTE_GROUP_NAME=''AUTO_DANGLING_RECOVERY'' '||
775   'and sis.ENTITY_ID=:b';
776   if g_debug then
777     write_to_log_file_n(l_stmt);
778   end if;
779   open cv for l_stmt using g_object_id;
780   fetch cv into l_res;
781   close cv;
782   if l_res=1 then
783     g_auto_dang_flag:=false;
784   end if;
785   if g_auto_dang_flag=false then
786     return true;
787   end if;
788 
789   g_src_op_table_space:=fnd_profile.value('EDW_OP_TABLE_SPACE');
790 
791     if g_src_op_table_space is null then
792 	AD_TSPACE_UTIL.is_new_ts_mode (check_ts_mode);
793 	If check_ts_mode ='Y' then
794 		AD_TSPACE_UTIL.get_tablespace_name ('BIS', 'INTERFACE','Y',check_tspace_exist, physical_tspace_name);
795 		if check_tspace_exist='Y' and physical_tspace_name is not null then
796 			g_src_op_table_space :=  physical_tspace_name;
797 		end if;
798 	end if;
799    end if;
800   if g_src_op_table_space is null then
801     g_src_op_table_space:=get_default_tablespace;
802   end if;
803 
804   g_src_parallel:=fnd_profile.value('EDW_PARALLEL');
805   return true;
806 Exception when others then
807   g_status_message:=sqlerrm;
808   write_to_log_file_n(g_status_message);
809   return false;
810 End;
811 
812 function read_cfig_options return boolean is
813 l_option_value varchar2(20);
814 Begin
815   l_option_value:=get_src_option('DEBUG');
816   if l_option_value='Y' then
817     write_to_log_file_n('Debug turned ON');
818     g_debug:=true;
819   else
820     write_to_log_file_n('Debug turned OFF');
821     g_debug:=false;
822   end if;
823   l_option_value:=null;
824   l_option_value:=get_src_option('AUTODANG');
825   if l_option_value='N' then
826     g_auto_dang_flag:=false;
827   else
828     g_auto_dang_flag:=true;
829   end if;
830   if g_auto_dang_flag=false then
831     return true;
832   end if;
833   l_option_value:=null;
834   l_option_value:=get_src_option('PARALLELISM');
835   if l_option_value is not null then
836     g_src_parallel:=to_number(l_option_value);
837     if g_src_parallel=0 then
838       g_src_parallel:=null;
839     end if;
840   else
841     g_src_parallel:=null;
842   end if;
843   if g_src_parallel is not null then
844     execute immediate 'alter session enable parallel dml';
845   end if;
846   g_src_op_table_space:=get_src_option('OPTABLESPACE');
847   if g_src_op_table_space is null then
848     g_src_op_table_space:=get_default_tablespace;
849   end if;
850   return true;
851 Exception when others then
852   g_status_message:=sqlerrm;
853   write_to_log_file_n(g_status_message);
854   return false;
855 End;
856 
857 function get_src_option(p_option_code varchar2) return varchar2 is
858 TYPE CurTyp IS REF CURSOR;
859 cv   CurTyp;
860 l_stmt varchar2(4000);
861 l_option_value varchar2(400);
862 Begin
863   l_stmt:='select EDW_OPTION.get_source_option'||g_db_link_stmt||'(null,'||g_object_id||','''||
864   p_option_code||''','''||g_instance||''') from dual';
865   if g_debug then
866     write_to_log_file_n(l_stmt||get_time);
867   end if;
868   open cv for l_stmt;
869   fetch cv into l_option_value;
870   close cv;
874   write_to_log_file_n(g_status_message);
871   return l_option_value;
872 Exception when others then
873   g_status_message:=sqlerrm;
875   return null;
876 End;
877 
878 
879 function get_time return varchar2 is
880 begin
881  return ' '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS');
882 End;
883 
884 
885 procedure write_to_log_file(p_message varchar2) is
886  l_len number;
887  l_start number:=1;
888  l_end number:=1;
889  last_reached boolean:=false;
890  begin
891  if p_message is null or p_message='' then
892    return;
893  end if;
894  l_len:=nvl(length(p_message),0);
895  if l_len <=0 then
896    return;
897  end if;
898  fnd_file.new_line(FND_FILE.LOG,1);
899  while true loop
900   l_end:=l_start+250;
901   if l_end >= l_len then
902    l_end:=l_len;
903    last_reached:=true;
904   end if;
905   FND_FILE.PUT(FND_FILE.LOG,substr(p_message,l_start,250));
906   l_start:=l_start+250;
907   if last_reached then
908    exit;
909   end if;
910  end loop;
911 Exception when others then
912   null;
913 End;
914 
915 procedure write_to_log_file_n(p_message varchar2) is
916 begin
917   write_to_log_file('  ');
918   write_to_log_file(p_message);
919 Exception when others then
920   g_status_message:=sqlerrm;
921   null;
922 end;
923 
924 function drop_table(p_table_name varchar2,p_owner varchar2) return boolean is
925 l_stmt varchar2(4000);
926 Begin
927   if g_debug then
928     write_to_log_file_n('In drop_table '||p_table_name||' owner '||p_owner);
929   end if;
930   if p_owner is null then
931     l_stmt:='drop table '||p_table_name;
932     if g_debug then
933       write_to_log_file_n('Going to execute '||l_stmt);
934     end if;
935     execute immediate l_stmt;
936   else
937     l_stmt:='drop table '||p_owner||'.'||p_table_name;
938     if g_debug then
939       write_to_log_file_n('Going to execute '||l_stmt);
940     end if;
941     execute immediate l_stmt;
942   end if;
943   return  true;
944 Exception when others then
945   write_to_log_file_n('Could not drop table '||sqlerrm);
946   return false;
947 End;
948 
949 function check_table(p_table varchar2, p_owner varchar2) return boolean is
950 l_stmt varchar2(10000);
951 TYPE CurTyp IS REF CURSOR;
952 cv   CurTyp;
953 Begin
954   if g_debug then
955     write_to_log_file_n('In check_table for '||p_table||' and owner '||p_owner);
956   end if;
957   begin
958     if p_owner is null then
959       l_stmt:='select 1 from '||p_table||' where rownum=1';
960     else
961       l_stmt:='select 1 from '||p_owner||'.'||p_table||' where rownum=1';
962     end if;
963     open cv for l_stmt;
964     close cv;
965     if g_debug then
966       write_to_log_file('Table found');
967     end if;
968     return true;
969   exception when others then
970     g_status_message:=sqlerrm;
971     if g_debug then
972       write_to_log_file('Table NOT found');
973     end if;
974     return false;
975   end;
976 Exception when others then
977   g_status_message:=sqlerrm;
978   write_to_log_file_n('Exception in  check_table '||sqlerrm||' '||get_time);
979   return false;
980 End;
981 
982 function get_db_columns_for_table(
983     p_table varchar2,
984     p_columns OUT NOCOPY varcharTableType,
985     p_number_columns OUT NOCOPY number,
986     p_owner varchar2) return boolean is
987 l_stmt varchar2(5000);
988 TYPE CurTyp IS REF CURSOR;
989 cv   CurTyp;
990 Begin
991   if g_debug then
992     write_to_log_file_n('In get_db_columns_for_table, Input params is '||p_table||
993     ' and owner '||p_owner);
994   end if;
995   p_number_columns:=1;
996 
997   if p_owner is not null then
998     l_stmt:='select column_name from all_tab_columns where table_name=:a and owner=:b order by column_id';
999     if g_debug then
1000       write_to_log_file_n('Going to execute '||l_stmt);
1001     end if;
1002     open cv for l_stmt using p_table,p_owner;
1003   else
1004     l_stmt:='select tab.column_name from all_tab_columns tab, user_synonyms syn where
1005     tab.table_name=:a and tab.table_name=syn.table_name and tab.owner=syn.table_owner order by tab.column_id';
1006 
1007     if g_debug then
1008       write_to_log_file_n('Going to execute '||l_stmt);
1009     end if;
1010     open cv for l_stmt using p_table;
1011   end if;
1012 
1013   loop
1014     fetch cv into p_columns(p_number_columns);
1015     exit when cv%notfound;
1016     p_number_columns:=p_number_columns+1;
1017   end loop;
1018   close cv;
1019   p_number_columns:=p_number_columns-1;
1020   return true;
1021 Exception when others then
1022   g_status_message:=sqlerrm;
1023   write_to_log_file_n(g_status_message);
1024   p_number_columns:=0;
1025   return false;
1026 End;
1027 
1028 procedure analyze_table_stats(p_table varchar2, p_owner varchar2) is
1029 errbuf varchar2(2000);
1030 retcode varchar2(200);
1031 l_owner varchar2(400);
1032 Begin
1033   if g_debug then
1037   if g_src_parallel is null then
1034     write_to_log_file_n('In analyze_table_stats. table is '||p_table||' and p_owner is '||p_owner);
1035   end if;
1036   l_owner:=p_owner;
1038     FND_STATS.GATHER_TABLE_STATS (errbuf, retcode, l_owner, p_table,null,1);
1039   else
1040     FND_STATS.GATHER_TABLE_STATS (errbuf, retcode, l_owner, p_table,null,g_src_parallel);
1041   end if;
1042   if retcode <> '0' then
1043     write_to_log_file_n('FND_STATS.GATHER_TABLE_STATS status message is '||errbuf);
1044   end if;
1045 Exception when others then
1046   g_status_message:=sqlerrm;
1047   write_to_log_file_n('Error in analyze_table_stats '||sqlerrm);
1048 End;
1049 
1050 function get_pk_structure return boolean is
1051 l_start number;
1052 l_end number;
1053 l_length number;
1054 l_col varchar2(200);
1055 l_pk_structure varchar2(800);
1056 l_stmt varchar2(2000);
1057 TYPE CurTyp IS REF CURSOR;
1058 cv   CurTyp;
1059 Begin
1060   l_stmt:='select profile_option_name from fnd_profile_options where profile_option_name '||
1061   ' like '''||g_object_name||'_PS%''';
1062   if g_debug then
1063     write_to_log_file_n(l_stmt);
1064   end if;
1065   g_number_profile_options:=1;
1066   open cv for l_stmt;
1067   loop
1068     fetch cv into g_profile_options(g_number_profile_options);
1069     exit when cv%notfound;
1070     g_number_profile_options:=g_number_profile_options+1;
1071   end loop;
1072   g_number_profile_options:=g_number_profile_options-1;
1073   g_number_pk_cols:=0;
1074   for i in 1..g_number_profile_options loop
1075     if g_debug then
1076       write_to_log_file_n('Looking at '||g_profile_options(i));
1077     end if;
1078     l_pk_structure:=null;
1079     l_pk_structure:=fnd_profile.value(g_profile_options(i));
1080     if l_pk_structure is not null then
1081       l_start:=1;
1082       l_end:=1;
1083       l_length:=length(l_pk_structure);
1084       loop
1085         l_end:=instr(l_pk_structure,'-',l_start);
1086         if l_end=0 then
1087           l_end:=l_length+1;
1088         end if;
1089         l_col:=substr(l_pk_structure,l_start,(l_end-l_start));
1090         if l_col<>'INST' then
1091           g_number_pk_cols:=g_number_pk_cols+1;
1092           g_pk_cols(g_number_pk_cols):=l_col;
1093           g_pk_porfile_number(g_number_pk_cols):=i;
1094         end if;
1095         if l_end>l_length then
1096           exit;
1097         end if;
1098         l_start:=l_end+1;
1099       end loop;
1100     end if;
1101   end loop;
1102   if g_debug then
1103     write_to_log_file_n('All the columns paresed from pk structure ');
1104     for i in 1..g_number_pk_cols loop
1105       write_to_log_file(g_pk_porfile_number(i)||' '||g_pk_cols(i));
1106     end loop;
1107   end if;
1108   return true;
1109 Exception when others then
1110   g_status_message:=sqlerrm;
1111   write_to_log_file_n('Error in get_pk_structure '||g_status_message);
1112   return false;
1113 End;
1114 
1115 function value_in_table(
1116     p_table varcharTableType,
1117     l_number_table number,
1118     p_value varchar2) return boolean is
1119 Begin
1120   if p_value is null or l_number_table <=0 then
1121     return false;
1122   end if;
1123   for i in 1..l_number_table loop
1124     if p_table(i)=p_value then
1125       return true;
1126     end if;
1127   end loop;
1128   return false;
1129 Exception when others then
1130   g_status_message:=sqlerrm;
1131   write_to_log_file_n('Exception in value_in_table '||sqlerrm);
1132   return false;
1133 End;
1134 
1135 function get_pk_for_level(p_level_prefix varchar2) return varchar2 is
1136 Begin
1137   for i in 1..g_number_pk_view_cols loop
1138     if instr(g_pk_view_cols(i),p_level_prefix||'_',1)=1 then
1139       if value_in_table(g_pk_cols,g_number_pk_cols,g_pk_view_cols(i))=false then
1140         return g_pk_view_cols(i);
1141       end if;
1142     end if;
1143   end loop;
1144   return null;
1145 Exception when others then
1146   g_status_message:=sqlerrm;
1147   write_to_log_file_n('Exception in get_pk_for_level '||sqlerrm);
1148   return null;
1149 End;
1150 
1151 /*
1152 does_table_have_data :
1153 0 : Error
1154 1: no data
1155 2: data present
1156 */
1157 function does_table_have_data(p_table varchar2, p_where varchar2) return number is
1158 l_stmt varchar2(2000);
1159 TYPE CurTyp IS REF CURSOR;
1160 cv   CurTyp;
1161 l_res number:=null;
1162 Begin
1163   if g_debug then
1164     write_to_log_file_n('In does_table_have_data , table is '||p_table||' and where clause is '||p_where);
1165   end if;
1166   if p_where is null then
1167     l_stmt:='select 1 from '||p_table||' where rownum=1';
1168   else
1169     l_stmt:='select 1 from '||p_table||' where '||p_where||' and rownum=1';
1170   end if;
1171   open cv for l_stmt;
1172   fetch cv into l_res;
1173   close cv;
1174   if l_res is null then
1175     if g_debug then
1176       write_to_log_file('No');
1177     end if;
1178     return 1;
1179   end if;
1180   if g_debug then
1181     write_to_log_file('Yes');
1182   end if;
1183   return 2;
1184 Exception when others then
1185   g_status_message:=sqlerrm;
1186   write_to_log_file_n('Error in does_table_have_data '||sqlerrm);
1187   return 0;
1188 End;
1189 
1190 function create_missing_key_view return boolean is
1191 l_stmt varchar2(2000);
1192 Begin
1193   if g_debug then
1194     write_to_log_file_n('In create_missing_key_view'||get_time);
1195   end if;
1196   l_stmt:='create or replace view '||g_missing_key_view||' as select '''||g_object_name||''' dimension_name,'||
1197   'A.name level_table,B.value value';
1198   for i in 1..g_number_pk_cols loop
1199     l_stmt:=l_stmt||',B.'||g_pk_cols(i)||' '||g_pk_cols(i);
1200   end loop;
1201   l_stmt:=l_stmt||' from '||g_level_table||' A,'||g_dang_table||' B where A.id=B.level_table';
1202   if g_debug then
1203     write_to_log_file_n(l_stmt||get_time);
1204   end if;
1205   execute immediate l_stmt;
1206   if g_debug then
1207     write_to_log_file_n('Created view '||get_time);
1208   end if;
1209   return true;
1210 Exception when others then
1211   g_status_message:=sqlerrm;
1212   write_to_log_file_n('Exception in create_missing_key_view '||sqlerrm);
1213   return false;
1214 End;
1215 
1216 --will be called from wrap_up in collection util
1217 procedure truncate_dang_table is
1218 Begin
1219   execute immediate 'truncate table '||g_dang_table;
1220 Exception when others then
1221   g_status_message:=sqlerrm;
1222   write_to_log_file_n('Exception in truncate_dang_table '||sqlerrm);
1223 End;
1224 
1225 END EDW_SRC_DANG_RECOVERY;