1 package body BSC_MV_ADAPTER AS
2 /*$Header: BSCMVLDB.pls 120.10 2006/07/10 07:58:52 rkumar ship $*/
3
4 function get_partition_clause(p_keys in varchar2) return varchar2 is
5 l_num_partitions number;
6 l_partition_stmt varchar2(1000);
7 begin
8
9 l_num_partitions := bsc_dbgen_metadata_reader.get_max_partitions;
10 if (l_num_partitions > 2 and p_keys is not null) then
11 l_partition_stmt := 'partition by hash('||p_keys||') partitions '||l_num_partitions;
12 else
13 l_partition_stmt := null;
14 end if;
15 if g_debug then
16 write_to_log_file_n('In get_partition_clause, returning '||l_partition_stmt);
17 end if;
18 return l_partition_stmt;
19 end;
20
21 /*
22 This API can create MV or View
23 */
24 function create_mv_normal(
25 p_kpi varchar2,
26 p_mv_name varchar2,
27 p_mv_owner varchar2,
28 p_child_mv BSC_IM_UTILS.varchar_tabletype,
29 p_number_child_mv number,
30 p_options BSC_IM_UTILS.varchar_tabletype,
31 p_number_options number,
32 p_apps_origin varchar2,
33 p_type varchar2,
34 p_create_non_unique_index boolean
35 )return boolean is
36 --------------------------------------
37 l_mv_stmt varchar2(32000);
38 l_fast_refresh_mv boolean;
39 --------------------------------------
40 --map info
41 l_map_name BSC_IM_UTILS.varchar_tabletype;
42 l_map_type BSC_IM_UTILS.varchar_tabletype;
43 l_object_name BSC_IM_UTILS.varchar_tabletype;
44 l_map_property BSC_IM_UTILS.varchar_tabletype;
45 l_detail_property BSC_IM_UTILS.varchar_tabletype;
46 l_chosen_map BSC_IM_UTILS.boolean_tabletype;
47 l_number_mapping number;
48 --------------------------------------
49 --map details
50 l_line BSC_IM_UTILS.varchar_tabletype;
51 l_line_type BSC_IM_UTILS.varchar_tabletype;
52 l_number_map_detail number;
53 --------------------------------------
54 --manage snapshot log creation on the mv
55 l_snplog_created BSC_IM_UTILS.boolean_tabletype;
56 --------------------------------------
57 l_b_tables BSC_IM_UTILS.varchar_tabletype;
58 l_base_snplog_created BSC_IM_UTILS.boolean_tabletype;
59 l_number_b_tables number;
60 --------------------------------------
61 l_level_tables BSC_IM_UTILS.varchar_tabletype;
62 l_level_snplog_created BSC_IM_UTILS.boolean_tabletype;
63 l_number_level_tables number;
64 --------------------------------------
65 l_tablespace varchar2(400);
66 l_storage varchar2(800);
67 l_index_tablespace varchar2(400);
68 l_index_storage varchar2(800);
69 --------------------------------------
70 l_db_version varchar2(80);
71 l_status varchar2(200);
72 --------------------------------------
73 l_keys varchar2(10000);
74 Begin
75 if g_debug then
76 write_to_log_file_n('In create_mv_normal '||p_mv_name||' '||p_mv_owner||', p_type='||p_type||' p_kpi='||p_kpi) ;
77 if ( p_create_non_unique_index) then
78 write_to_log_file_n('p_create_non_unique_index=true');
79 end if;
80 end if;
81 g_kpi:=p_kpi;
82 l_db_version:=BSC_IM_UTILS.get_db_version;
83 if p_type='MV' then
84 if BSC_IM_UTILS.get_option_value(p_options,p_number_options,'FULL REFRESH')='Y' then
85 l_fast_refresh_mv:=false;
86 else
87 l_fast_refresh_mv:=true;
88 end if;
89 else
90 l_fast_refresh_mv:=false; --view
91 end if;
92 ----------------------------------------------------
93 --l_status:=check_old_mv_view(p_mv_name,p_mv_owner,p_type,p_options,p_number_options);
94 l_status:=check_old_mv_view(p_mv_name,null,p_type,p_options,p_number_options);
95 if l_status='ALREADY PRESENT' then
96 return true;
97 elsif l_status='ERROR' then
98 --error
99 return false;
100 end if;
101 --if none of the above, continue processing
102 ----------------------------------------------------
103 l_tablespace:=BSC_IM_UTILS.get_option_value(p_options,p_number_options,'TABLESPACE');
104 l_storage:=BSC_IM_UTILS.get_option_value(p_options,p_number_options,'STORAGE');
105 l_index_tablespace:=BSC_IM_UTILS.get_option_value(p_options,p_number_options,'INDEX TABLESPACE');
106 l_index_storage:=BSC_IM_UTILS.get_option_value(p_options,p_number_options,'INDEX STORAGE');
107 if l_tablespace is not null then
108 if instr(lower(l_tablespace),'tablespace')<=0 then
109 l_tablespace:=' tablespace '||l_tablespace;
110 end if;
111 end if;
112 if l_storage is not null then
113 if instr(lower(l_storage),'storage')<=0 then
114 l_storage:=' storage '||l_storage;
115 end if;
116 end if;
117 --------
118 if l_index_tablespace is null then
119 l_index_tablespace:=l_tablespace;
120 else
121 if instr(lower(l_index_tablespace),'tablespace')<=0 then
122 l_index_tablespace:=' tablespace '||l_index_tablespace;
123 end if;
124 end if;
125 if l_index_storage is null then
126 l_index_storage:=l_storage;
127 else
128 if instr(lower(l_index_storage),'storage')<=0 then
129 l_index_storage:=' storage '||l_index_storage;
130 end if;
131 end if;
132 ----------------------------------------------------
133 --see if we need to create any snapshot logs
134 for i in 1..p_number_child_mv loop
135 l_snplog_created(i):=false;
136 end loop;
137 --p_number_child_mv is only the list of mv.
138 if p_type='MV' and l_fast_refresh_mv then
139 for i in 1..p_number_child_mv loop
140 if create_mv_log_on_table(
141 p_child_mv(i),
142 p_apps_origin,
143 p_options,
144 p_number_options,
145 l_snplog_created(i))=false then
146 return false;
147 end if;
148 end loop;
149 end if;
150 --------------------------------------------
151 --get the mapping info
152 if BSC_IM_INT_MD.get_mapping(
153 p_mv_name,
154 p_apps_origin,
155 l_map_name,
156 l_map_type,
157 l_object_name,
158 l_map_property,
159 l_number_mapping)=false then
160 return false;
161 end if;
162 if g_debug then
163 write_to_log_file_n('The maps read');
164 for i in 1..l_number_mapping loop
165 write_to_log_file(l_map_name(i)||' '||l_map_type(i)||' '||l_object_name(i)||' '||l_map_property(i));
166 end loop;
167 end if;
168 --------------------------------------------
169 --from the property, get the list of B tables. we have to create dummy MV on these B tables if this
170 --MV gets created as full refresh
171 declare
172 ll_string varchar2(10000);
173 ll_b_tables BSC_IM_UTILS.varchar_tabletype;
174 ll_number_b_tables number;
175 begin
176 l_number_b_tables:=0;
177 for i in 1..l_number_mapping loop
178 ll_string:=null;
179 ll_number_b_tables:=0;
180 ll_string:=BSC_IM_UTILS.get_option_value(l_map_property(i),',','BASE TABLES');
181 if ll_string is not null then
182 if BSC_IM_UTILS.parse_values(ll_string,'+',ll_b_tables,ll_number_b_tables)=false then
183 return false;
184 end if;
185 for j in 1..ll_number_b_tables loop
186 if BSC_IM_UTILS.in_array(l_b_tables,l_number_b_tables,ll_b_tables(j))=false then
187 l_number_b_tables:=l_number_b_tables+1;
188 l_b_tables(l_number_b_tables):=ll_b_tables(j);
189 l_base_snplog_created(l_number_b_tables):=false;
190 end if;
191 end loop;
192 end if;
193 end loop;
194 if g_debug then
195 write_to_log_file_n('The Base Tables for which we may need to create snapshot logs');
196 for i in 1..l_number_b_tables loop
197 write_to_log_file(l_b_tables(i));
198 end loop;
199 end if;
200 if p_type='MV' and l_fast_refresh_mv then
201 --create mv log on these base tables for inc mv
202 for i in 1..l_number_b_tables loop
203 if create_mv_log_on_table(
204 l_b_tables(i),
205 p_apps_origin,
206 p_options,
207 p_number_options,
208 l_base_snplog_created(i))=false then
209 return false;
210 end if;
211 end loop;
212 end if;
213 end;
214 --------------------------------------------
215 --from the property, get the list of level tables. we have to create snp log on these level tables if this
216 --MV gets created as full refresh
217 declare
218 ll_string varchar2(10000);
219 ll_level_tables BSC_IM_UTILS.varchar_tabletype;
220 ll_number_level_tables number;
221 begin
222 l_number_level_tables:=0;
223 for i in 1..l_number_mapping loop
224 ll_string:=null;
225 ll_number_level_tables:=0;
226 ll_string:=BSC_IM_UTILS.get_option_value(l_map_property(i),',','DIM LEVELS');
227 if ll_string is not null then
228 if BSC_IM_UTILS.parse_values(ll_string,'+',ll_level_tables,ll_number_level_tables)=false then
229 return false;
230 end if;
231 for j in 1..ll_number_level_tables loop
232 if BSC_IM_UTILS.in_array(l_level_tables,l_number_level_tables,ll_level_tables(j))=false then
233 l_number_level_tables:=l_number_level_tables+1;
234 l_level_tables(l_number_level_tables):=ll_level_tables(j);
235 l_level_snplog_created(l_number_level_tables):=false;
236 end if;
237 end loop;
238 end if;
239 end loop;
240 if g_debug then
241 write_to_log_file_n('The Dim Level Tables for which we may need to create snapshot logs');
242 for i in 1..l_number_level_tables loop
243 write_to_log_file(l_level_tables(i));
244 end loop;
245 end if;
246 if p_type='MV' and l_fast_refresh_mv then
247 --create mv log on these base tables for inc mv
248 for i in 1..l_number_level_tables loop
249 if create_mv_log_on_table(
250 l_level_tables(i),
251 p_apps_origin,
252 p_options,
253 p_number_options,
254 l_level_snplog_created(i))=false then
255 return false;
256 end if;
257 end loop;
258 end if;
259 end;
260 ------------------------------------------------
261 --create the MV in the BSC user.
262 <<start_mv_create>>
263 if g_debug then
264 if l_fast_refresh_mv then
265 write_to_log_file_n('Try with FAST Refresh');
266 else
267 write_to_log_file_n('Try with FULL Refresh');
268 end if;
269 end if;
270 --------------------------------------------
271 --find out what maps to look at
272 declare
273 begin
274 --ran into an error with 8i instance : ORA-30489 Cannot have more than one rollup/cube expression list
275 --cannot have rollup(fk1),rollup(fk2)
276 --so for 8i, we never go for full refresh mapping
277 for i in 1..l_number_mapping loop
278 l_chosen_map(i):=true;
279 if l_fast_refresh_mv then
280 --if this is a fast refresh mv and there is full refresh specified, ignore the part
281 if BSC_IM_UTILS.parse_and_find(l_map_property(i),',','FULL REFRESH') then
282 l_chosen_map(i):=false;
283 else
284 l_chosen_map(i):=true;
285 end if;
286 else --this is full refresh
287 if BSC_IM_UTILS.parse_and_find(l_map_property(i),',','FAST REFRESH') then
288 l_chosen_map(i):=false;
289 else
290 l_chosen_map(i):=true;
291 end if;
292 end if;
293 end loop;
294 if g_debug then
295 write_to_log_file_n('List of maps being looked at and ignored');
296 for i in 1..l_number_mapping loop
297 if l_chosen_map(i) then
298 write_to_log_file(l_map_name(i)||' YES');
299 else
300 write_to_log_file(l_map_name(i)||' NO');
301 end if;
302 end loop;
303 end if;
304 end;
305 --------------------------------------------
306 /*
307 have to use ad_mv api to create mv. pre-req patch 3050839
308 ad_mv.create_mv(<MV_NAME>,
309 ' create materialized view <MV NAME>'||
310 ' tablespace '||ad_mv.g_mv_data_tablespace||
311 ' INITRANS 4 MAXTRANS 255'||
312 ' storage(INITIAL 4K NEXT .. '||
313 ' MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0)'||
314 ' build <DEFERRED|IMMEDIATE>'||
315 ' using index tablespace '||ad_mv.g_mv_index_tablespace||
316 ' storage (INITIAL 4K NEXT .. '||
317 ' MAXEXTENTS UNLIMITED PCTINCREASE 0) '||
318 ' refresh <FAST|COMPLETE> ON DEMAND'||
319 ' with <rowid|primary key> '||
320 ' <ENABLE|DISABLE QUERY REWRITE>'||
321 ' as <sub-query qualifying table references with schema name...>');
322
323 */
324 if p_type='MV' then
325 --l_mv_stmt:='create materialized view '||p_mv_owner||'.'||p_mv_name;
326 --create the MV in the apps schema
327 l_mv_stmt:='create materialized view '||p_mv_name;
328 l_mv_stmt:=l_mv_stmt||' '||l_tablespace||' INITRANS 4 MAXTRANS 255 '||l_storage||' ';
329 l_mv_stmt := l_mv_stmt || '<PARTITION_CLAUSE>';
330 l_mv_stmt:=l_mv_stmt||' BUILD DEFERRED ';
331 if l_tablespace is not null then
332 l_mv_stmt:=l_mv_stmt||' using index '||l_tablespace||' '||l_storage;
333 end if;
334 if l_fast_refresh_mv then
335 l_mv_stmt:=l_mv_stmt||' REFRESH FAST ON DEMAND ';
336 end if;
337 l_mv_stmt:=l_mv_stmt||' DISABLE QUERY REWRITE ';
338 elsif p_type='VIEW' then
339 l_mv_stmt:='create view '||p_mv_name;
340 else
341 if g_debug then
342 write_to_log_file_n('Unknown type '||p_type||'. Error.');
343 return false;
344 end if;
345 end if;
346 l_mv_stmt:=l_mv_stmt||' AS ';
347 ---------------------------------
348 --get the mapping details
349 begin
350 for i in 1..l_number_mapping loop
351 if l_chosen_map(i) then
352 if g_debug then
353 write_to_log_file_n('Process map '||l_map_name(i));
354 end if;
355 if BSC_IM_INT_MD.get_mapping_detail(
356 l_map_name(i),
357 p_apps_origin,
358 l_line,
359 l_line_type,
360 l_detail_property,
361 l_number_map_detail)=false then
362 return false;
363 end if;
364 if g_debug then
365 write_to_log_file_n('The map details read');
366 for i in 1..l_number_map_detail loop
367 write_to_log_file(l_line(i)||' '||l_line_type(i)||' '||l_detail_property(i));
368 end loop;
369 end if;
370 for j in 1..l_number_map_detail loop
371 if l_line_type(j)='SELECT' then
372 if j=1 then
373 l_mv_stmt:=l_mv_stmt||l_line(j);
374 else
375 l_mv_stmt:=l_mv_stmt||' UNION ALL '||l_line(j);
376 end if;
377 elsif l_line_type(j)='SELECT INC' then
378 if l_fast_refresh_mv then
379 l_mv_stmt:=l_mv_stmt||l_line(j);
380 end if;
381 elsif l_line_type(j)='FROM' then
382 l_mv_stmt:=l_mv_stmt||l_line(j);
383 elsif l_line_type(j)='WHERE' then
384 l_mv_stmt:=l_mv_stmt||l_line(j);
385 elsif l_line_type(j)='GROUP BY' then
386 l_mv_stmt:=l_mv_stmt||l_line(j);
387 elsif l_line_type(j)='KEYS' then
388 l_keys := l_line(j);
389 end if;
390 end loop;
391 l_mv_stmt:=l_mv_stmt||' UNION ALL ';
392 else
393 if g_debug then
394 write_to_log_file_n('Not looking at this map '||l_map_name(i));
395 end if;
396 end if;
397 end loop;
398 --we were running into an error where the string is so long, it was beyond 32000 bytes.
399 --in that case, go for full refresh mv with small stmt
400 l_mv_stmt:=substr(l_mv_stmt,1,length(l_mv_stmt)-10);
401
402 -- replace the partition clause
403 l_mv_stmt := replace(l_mv_stmt, '<PARTITION_CLAUSE>', get_partition_clause(l_keys));
404 if g_debug then
405 write_to_log_file_n('l_mv_stmt='||l_mv_stmt);
406 end if;
407 --------------------------
408 --create the mv
409 execute immediate l_mv_stmt;
410 exception when others then
411 BSC_IM_UTILS.g_status_message:=sqlerrm;
412 if g_debug then
413 write_to_log_file_n('Error creating MV '||sqlerrm);
414 end if;
415 if l_fast_refresh_mv then
416 l_fast_refresh_mv:=false;
417 ------------------------------
418 for i in 1..p_number_child_mv loop
419 --if the mv log got created for this mv, drop the mv logs
420 if l_snplog_created(i) then
421 if g_debug then
422 write_to_log_file_n('Going to drop the snapshot log and constraint on '||p_child_mv(i));
423 end if;
424 if BSC_IM_UTILS.drop_mv_log(p_child_mv(i),null)=false then
425 null;
426 end if;
427 --if BSC_IM_UTILS.drop_constraint(p_child_mv(i),null,p_child_mv(i)||'_PK')=false then
428 --null;
429 --end if;
430 end if;
431 end loop;
432 -----------------------------
433 --drop the mv logs on the base tables
434 for i in 1..l_number_b_tables loop
435 if l_base_snplog_created(i) then
436 if g_debug then
437 write_to_log_file_n('Going to drop the snapshot log and constraint on '||l_b_tables(i));
438 end if;
439 if BSC_IM_UTILS.drop_mv_log(l_b_tables(i),null)=false then
440 null;
441 end if;
442 --if BSC_IM_UTILS.drop_constraint(l_b_tables(i),null,l_b_tables(i)||'_PK')=false then
443 --null;
444 --end if;
445 end if;
446 end loop;
447 -----------------------------
448 --drop the mv logs on the dim levels
449 for i in 1..l_number_level_tables loop
450 if l_level_snplog_created(i) then
451 if g_debug then
452 write_to_log_file_n('Going to drop the snapshot log and constraint on '||l_level_tables(i));
453 end if;
454 if BSC_IM_UTILS.drop_mv_log(l_level_tables(i),null)=false then
455 null;
456 end if;
457 --if BSC_IM_UTILS.drop_constraint(l_level_tables(i),null,l_level_tables(i)||'_PK')=false then
458 --null;
459 --end if;
460 end if;
461 end loop;
462 -----------------------------
463 --dont create dummy mv for now
464 /*if create_dummy_mv(l_b_tables,l_number_b_tables,p_mv_name,p_mv_owner)=false then
465 --we have to consider cases where the base tables may not have snapshot logs or pk constraints
466 null;
467 end if;*/
468 goto start_mv_create;
469 else
470 raise;
471 end if;
472 end;
473 if p_type='MV' then
474 --MV are created in the apps schema
475 --if create_mv_synonym(p_mv_name,p_mv_name,p_mv_owner)=false then
476 --null;
477 --end if;
478 if create_mv_index(p_mv_name,null,p_kpi,p_apps_origin,l_index_tablespace,l_index_storage,
479 p_create_non_unique_index)=false then
480 return false;
481 end if;
482 end if;
483 BSC_IM_UTILS.write_to_log_file_n(p_type||' '||p_mv_name||' Created');
484 if l_fast_refresh_mv then
485 if p_type='MV' then
486 BSC_IM_UTILS.write_to_log_file_n(' -> FAST REFRESH');
487 end if;
488 else
489 if p_type='MV' then
490 BSC_IM_UTILS.write_to_log_file_n(' -> FULL REFRESH');
491 end if;
492 end if;
493 BSC_IM_UTILS.write_to_log_file_n(' ');
494 --------------------------------------------
495 return true;
496 Exception when others then
497 BSC_IM_UTILS.g_status_message:=sqlerrm;
498 g_status_message:=sqlerrm;
499 write_to_log_file_n('Exception in create_mv_normal '||sqlerrm);
500 return false;
501 End;
502
503 function create_dummy_mv(
504 p_b_tables BSC_IM_UTILS.varchar_tabletype,
505 p_number_b_tables number,
506 p_mv_name varchar2,
507 p_mv_owner varchar2
508 )return boolean is
509 l_mv_name varchar2(200);
510 l_stmt varchar2(8000);
511 Begin
512 if g_debug then
513 write_to_log_file_n('In create_dummy_mv '||p_mv_name||' '||p_mv_owner);
514 end if;
515 if g_bsc_owner is null then
516 g_bsc_owner:=BSC_IM_UTILS.get_bsc_owner;
517 end if;
518 if p_number_b_tables>0 then
519 for i in 1..p_number_b_tables loop
520 --create dummy MV on as many base tables as possible
521 l_mv_name:=substr(substr(p_mv_name,1,length(p_mv_name)-3),1,24)||'_D'||i||'MV';
522 if BSC_IM_UTILS.drop_mv(l_mv_name,null)=false then
523 null;
524 end if;
525 if BSC_IM_UTILS.drop_synonym(l_mv_name)=false then
526 null;
527 end if;
528 --create the mv on the apps schema
529 l_stmt:='CREATE MATERIALIZED VIEW '||l_mv_name||' BUILD DEFERRED REFRESH FAST ON '||
530 'DEMAND AS SELECT '||p_b_tables(i)||'.*,'||p_b_tables(i)||'.rowid row_id from '||
531 g_bsc_owner||'.'||p_b_tables(i)||' '||p_b_tables(i)||
532 ' where 1=2';
533 if g_debug then
534 write_to_log_file_n(l_stmt);
535 end if;
536 begin
537 execute immediate l_stmt;
538 exception when others then
539 BSC_IM_UTILS.g_status_message:=sqlerrm;
540 if g_debug then
541 write_to_log_file_n('Could not create dummy mv on '||p_b_tables(i)||' '||sqlerrm);
542 end if;
543 end;
544 end loop;
545 end if;
546 return true;
547 Exception when others then
548 BSC_IM_UTILS.g_status_message:=sqlerrm;
549 g_status_message:=sqlerrm;
550 write_to_log_file_n('Exception in create_dummy_mv '||sqlerrm);
551 return false;
552 End;
553 function zmv_exists_for_mv(
554 p_mv_name varchar2,
555 p_mv_owner varchar2,
556 p_kpi varchar2,
557 p_apps_origin varchar2) return boolean
558 is
559 l_zmv varchar2(100);
560 -------------------------------------------------------------------------
561 l_object_type BSC_IM_UTILS.varchar_tabletype;
562 l_description BSC_IM_UTILS.varchar_tabletype;
563 l_zero_code_mv BSC_IM_UTILS.varchar_tabletype;
564 l_number_zero_code_mv number;
565 l_owner varchar2(100);
566 cursor cZMV(p_owner varchar2, p_zmv_name varchar2) is
567 select count(1) from all_objects where
568 owner=p_owner and object_name=p_zmv_name
569 and object_type = 'MATERIALIZED VIEW';
570 begin
571 l_zmv := upper(substr(p_mv_name, 1, instr(p_mv_name, '_MV', -1)))||'ZMV';
572 --write_to_log_file('zmv_exists_for_mv, we are searching for l_zmv ='||l_zmv);
573 if BSC_IM_INT_MD.get_object(
574 p_kpi,
575 p_apps_origin,
576 'ZERO CODE MV',
577 l_zero_code_mv,
578 l_object_type,
579 l_description,
580 l_number_zero_code_mv)=false then
581 return false;
582 end if;
583 for i in 1..l_number_zero_code_mv loop
584 write_to_log_file('Comparing '||l_zmv||' to '||l_zero_code_mv(i));
585 if (upper(l_zero_code_mv(i)) = l_zmv) then
586 return true;
587 end if;
588 end loop;
589 -- could be called from mv refresh
590 l_owner:=bsc_im_utils.get_table_owner(p_mv_name);
591 open cZMV(l_owner, l_zmv);
592 fetch cZMV into l_number_zero_code_mv;
593 close cZMV;
594 if (l_number_zero_code_mv>0) then
595 return true;
596 end if;
597 return false;
598
599 end;
600
601 function is_higher_mv_a_view(p_mv_name varchar2) return boolean
602 is
603 begin
604
605 return false;
606 end;
607
608 function index_already_exists(p_index_name varchar2, p_mv_name varchar2, p_mv_owner varchar2) return boolean is
609 cursor cIndexExists is
610 select count(1) from user_indexes where index_name=p_index_name
611 and table_name = p_mv_name and table_owner=p_mv_owner;
612 l_index_exists number;
613 begin
614 open cIndexExists;
615 fetch cIndexExists into l_index_exists;
616 close cIndexExists;
617 if l_index_exists > 0 then
618 return true;
619 end if;
620 return false;
621 end;
622
623 /*---------------------------------------------------------
624 New Index strategy
625 Time index for every mv (periodicity_id, year, period)
626
627 Other indexes
628 Case 1: No views above
629 MV and ZMV: periodicity_id, zkeys, nonzkeys, type
630
631 Case 2: Views above, zmv exists
632 MV: periodicity_id, zkeys, nonzkeys, type
633 ZMV: periodicity_id, zkeys, type
634 periodicity_id, nonzkey1
635 .
636 .
637 periodicity_id, nonzkeyn
638
639 Case 3: Views above, no zmv
640 MV: periodicity_id, nonzkey1
641 .
642 .
643 periodicity_id, nonzkeyn
644 ---------------------------------------------------------*/
645 function create_mv_index(
646 p_mv_name varchar2,
647 p_mv_owner varchar2,
648 p_kpi varchar2,
649 p_apps_origin varchar2,
650 p_tablespace varchar2,
651 p_storage varchar2,
652 p_create_non_unique_index boolean,
653 p_called_from_refresh boolean default false
654 )return boolean is
655 ------------------------------------------------------------
656 l_fk_name BSC_IM_UTILS.varchar_tabletype;
657 l_fk_type BSC_IM_UTILS.varchar_tabletype;
658 l_uk_name BSC_IM_UTILS.varchar_tabletype;
659 l_uk_parent_name BSC_IM_UTILS.varchar_tabletype;
660 l_fk_property BSC_IM_UTILS.varchar_tabletype;
661 l_description BSC_IM_UTILS.varchar_tabletype;
662 l_number_fk number;
663 ------------------------------------------------------------
664 l_stmt varchar2(8000);
665 --l_db_version varchar2(80);
666 l_trans varchar2(200);
667 ------------------------------------------------------------
668 l_create_non_unique_index boolean;
669 l_owner varchar2(200);
670 ------------------------------------------------------------
671 l_zero_code_cols dbms_sql.varchar2_table;
672 -----
673 l_higher_level_view_exists boolean ;
674 l_time_columns VARCHAR2(100):= '(PERIODICITY_ID, YEAR, PERIOD)';
675 l_index_counter number := 1;
676 l_nonzero_code_cols dbms_sql.varchar2_table;
677 l_is_zmv boolean;
678 l_zmv_exists_for_mv boolean;
679 l_mv_name_for_zmv varchar2(100);
680 ---------------------------------
681
682 l_s_tables BSC_IM_UTILS.varchar_tabletype;
683 l_number_s_tables number;
684
685 Begin
686 --get the fks
687 g_kpi:=p_kpi;
688 l_owner:=p_mv_owner;
689 if l_owner is null then
690 l_owner:=bsc_im_utils.get_table_owner(p_mv_name);
691 end if;
692 l_create_non_unique_index:=p_create_non_unique_index;
693 -- Get the FKS differently for refresh and GDB run
694 if (p_called_from_refresh) then
695 if BSC_BSC_ADAPTER.get_s_tables_for_mv(p_mv_name,l_s_tables,l_number_s_tables)=false then
696 return false;
697 end if;
698 if l_number_s_tables=0 then
699 if g_debug then
700 write_to_log_file_n('No s tables found for '||p_mv_name||'. Do Validations to do...');
701 end if;
702 return true;
703 end if;
704 if BSC_BSC_ADAPTER.get_table_fks(l_s_tables,l_number_s_tables,l_fk_name,l_number_fk)=false then
705 return false;
706 end if;
707 else
708 if BSC_IM_INT_MD.get_fk(
709 p_mv_name,
710 p_apps_origin,
711 l_fk_name,
712 l_fk_type,
713 l_uk_name,
714 l_uk_parent_name,
715 l_description,
716 l_fk_property,
717 l_number_fk)=false then
718 return false;
719 end if;
720 end if;
721
722
723 if (g_debug) then
724 write_to_log_file('In create_mv_index for '||p_mv_name);
725 end if;
726 l_zmv_exists_for_mv := false;
727
728 if (p_mv_name like '%_ZMV') then
729 l_is_zmv := true;
730 if (g_debug) then
731 write_to_log_file(', l_is_zmv=true');
732 end if;
733 l_mv_name_for_zmv := substr(p_mv_name, 1, instr(p_mv_name, '_ZMV', -1))||'MV';
734 else
735 l_is_zmv := false;
736 l_mv_name_for_zmv := p_mv_name;
737 if (g_debug) then
738 write_to_log_file(', l_is_zmv=false');
739 end if;
740 if zmv_exists_for_mv(p_mv_name, p_mv_owner, p_kpi, p_apps_origin) then
741 l_zmv_exists_for_mv := true;
742 if (g_debug) then
743 write_to_log_file(', l_zmv_exists_for_mv=true');
744 end if;
745 else
746 l_zmv_exists_for_mv := false;
747 if (g_debug) then
748 write_to_log_file(', l_zmv_exists_for_mv=false');
749 end if;
750 end if;
751 end if;
752
753 --l_db_version:=BSC_IM_UTILS.get_db_version;
754 l_trans:=' PCTFREE 5 INITRANS 11 MAXTRANS 255 ';
755
756 -- New MV Strategy, enh 4195212
757 -- Every MV has a time index
758 -- Enh#4239064: create index in parallel
759 l_stmt:='create index '||l_owner||'.'||p_mv_name||'N'||l_index_counter||' on '||l_owner||'.'||p_mv_name||l_time_columns;
760 l_stmt:=l_stmt||' '||p_tablespace||' '||p_storage||l_trans||' parallel';
761
762
763
764 if index_already_exists(p_mv_name||'N'||l_index_counter, p_mv_name, p_mv_owner)=false then
765 if BSC_IM_UTILS.create_index(l_stmt,null)=false then
766 return false;
767 end if;
768 end if;
769 -- Enh#4239064: set to noparallel
770 execute immediate 'alter index '||l_owner||'.'||p_mv_name||'N'||l_index_counter||' noparallel';
771
772 l_index_counter := l_index_counter + 1;
773
774 if p_create_non_unique_index OR BSC_IM_UTILS.is_parent_of_type_present(l_mv_name_for_zmv,'VIEW') then
775 l_higher_level_view_exists := true;
776 if (g_debug) then
777 write_to_log_file(' l_higher_level_view_exists := true');
778 end if;
779 else
780 l_higher_level_view_exists := false;
781 if (g_debug) then
782 write_to_log_file(' l_higher_level_view_exists := false');
783 end if;
784 end if;
785 if l_number_fk>0 then
786 l_zero_code_cols.delete;
787 l_nonzero_code_cols.delete;
788 for i in 1..l_number_fk loop
789 if (l_fk_name(i) not in ('PERIODICITY_ID', 'YEAR', 'PERIOD', 'TYPE')) then
790 if(BSC_IM_UTILS.needs_zero_code_mv(p_mv_name, p_kpi, l_fk_name(i))) then
791 write_to_log_file(l_fk_name(i)||' is a zero code col');
792 l_zero_code_cols(l_zero_code_cols.count+1) := l_fk_name(i);
793 else
794 write_to_log_file(l_fk_name(i)||' is a non zero code col');
795 l_nonzero_code_cols(l_nonzero_code_cols.count+1) :=l_fk_name(i);
796 end if;
797 end if;
798 end loop;
799 end if;
800
801 -- Case 1 both MV/ZMV and MV only for Case 2
802 -- Case 1: No views above
803 -- MV and ZMV: periodicity_id, zkeys, nonzkeys, type
804 -- Case 2: Views above, zmv exists
805 -- MV: periodicity_id, zkeys, nonzkeys, type
806
807 l_stmt := 'create index '||l_owner||'.'||p_mv_name||'N'||l_index_counter||' on '||l_owner||'.'||p_mv_name||'(PERIODICITY_ID,';
808 if (l_higher_level_view_exists=false OR
809 (l_higher_level_view_exists=true AND l_is_zmv=false AND l_zmv_exists_for_mv=true)-- CASE2 for MV
810 ) then
811 if (g_debug) then
812 write_to_log_file('Case1 and Case 2a');
813 end if;
814 if l_number_fk>0 then
815 if (l_zero_code_cols.count>0) then
816 for i in l_zero_code_cols.first..l_zero_code_cols.last loop
817 l_stmt := l_stmt ||l_zero_code_cols(i)||',';
818 end loop;
819 end if;
820 if (l_nonzero_code_cols.count>0) then
821 for i in l_nonzero_code_cols.first..l_nonzero_code_cols.last loop
822 l_stmt := l_stmt ||l_nonzero_code_cols(i)||',';
823 end loop;
824 end if;
825 -- Enh#4239064: create index in parallel
826 l_stmt:=l_stmt||' TYPE) '||p_tablespace||' '||p_storage||l_trans||' parallel';
827 if index_already_exists(p_mv_name||'N'||l_index_counter, p_mv_name, p_mv_owner)=false then
828 if BSC_IM_UTILS.create_index(l_stmt,null)=false then
829 return false;
830 end if;
831 end if;
832 -- Enh#4239064: set to noparallel
833 execute immediate 'alter index '||l_owner||'.'||p_mv_name||'N'||l_index_counter||' noparallel';
834 end if;
835 return true;
836 end if;
837 -- There are views above, so its either Case 2 for ZMV or Case 3 for MV
838 --First handle Case 2 ZMV
839 --ZMV:
840 -- periodicity_id, zkeys, type
841 -- periodicity_id, nonzkey1
842 -- .
843 -- .
844 -- periodicity_id, nonzkeyn
845 if (l_is_zmv) then
846 if (g_debug) then
847 write_to_log_file('Case 2b');
848 end if;
849
850 if l_number_fk>0 then
851 l_stmt := 'create index '||l_owner||'.'||p_mv_name||'N'||l_index_counter||' on '||l_owner||'.'||p_mv_name||'(PERIODICITY_ID,';
852 if (l_zero_code_cols.count>0) then
853 for i in l_zero_code_cols.first..l_zero_code_cols.last loop
854 l_stmt := l_stmt ||l_zero_code_cols(i)||',';
855 end loop;
856 -- Enh#4239064: create index in parallel
857 l_stmt:=l_stmt||' TYPE) '||p_tablespace||' '||p_storage||l_trans||' parallel';
858 if index_already_exists(p_mv_name||'N'||l_index_counter, p_mv_name, p_mv_owner)=false then
859 if BSC_IM_UTILS.create_index(l_stmt,null)=false then
860 write_to_log_file_n('Exception in create_mv_index, stmt='||l_stmt);
861 return false;
862 end if;
863 end if;
864 -- Enh#4239064: set to noparallel
865 execute immediate 'alter index '||l_owner||'.'||p_mv_name||'N'||l_index_counter||' noparallel';
866 l_index_counter := l_index_counter+1;
867 end if;
868 if (l_nonzero_code_cols.count>0) then
869 for i in l_nonzero_code_cols.first..l_nonzero_code_cols.last loop
870 l_stmt := 'create index '||l_owner||'.'||p_mv_name||'N'||l_index_counter||' on '||l_owner||'.'||p_mv_name||'(PERIODICITY_ID,';
871 -- Enh#4239064: create index in parallel
872 l_stmt := l_stmt ||l_nonzero_code_cols(i)||') '||p_tablespace||' '||p_storage||l_trans||' parallel';
873 if index_already_exists(p_mv_name||'N'||l_index_counter, p_mv_name, p_mv_owner)=false then
874 if BSC_IM_UTILS.create_index(l_stmt,null)=false then
875 write_to_log_file_n('Exception in create_mv_index, stmt='||l_stmt);
876 return false;
877 end if;
878 end if;
879 -- Enh#4239064: set to noparallel
880 execute immediate 'alter index '||l_owner||'.'||p_mv_name||'N'||l_index_counter||' noparallel';
881 l_index_counter := l_index_counter+1;
882 end loop;
883 end if;
884 end if;
885 return true;
886 end if;
887
888 --Case 3: Views above, no zmv
889 ---------------------------
890 -- MV:
891 -- periodicity_id, nonzkey1
892 -- .
893 -- .
894 -- periodicity_id, nonzkeyn
895 if (g_debug) then
896 write_to_log_file('Case3');
897 end if;
898
899 if (l_nonzero_code_cols.count>0) then
900 for i in l_nonzero_code_cols.first..l_nonzero_code_cols.last loop
901 l_stmt := 'create index '||l_owner||'.'||p_mv_name||'N'||l_index_counter||' on '||l_owner||'.'||p_mv_name||'(PERIODICITY_ID,';
902 -- Enh#4239064: create index in parallel
903 l_stmt := l_stmt ||l_nonzero_code_cols(i)||') '||p_tablespace||' '||p_storage||l_trans||' parallel';
904 if index_already_exists(p_mv_name||'N'||l_index_counter, p_mv_name, p_mv_owner)=false then
905 if BSC_IM_UTILS.create_index(l_stmt,null)=false then
906 return false;
907 end if;
908 end if;
909 -- Enh#4239064: set to noparallel
910 execute immediate 'alter index '||l_owner||'.'||p_mv_name||'N'||l_index_counter||' noparallel';
911 l_index_counter := l_index_counter+1;
912 end loop;
913 end if;
914 return true;
915 Exception when others then
916 BSC_IM_UTILS.g_status_message:=sqlerrm;
917 g_status_message:=sqlerrm;
918 write_to_log_file_n('Exception in create_mv_index, stmt='||l_stmt);
919 write_to_log_file_n(sqlerrm);
920 return false;
921 End;
922 -- bug 4180632, PMD does not populate bsc_sys_dim_level_cols with the parent FKs
923 -- add the column only if it is not there in the list of FKs
924 FUNCTION get_parent_fk_columns(
925 p_object IN varchar2,
926 p_already_included IN BSC_IM_UTILS.varchar_tabletype,
927 p_included_count IN NUMBER,
928 p_columns IN OUT nocopy BSC_IM_UTILS.varchar_tabletype,
929 p_num_columns IN OUT nocopy number
930 ) RETURN boolean
931 IS
932 CURSOR cColumns IS
933 select relation_col
934 from bsc_sys_dim_level_rels rels ,bsc_sys_dim_levels_b levels
935 where levels.level_table_name=p_object
936 and rels.dim_level_id=levels.dim_level_id;
937 begin
938 FOR i IN cColumns LOOP
939 IF bsc_im_utils.in_array(p_already_included, p_included_count, i.relation_col)=FALSE AND
940 bsc_im_utils.in_array(p_columns, p_num_columns, i.relation_col)=FALSE THEN
941 p_columns(p_columns.count+1) := i.relation_col;
942 p_num_columns := p_num_columns +1;
943 --write_to_log_file('Adding fk column '||i.relation_col);
944 END IF;
945 END LOOP;
946 RETURN TRUE;
947 Exception when others then
948 BSC_IM_UTILS.g_status_message:=sqlerrm;
949 g_status_message:=sqlerrm;
950 write_to_log_file_n('Exception in get_parent_fk_columns, '||sqlerrm);
951 write_to_log_file_n(sqlerrm);
952 RETURN FALSE;
953 End;
954
955 function create_mv_log_on_table(
956 p_object varchar2,
957 p_apps_origin varchar2,
958 p_options BSC_IM_UTILS.varchar_tabletype,
959 p_number_options number,
960 p_snplog_created out nocopy boolean
961 )return boolean is
962 l_column_name BSC_IM_UTILS.varchar_tabletype;
963 l_column_type BSC_IM_UTILS.varchar_tabletype;
964 l_column_data_type BSC_IM_UTILS.varchar_tabletype;
965 l_column_origin BSC_IM_UTILS.varchar_tabletype;
966 l_aggregation_type BSC_IM_UTILS.varchar_tabletype;
967 l_description BSC_IM_UTILS.varchar_tabletype;
968 l_property BSC_IM_UTILS.varchar_tabletype;
969 l_number_columns number;
970 ------------------------------------------------------------
971 l_fk_name BSC_IM_UTILS.varchar_tabletype;
972 l_fk_type BSC_IM_UTILS.varchar_tabletype;
973 l_uk_name BSC_IM_UTILS.varchar_tabletype;
974 l_uk_parent_name BSC_IM_UTILS.varchar_tabletype;
975 l_fk_property BSC_IM_UTILS.varchar_tabletype;
976 l_number_fk number;
977 ------------------------------------------------------------
978 l_dim number;
979 Begin
980 if g_debug then
981 write_to_log_file_n('In create_mv_log_on_table '||p_object);
982 end if;
983 p_snplog_created:=false;
984 l_number_columns := 0;
985 select count(1) into l_dim from bsc_sys_dim_levels_b where level_table_name=p_object;
986 if(l_dim=0) then -- not dimension
987 if BSC_IM_INT_MD.get_column(
988 p_object,
989 p_apps_origin,
990 l_column_name,
991 l_column_type,
992 l_column_data_type,
993 l_column_origin,
994 l_aggregation_type,
995 l_description,
996 l_property,
997 l_number_columns)=false then
998 return false;
999 end if;
1000 end if;
1001 --get the fks
1002 if BSC_IM_INT_MD.get_fk(
1003 p_object,
1004 p_apps_origin,
1005 l_fk_name,
1006 l_fk_type,
1007 l_uk_name,
1008 l_uk_parent_name,
1009 l_description,
1010 l_fk_property,
1011 l_number_fk)=false then
1012 return false;
1013 end if;
1014 if (l_dim<>0) then -- dimension, get parent fk cols
1015 -- bug 4180632, PMD does not populate bsc_sys_dim_level_cols with the parent FKs
1016 if get_parent_fk_columns(
1017 p_object,
1018 l_fk_name,--we shouldnt add fk cols again
1019 l_number_fk, --# of fk cols
1020 l_column_name,
1021 l_number_columns)=false then
1022 return false;
1023 end if;
1024 end if;
1025 if BSC_IM_UTILS.create_mv_log_on_table(
1026 p_object,
1027 null,
1028 p_options,
1029 p_number_options,
1030 l_fk_name,
1031 l_number_fk,
1032 l_column_name,
1033 l_number_columns,
1034 p_snplog_created
1035 )=false then
1036 return false;
1037 end if;
1038 return true;
1039 Exception when others then
1040 BSC_IM_UTILS.g_status_message:=sqlerrm;
1041 g_status_message:=sqlerrm;
1042 write_to_log_file_n('Exception in create_mv_log_on_table '||sqlerrm);
1043 return false;
1044 End;
1045
1046 function create_mv_synonym(
1047 p_level varchar2,
1048 p_mv_name varchar2,
1049 p_mv_owner varchar2
1050 )return boolean is
1051 Begin
1052 g_stmt:='create synonym '||p_level||' for '||p_mv_owner||'.'||p_mv_name;
1053 write_to_debug_n(g_stmt);
1054 if BSC_IM_UTILS.drop_synonym(p_level)=false then
1055 null;
1056 end if;
1057 execute immediate g_stmt;
1058 write_to_debug('Created synonym');
1059 return true;
1060 Exception when others then
1061 BSC_IM_UTILS.g_status_message:=sqlerrm;
1062 g_status_message:=sqlerrm;
1063 write_to_log_file_n('Exception in create_mv_synonym '||sqlerrm);
1064 return false;
1065 End;
1066
1067 function alter_mv_to_refresh_demand(
1068 p_mv_name varchar2,
1069 p_mv_owner varchar2
1070 )return boolean is
1071 l_owner varchar2(200);
1072 Begin
1073 l_owner:=p_mv_owner;
1074 if l_owner is null then
1075 l_owner:=bsc_im_utils.get_table_owner(p_mv_name);
1076 end if;
1077 g_stmt:='ALTER MATERIALIZED VIEW '||l_owner||'.'||p_mv_name||' REFRESH ON DEMAND';
1078 write_to_debug_n(g_stmt);
1079 execute immediate g_stmt;
1080 write_to_debug('MV altered');
1081 return true;
1082 Exception when others then
1083 BSC_IM_UTILS.g_status_message:=sqlerrm;
1084 g_status_message:=sqlerrm;
1085 write_to_log_file_n('Exception in alter_mv_to_refresh_demand '||sqlerrm);
1086 return false;
1087 End;
1088
1089 function create_mv_kpi(
1090 p_kpi varchar2,
1091 p_apps_origin varchar2,
1092 p_options BSC_IM_UTILS.varchar_tabletype,
1093 p_number_options number
1094 ) return boolean is
1095 -------------------------------------------------------------------------
1096 l_summary_mv BSC_IM_UTILS.varchar_tabletype;
1097 l_object_type BSC_IM_UTILS.varchar_tabletype;
1098 l_description BSC_IM_UTILS.varchar_tabletype;
1099 l_property BSC_IM_UTILS.varchar_tabletype;
1100 l_number_summary_mv number;
1101 -------------------------------------------------------------------------
1102 l_parent_summary_mv BSC_IM_UTILS.varchar_tabletype;
1103 l_child_summary_mv BSC_IM_UTILS.varchar_tabletype;
1104 l_number_pc_mv number;
1105 -------------------------------------------------------------------------
1106 l_ordered_summary_mv BSC_IM_UTILS.varchar_tabletype;
1107 l_ordered_summary_mv_rank BSC_IM_UTILS.number_tabletype;
1108 l_number_ordered_summary_mv number;
1109 -------------------------------------------------------------------------
1110 l_max_rank number;
1111 l_min_rank number;
1112 l_bsc_owner varchar2(200);
1113 -------------------------------------------------------------------------
1114 l_child_mv BSC_IM_UTILS.varchar_tabletype;
1115 l_number_child_mv number;
1116 -------------------------------------------------------------------------
1117 --users may say they only want three levels of mv.
1118 l_max_mv_levels number;
1119 l_summary_views varchar2(20);
1120 l_type varchar2(20);
1121 -------------------------------------------------------------------------
1122 l_create_non_unique_index boolean;
1123 -------------------------------------------------------------------------
1124 Begin
1125 if g_debug then
1126 write_to_log_file_n('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++');
1127 write_to_log_file('In create_mv_fact '||p_kpi||' '||get_time);
1128 write_to_log_file('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++');
1129 end if;
1130 g_kpi:=p_kpi;
1131 BSC_IM_UTILS.write_to_log_file_n('++++++++++++++++++++++++++++++++++++++++++++++++++++++');
1132 BSC_IM_UTILS.write_to_log_file_n('Create MV/Views for KPI '||p_kpi);
1133 BSC_IM_UTILS.write_to_log_file_n('++++++++++++++++++++++++++++++++++++++++++++++++++++++');
1134 if g_bsc_owner is null then
1135 g_bsc_owner:=BSC_IM_UTILS.get_bsc_owner;
1136 end if;
1137 l_bsc_owner:=g_bsc_owner;
1138 ------------------------------------------------
1139 --get the ordered list of mv
1140 if get_ordered_mv_list(
1141 p_kpi,
1142 p_apps_origin,
1143 l_parent_summary_mv,
1144 l_child_summary_mv,
1145 l_number_pc_mv,
1146 l_ordered_summary_mv,
1147 l_ordered_summary_mv_rank,
1148 l_number_ordered_summary_mv,
1149 l_max_rank
1150 )=false then
1151 return false;
1152 end if;
1153 ------------------------------------------------
1154 --call the create MV. should be called according to the rank
1155 l_max_mv_levels:=BSC_IM_UTILS.get_option_value(p_options,p_number_options,'MV LEVELS');
1156 l_summary_views:=BSC_IM_UTILS.get_option_value(p_options,p_number_options,'SUMMARY VIEWS');
1157 if g_debug then
1158 write_to_log_file_n('Max levels of MV='||l_max_mv_levels);
1159 write_to_log_file('Summary Views='||l_summary_views);
1160 end if;
1161 l_min_rank:=1000;
1162 --rkumar: bug5335536 calculate min_rank
1163 for i in 1..l_number_ordered_summary_mv loop
1164 if l_ordered_summary_mv_rank(i) < l_min_rank then
1165 l_min_rank:=l_ordered_summary_mv_rank(i);
1166 end if;
1167 end loop;
1168 write_to_log_file('MinRank is: '||l_min_rank);
1169 --3534805
1170 /*
1171 if the first level is not a BSC_S_ mv but instead say BSC_SB_ mv, then
1172 we set the rank for the SB mv as -1 this is because, if we have something like
1173 B1 -> SB -> S_0_0_MV -> S_0_1_MV
1174 B2 -------> S_0_0_MV -> S_0_1_MV
1175 and levels=2, we want S_0_0_MV and S_0_1_MV to be mv. earlier, S_0_1_MV became a
1176 view as it was viewed as third level
1177 */
1178 --rank starts from 0. so we need l_max_mv_levels-1
1179 /*
1180 go through the list of MV, if there are SB with rank 0, look at the corresponding S MV.
1181 if the S MV does not have rank 0, reduce the rank of the SB MV
1182 */
1183 --rkumar:5335536 Commeting out the logic for rank modification. No longer required after the bugfix.
1184 /* declare
1185 l_name varchar2(100);
1186 l_pattern varchar2(100);
1187 l_pattern_len number;
1188 l_sb_pattern varchar2(100);
1189 l_sb_pattern_len number;
1190 l_rank number;
1191 begin
1192 for i in 1..l_number_ordered_summary_mv loop
1193 if substr(l_ordered_summary_mv(i),1,7)='BSC_SB_' and l_ordered_summary_mv_rank(i)=0 then
1194 l_pattern:=substr(l_ordered_summary_mv(i),1,instr(l_ordered_summary_mv(i),'_',1,4));
1195 l_sb_pattern:=l_pattern;
1196 l_sb_pattern_len:=length(l_sb_pattern);
1197 l_pattern:=replace(l_pattern,'BSC_SB_','BSC_S_');
1198 l_pattern_len:=length(l_pattern);
1199 l_name:=replace(l_ordered_summary_mv(i),'BSC_SB_','BSC_S_');
1200 for j in 1..l_number_ordered_summary_mv loop
1201 if l_ordered_summary_mv(j)=l_name then
1202 if l_ordered_summary_mv_rank(j)<>0 then
1203 l_rank:=l_ordered_summary_mv_rank(j);
1204 --first reduce the rank of the S
1205 for k in 1..l_number_ordered_summary_mv loop
1206 --write_to_log_file(substr(l_ordered_summary_mv(k),1,l_pattern_len)||' '||l_pattern);
1207 if substr(l_ordered_summary_mv(k),1,l_pattern_len)=l_pattern then
1208 l_ordered_summary_mv_rank(k):=l_ordered_summary_mv_rank(k)-l_rank;
1209 if l_min_rank>l_ordered_summary_mv_rank(k) then
1210 l_min_rank:=l_ordered_summary_mv_rank(k);
1211 end if;
1212 end if;
1213 --for SB also
1214 if substr(l_ordered_summary_mv(k),1,l_sb_pattern_len)=l_sb_pattern then
1215 l_ordered_summary_mv_rank(k):=l_ordered_summary_mv_rank(k)-l_rank;
1216 if l_min_rank>l_ordered_summary_mv_rank(k) then
1217 l_min_rank:=l_ordered_summary_mv_rank(k);
1218 end if;
1219 end if;
1220 end loop;
1221 end if;
1222 exit;
1223 end if;
1224 end loop;
1225 end if;
1226 end loop;
1227 if g_debug then
1228 write_to_log_file_n('After rank modifications');
1229 for i in 1..l_number_ordered_summary_mv loop
1230 write_to_log_file(l_ordered_summary_mv(i)||' '||l_ordered_summary_mv_rank(i));
1231 end loop;
1232 write_to_log_file_n('Min Rank='||l_min_rank);
1233 end if;
1234 end;
1235 */
1236 --------------------------
1237 if l_max_rank>l_max_mv_levels-1 then
1238 g_all_levels_mv:=false;
1239 if g_debug then
1240 write_to_log_file_n('NOT ALL Levels MV');
1241 end if;
1242 else
1243 g_all_levels_mv:=true;
1244 if g_debug then
1245 write_to_log_file_n('ALL Levels MV');
1246 end if;
1247 end if;
1248 for i in l_min_rank..l_max_rank loop
1249 --l_mv_level_count:=l_mv_level_count+1;
1250 l_type:='MV';
1251 if i>l_max_mv_levels-1 then
1252 if l_summary_views='Y' then
1253 l_type:='VIEW';
1254 else
1255 exit;
1256 end if;
1257 end if;
1258 for j in 1..l_number_ordered_summary_mv loop
1259 if l_ordered_summary_mv_rank(j)=i then
1260 l_number_child_mv:=0;
1261 for k in 1..l_number_pc_mv loop
1262 if l_parent_summary_mv(k)=l_ordered_summary_mv(j) then
1263 l_number_child_mv:=l_number_child_mv+1;
1264 l_child_mv(l_number_child_mv):=l_child_summary_mv(k);
1265 end if;
1266 end loop;
1267 if g_all_levels_mv=false and l_ordered_summary_mv_rank(j)=l_max_mv_levels-1 then
1268 --this is the highest level of the mv. beyond this, they are all views.
1269 l_create_non_unique_index:=true;
1270 else
1271 l_create_non_unique_index:=false;
1272 end if;
1273 if create_mv_normal(
1274 p_kpi,
1275 l_ordered_summary_mv(j),
1276 l_bsc_owner,
1277 l_child_mv,
1278 l_number_child_mv,
1279 p_options,
1280 p_number_options,
1281 p_apps_origin,
1282 l_type,
1283 l_create_non_unique_index
1284 )=false then
1285 return false;
1286 end if;
1287 end if;
1288 end loop;
1289 end loop;
1290
1291 ---------------------------------------------
1292 if create_zero_code_mv_kpi(
1293 p_kpi,
1294 p_apps_origin,
1295 p_options,
1296 p_number_options,
1297 l_max_rank,
1298 l_bsc_owner,
1299 l_max_mv_levels,
1300 l_ordered_summary_mv,
1301 l_ordered_summary_mv_rank,
1302 l_number_ordered_summary_mv
1303 )=false then
1304 return false;
1305 end if;
1306 ---------------------------------------------
1307 return true;
1308 Exception when others then
1309 BSC_IM_UTILS.g_status_message:=sqlerrm;
1310 g_status_message:=sqlerrm;
1311 write_to_log_file_n('Exception in create_mv_fact '||sqlerrm);
1312 return false;
1313 End;
1314
1315
1316 function create_zero_code_mv_kpi(
1317 p_kpi varchar2,
1318 p_apps_origin varchar2,
1319 p_options BSC_IM_UTILS.varchar_tabletype,
1320 p_number_options number,
1321 p_max_rank number,
1322 p_bsc_owner varchar2,
1323 p_max_mv_levels number,
1324 p_ordered_summary_mv BSC_IM_UTILS.varchar_tabletype,
1325 p_ordered_summary_mv_rank BSC_IM_UTILS.number_tabletype,
1326 p_number_ordered_summary_mv number
1327 ) return boolean is
1328 -------------------------------------------------------------------------
1329 l_object_type BSC_IM_UTILS.varchar_tabletype;
1330 l_description BSC_IM_UTILS.varchar_tabletype;
1331 -------------------------------------------------------------------------
1332 l_child_mv BSC_IM_UTILS.varchar_tabletype;
1333 l_number_child_mv number;
1334 -------------------------------------------------------------------------
1335 --users may say they only want three levels of mv.
1336 l_mv_level_count number;
1337 l_type varchar2(20);
1338 -------------------------------------------------------------------------
1339 l_zero_code_mv BSC_IM_UTILS.varchar_tabletype;
1340 l_number_zero_code_mv number;
1341 -------------------------------------------------------------------------
1342 --to grab the dependency info
1343 l_dep_summary_mv BSC_IM_UTILS.varchar_tabletype;
1344 l_dep_zero_code_mv BSC_IM_UTILS.varchar_tabletype;
1345 l_number_dep_mv number;
1346 -------------------------------------------------------------------------
1347 l_index number;
1348 l_status varchar2(200);
1349 -------------------------------------------------------------------------
1350 l_max_rank number;
1351 l_min_rank number;
1352 l_create_non_unique_index boolean;
1353 Begin
1354 --zero code MV
1355 if g_debug then
1356 write_to_log_file_n('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++');
1357 write_to_log_file('In create_zero_code_mv_kpi '||p_kpi||' '||get_time);
1358 write_to_log_file('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++');
1359 end if;
1360 g_kpi:=p_kpi;
1361 if BSC_IM_INT_MD.get_object(
1362 p_kpi,
1363 p_apps_origin,
1364 'ZERO CODE MV',
1365 l_zero_code_mv,
1366 l_object_type,
1367 l_description,
1368 l_number_zero_code_mv)=false then
1369 return false;
1370 end if;
1371 if l_number_zero_code_mv>0 then
1372 l_number_dep_mv:=0;
1373 declare
1374 --to grab the dependency info
1375 ll_dep_object_name BSC_IM_UTILS.varchar_tabletype;
1376 ll_dep_object_type BSC_IM_UTILS.varchar_tabletype;
1377 ll_dep_object_desc BSC_IM_UTILS.varchar_tabletype;
1378 ll_number_dep_objects number;
1379 begin
1380 for i in 1..l_number_zero_code_mv loop
1381 if BSC_IM_INT_MD.get_object(
1382 l_zero_code_mv(i),
1383 p_apps_origin,
1384 'MV DEPENDENCY',
1385 ll_dep_object_name,
1386 ll_dep_object_type,
1387 ll_dep_object_desc,
1388 ll_number_dep_objects)=false then
1389 return false;
1390 end if;
1391 for j in 1..ll_number_dep_objects loop
1392 if BSC_IM_UTILS.in_array(l_dep_zero_code_mv,l_dep_summary_mv,l_number_dep_mv,
1393 l_zero_code_mv(i),ll_dep_object_name(j))=false then
1394 l_number_dep_mv:=l_number_dep_mv+1;
1395 l_dep_zero_code_mv(l_number_dep_mv):=l_zero_code_mv(i);
1396 l_dep_summary_mv(l_number_dep_mv):=ll_dep_object_name(j);
1397 end if;
1398 end loop;
1399 end loop;
1400 end;
1401 if g_debug then
1402 write_to_log_file_n('The zero code MV and the corresponding summary MV');
1403 for i in 1..l_number_dep_mv loop
1404 write_to_log_file(l_dep_zero_code_mv(i)||' '||l_dep_summary_mv(i));
1405 end loop;
1406 end if;
1407 -- bug 3867313
1408 l_min_rank:=1000000;
1409 for i in 1..p_number_ordered_summary_mv loop
1410 if substr(p_ordered_summary_mv(i),1,6)='BSC_S_' and
1411 p_ordered_summary_mv_rank(i)<l_min_rank then
1412 l_min_rank:=p_ordered_summary_mv_rank(i);
1413 end if;
1414 end loop;
1415 l_mv_level_count:=0;
1416 l_max_rank:=l_min_rank+p_max_rank;
1417 for i in 1..p_number_ordered_summary_mv loop
1418 write_to_log_file(p_ordered_summary_mv(i)||' '||p_ordered_summary_mv_rank(i));
1419 end loop;
1420 -- bug 3867313
1421 for i in l_min_rank..l_max_rank loop
1422 l_mv_level_count:=l_mv_level_count+1;
1423 /*
1424 3534805
1425 for zero code, using l_mv_level_count is fine.
1426 */
1427 l_type:='MV';
1428 for j in 1..p_number_ordered_summary_mv loop
1429 if p_ordered_summary_mv_rank(j)=i then
1430 --p_ordered_summary_mv_rank(j) is the child mv. for this mv, get the zero code mv by looking at the
1431 --mv dependency
1432 l_number_child_mv:=1;
1433 l_child_mv(l_number_child_mv):=p_ordered_summary_mv(j);
1434 --get the zero code mv
1435 l_index:=BSC_IM_UTILS.get_index(l_dep_summary_mv,l_number_dep_mv,p_ordered_summary_mv(j));
1436 if l_index>0 then
1437 --for zero code mv, we never need to create non unique indexes since there are no views
1438 --on the zero code mv
1439 if p_max_mv_levels is not null and l_mv_level_count>p_max_mv_levels then
1440 l_type:='VIEW';
1441 if g_debug then
1442 write_to_log_file_n('Max levels of MV reached.p_max_mv_levels='||p_max_mv_levels||
1443 ', l_mv_level_count='||l_mv_level_count);
1444 end if;
1445 --l_status:=check_old_mv_view(l_dep_zero_code_mv(l_index),p_bsc_owner,l_type,p_options,p_number_options);
1446 l_status:=check_old_mv_view(l_dep_zero_code_mv(l_index),null,l_type,p_options,p_number_options);
1447 --check_old_mv_view will drop the MV/View if it already exists and the option in RESET MV LEVELS
1448 else
1449 if g_all_levels_mv=false and p_max_mv_levels-1=p_ordered_summary_mv_rank(j) then
1450 --this is the highest level of the mv. beyond this, they are all views.
1451 l_create_non_unique_index:=true;
1452 write_to_log_file('p_max_mv_levels='||p_max_mv_levels||' p_ordered_summary_mv_rank='||p_ordered_summary_mv_rank(j));
1453 if l_create_non_unique_index and g_debug then
1454 write_to_log_file('p_create_non_unique_index=true');
1455 end if;
1456 else
1457 l_create_non_unique_index:=false;
1458 end if;
1459 l_type:='MV';
1460 if create_mv_normal(
1461 p_kpi,
1462 l_dep_zero_code_mv(l_index),
1463 p_bsc_owner,
1464 l_child_mv,
1465 l_number_child_mv,
1466 p_options,
1467 p_number_options,
1468 p_apps_origin,
1469 l_type,
1470 l_create_non_unique_index
1471 )=false then
1472 return false;
1473 end if;
1474 end if;
1475 else
1476 if g_debug then
1477 write_to_log_file_n('Could not find p_ordered_summary_mv(j) in list of dep between zero code mv'||
1478 ' and summary mv. Could not create zero code mv');
1479 end if;
1480 end if;
1481 --------------------------
1482 end if;
1483 end loop;
1484 end loop;
1485 else
1486 if g_debug then
1487 write_to_log_file_n('No zero code MV to create');
1488 end if;
1489 end if;--if l_number_zero_code_mv>0 then
1490 ------------------------------------------
1491 return true;
1492 Exception when others then
1493 BSC_IM_UTILS.g_status_message:=sqlerrm;
1494 g_status_message:=sqlerrm;
1495 write_to_log_file_n('Exception in create_zero_code_mv_kpi '||sqlerrm);
1496 return false;
1497 End;
1498
1499 function get_ordered_mv_list(
1500 p_kpi varchar2,
1501 p_apps_origin varchar2,
1502 p_parent_summary_mv out nocopy BSC_IM_UTILS.varchar_tabletype,
1503 p_child_summary_mv out nocopy BSC_IM_UTILS.varchar_tabletype,
1504 p_number_pc_mv out nocopy number,
1505 p_ordered_summary_mv out nocopy BSC_IM_UTILS.varchar_tabletype,
1506 p_ordered_summary_mv_rank out nocopy BSC_IM_UTILS.number_tabletype,
1507 p_number_ordered_summary_mv out nocopy number,
1508 p_max_rank out nocopy number
1509 )return boolean is
1510 -------------------------------------------------------------------------
1511 l_summary_mv BSC_IM_UTILS.varchar_tabletype;
1512 l_object_type BSC_IM_UTILS.varchar_tabletype;
1513 l_description BSC_IM_UTILS.varchar_tabletype;
1514 l_property BSC_IM_UTILS.varchar_tabletype;
1515 l_number_summary_mv number;
1516 -------------------------------------------------------------------------
1517 Begin
1518 if g_debug then
1519 write_to_log_file_n('In get_ordered_mv_list '||p_kpi||' '||p_apps_origin);
1520 end if;
1521 g_kpi:=p_kpi;
1522 if BSC_IM_INT_MD.get_object(
1523 p_kpi,
1524 p_apps_origin,
1525 'SUMMARY MV',
1526 l_summary_mv,
1527 l_object_type,
1528 l_description,
1529 l_number_summary_mv)=false then
1530 return false;
1531 end if;
1532 if g_debug then
1533 write_to_log_file_n('The summary MV for this KPI');
1534 for i in 1..l_number_summary_mv loop
1535 write_to_log_file(l_summary_mv(i)||' '||l_object_type(i));
1536 end loop;
1537 end if;
1538 ------------------------------------------------
1539 --get the relationship between these objects
1540 declare
1541 ll_object_name BSC_IM_UTILS.varchar_tabletype;
1542 ll_object_type BSC_IM_UTILS.varchar_tabletype;
1543 ll_description BSC_IM_UTILS.varchar_tabletype;
1544 ll_property BSC_IM_UTILS.varchar_tabletype;
1545 ll_number_object number;
1546 begin
1547 p_number_pc_mv:=0;
1548 for i in 1..l_number_summary_mv loop
1549 ll_number_object:=0;
1550 if BSC_IM_INT_MD.get_object(
1551 l_summary_mv(i),
1552 p_apps_origin,
1553 'MV DEPENDENCY',
1554 ll_object_name,
1555 ll_object_type,
1556 ll_description,
1557 ll_number_object)=false then
1558 return false;
1559 end if;
1560 for j in 1..ll_number_object loop
1561 p_number_pc_mv:=p_number_pc_mv+1;
1562 p_parent_summary_mv(p_number_pc_mv):=l_summary_mv(i);
1563 p_child_summary_mv(p_number_pc_mv):=ll_object_name(j);
1564 end loop;
1565 end loop;
1566 if g_debug then
1567 write_to_log_file_n('The parent child relations: parent child');
1568 for i in 1..p_number_pc_mv loop
1569 write_to_log_file(p_parent_summary_mv(i)||' '||p_child_summary_mv(i));
1570 end loop;
1571 end if;
1572 if BSC_IM_UTILS.get_rank(
1573 p_parent_summary_mv,
1574 p_child_summary_mv,
1575 p_number_pc_mv,
1576 p_ordered_summary_mv,
1577 p_ordered_summary_mv_rank,
1578 p_number_ordered_summary_mv,
1579 p_max_rank)=false then
1580 return false;
1581 end if;
1582 for i in 1..l_number_summary_mv loop
1583 if BSC_IM_UTILS.in_array(p_ordered_summary_mv,p_number_ordered_summary_mv,l_summary_mv(i))=false then
1584 p_number_ordered_summary_mv:=p_number_ordered_summary_mv+1;
1585 p_ordered_summary_mv(p_number_ordered_summary_mv):=l_summary_mv(i);
1586 p_ordered_summary_mv_rank(p_number_ordered_summary_mv):=0;
1587 end if;
1588 end loop;
1589 if g_debug then
1590 write_to_log_file_n('The ordered summary MV list');
1591 for i in 1..p_number_ordered_summary_mv loop
1592 write_to_log_file(p_ordered_summary_mv(i)||' '||p_ordered_summary_mv_rank(i));
1593 end loop;
1594 end if;
1595 end;
1596 return true;
1597 Exception when others then
1598 BSC_IM_UTILS.g_status_message:=sqlerrm;
1599 g_status_message:=sqlerrm;
1600 write_to_log_file_n('Exception in get_ordered_mv_list '||sqlerrm);
1601 return false;
1602 End;
1603
1604 function init_all return boolean is
1605 Begin
1606 g_status:=true;
1607 return true;
1608 Exception when others then
1609 BSC_IM_UTILS.g_status_message:=sqlerrm;
1610 g_status_message:=sqlerrm;
1611 write_to_log_file_n('Exception in init_all '||sqlerrm);
1612 return false;
1613 End;
1614
1615 procedure write_to_log_file(p_message varchar2) is
1616 Begin
1617 BSC_IM_UTILS.write_to_log_file(p_message);
1618 Exception when others then
1619 BSC_IM_UTILS.g_status_message:=sqlerrm;
1620 null;
1621 End;
1622
1623 procedure write_to_log_file_n(p_message varchar2) is
1624 begin
1625 write_to_log_file(' ');
1626 write_to_log_file(p_message);
1627 Exception when others then
1628 BSC_IM_UTILS.g_status_message:=sqlerrm;
1629 null;
1630 end;
1631
1632 procedure write_to_debug_n(p_message varchar2) is
1633 begin
1634 if g_debug then
1635 write_to_log_file_n(p_message);
1636 end if;
1637 Exception when others then
1638 BSC_IM_UTILS.g_status_message:=sqlerrm;
1639 null;
1640 end;
1641
1642 procedure write_to_debug(p_message varchar2) is
1643 begin
1644 if g_debug then
1645 write_to_log_file(p_message);
1646 end if;
1647 Exception when others then
1648 BSC_IM_UTILS.g_status_message:=sqlerrm;
1649 null;
1650 end;
1651
1652 function get_time return varchar2 is
1653 begin
1654 return BSC_IM_UTILS.get_time;
1655 Exception when others then
1656 BSC_IM_UTILS.g_status_message:=sqlerrm;
1657 null;
1658 End;
1659
1660 procedure set_globals(
1661 p_debug boolean) is
1662 Begin
1663 g_debug:=p_debug;
1664 BSC_IM_UTILS.set_globals(g_debug);
1665 BSC_IM_INT_MD.set_globals(g_debug);
1666 Exception when others then
1667 BSC_IM_UTILS.g_status_message:=sqlerrm;
1668 null;
1669 End;
1670
1671 --------------------------------------------------------------------------
1672 function refresh_mv_kpi(
1673 p_kpi varchar2,
1674 p_apps_origin varchar2,
1675 p_options BSC_IM_UTILS.varchar_tabletype,
1676 p_number_options number
1677 ) return boolean is
1678 -------------------------------------------------------------------------
1679 l_parent_summary_mv BSC_IM_UTILS.varchar_tabletype;
1680 l_child_summary_mv BSC_IM_UTILS.varchar_tabletype;
1681 l_number_pc_mv number;
1682 -------------------------------------------------------------------------
1683 l_ordered_summary_mv BSC_IM_UTILS.varchar_tabletype;
1684 l_ordered_summary_mv_rank BSC_IM_UTILS.number_tabletype;
1685 l_number_ordered_summary_mv number;
1686 -------------------------------------------------------------------------
1687 l_max_rank number;
1688 l_bsc_owner varchar2(200);
1689 -------------------------------------------------------------------------
1690 l_dummy_mv BSC_IM_UTILS.varchar_tabletype;
1691 l_number_dummy_mv number;
1692 -------------------------------------------------------------------------
1693 l_zero_code_mv BSC_IM_UTILS.varchar_tabletype;
1694 l_object_type BSC_IM_UTILS.varchar_tabletype;
1695 l_description BSC_IM_UTILS.varchar_tabletype;
1696 l_number_zero_code_mv number;
1697 -------------------------------------------------------------------------
1698 l_start_time varchar2(200);
1699 l_end_time varchar2(200);
1700 -------------------------------------------------------------------------
1701 Begin
1702 if g_debug then
1703 write_to_log_file_n('In refresh_mv_kpi for kpi '||p_kpi||get_time);
1704 end if;
1705 g_kpi:=p_kpi;
1706 if g_bsc_owner is null then
1707 g_bsc_owner:=BSC_IM_UTILS.get_bsc_owner;
1708 end if;
1709 l_bsc_owner:=g_bsc_owner;
1710 ------------------------------------------------------------
1711 --find all the ordered list of MV to refresh
1712 ------------------------------------------------
1713 --get the ordered list of mv
1714 if get_ordered_mv_list(
1715 p_kpi,
1716 p_apps_origin,
1717 l_parent_summary_mv,
1718 l_child_summary_mv,
1719 l_number_pc_mv,
1720 l_ordered_summary_mv,
1721 l_ordered_summary_mv_rank,
1722 l_number_ordered_summary_mv,
1723 l_max_rank
1724 )=false then
1725 return false;
1726 end if;
1727 ------------------------------------------------
1728 for i in 0..l_max_rank loop
1729 for j in 1..l_number_ordered_summary_mv loop
1730 if l_ordered_summary_mv_rank(j)=i then
1731 if BSC_IM_UTILS.is_mview(l_ordered_summary_mv(j),null) then
1732 l_start_time:=BSC_IM_UTILS.get_time;
1733 if BSC_IM_UTILS.refresh_mv(l_ordered_summary_mv(j),null,p_kpi,p_options,p_number_options)=false then
1734 g_status_message:=BSC_IM_UTILS.g_status_message;
1735 return false;
1736 end if;
1737 if g_debug then
1738 write_to_log_file_n('MV Refresh Complete '||get_time);
1739 end if;
1740 if object_index_validation(l_ordered_summary_mv(j),null,p_kpi,p_apps_origin,
1741 p_options,p_number_options,null)=false then
1742 return false;
1743 end if;
1744 ----------------
1745 else
1746 if g_debug then
1747 write_to_log_file_n('Object '||l_ordered_summary_mv(j)||' not a MV');
1748 end if;
1749 end if;
1750 --------------------------------------------
1751 end if;
1752 end loop;
1753 end loop;
1754 --------------------------------------------
1755 --the zero code mv
1756 if BSC_IM_INT_MD.get_object(
1757 p_kpi,
1758 p_apps_origin,
1759 'ZERO CODE MV',
1760 l_zero_code_mv,
1761 l_object_type,
1762 l_description,
1763 l_number_zero_code_mv)=false then
1764 return false;
1765 end if;
1766 if l_number_zero_code_mv>0 then
1767 for i in 1..l_number_zero_code_mv loop
1768 if BSC_IM_UTILS.is_mview(l_zero_code_mv(i),null) then
1769 l_start_time:=BSC_IM_UTILS.get_time;
1770 if BSC_IM_UTILS.refresh_mv(l_zero_code_mv(i),null,p_kpi,p_options,p_number_options)=false then
1771 g_status_message:=BSC_IM_UTILS.g_status_message;
1772 return false;
1773 end if;
1774 if g_debug then
1775 write_to_log_file_n('MV Refresh Complete '||get_time);
1776 end if;
1777 if object_index_validation(l_zero_code_mv(i),null,p_kpi,p_apps_origin,
1778 p_options,p_number_options,null)=false then
1779 return false;
1780 end if;
1781 else
1782 if g_debug then
1783 write_to_log_file_n('Object '||l_zero_code_mv(i)||' not a MV');
1784 end if;
1785 end if;
1786 end loop;
1787 end if;
1788 --------------------------------------------
1789 return true;
1790 Exception when others then
1791 BSC_IM_UTILS.g_status_message:=sqlerrm;
1792 g_status_message:=sqlerrm;
1793 write_to_log_file_n('Exception in refresh_mv_kpi '||sqlerrm||get_time);
1794 return false;
1795 End;
1796
1797 --if user needs to refresh just an MV
1798 function refresh_mv(
1799 p_mv varchar2,
1800 p_kpi varchar2,
1801 p_options BSC_IM_UTILS.varchar_tabletype,
1802 p_number_options number
1803 ) return boolean is
1804 l_bsc_owner varchar2(200);
1805 -------------------------------------------------------------------------
1806 Begin
1807 g_kpi:=p_kpi;
1808 if BSC_IM_UTILS.get_option_value(p_options,p_number_options,'DEBUG LOG')='Y' then
1809 g_debug:=true;
1810 end if;
1811 if BSC_IM_UTILS.get_option_value(p_options,p_number_options,'TRACE')='Y' then
1812 BSC_IM_UTILS.set_trace;
1813 end if;
1814 if g_debug then
1815 write_to_log_file_n('In refresh_mv '||p_mv||get_time);
1816 end if;
1817 if g_bsc_owner is null then
1818 g_bsc_owner:=BSC_IM_UTILS.get_bsc_owner;
1819 end if;
1820 l_bsc_owner:=g_bsc_owner;
1821 --first see if this is an MV. if not, no need to process
1822 if BSC_IM_UTILS.is_mview(p_mv,null)=false then
1823 if g_debug then
1824 write_to_log_file_n('Not an MV. Cannot do MV refresh');
1825 end if;
1826 return true;
1827 end if;
1828 /*
1829 we need to get the index info of the mv from the database. if there is a full refresh
1830 then we need to
1831 1. grab the index info into memory (BSC_im_utils.refresh_mv)
1832 2. drop the indexes (BSC_im_utils.refresh_mv)
1833 3. mv full refresh (BSC_im_utils.refresh_mv)
1834 4. re-create the indexes back (BSC_im_utils.refresh_mv)
1835 5. validate the indexes.(BSC_IM_UTILS.object_index_validation)
1836 6. if there are missing indexes, create them with default storage
1837 and tablespace(BSC_IM_UTILS.object_index_validation)
1838 */
1839 if BSC_IM_UTILS.refresh_mv(p_mv,null,p_kpi,p_options,p_number_options)=false then
1840 g_status_message:=BSC_IM_UTILS.g_status_message;
1841 return false;
1842 end if;
1843 if g_debug then
1844 write_to_log_file_n('MV Refresh Complete '||get_time);
1845 end if;
1846 --now do the index validation. for the mv make sure that all indexes are in place
1847 if object_index_validation(p_mv,null,p_kpi,'BSC',p_options,p_number_options,null)=false then
1848 return false;
1849 end if;
1850 return true;
1851 Exception when others then
1852 BSC_IM_UTILS.g_status_message:=sqlerrm;
1853 g_status_message:=sqlerrm;
1854 write_to_log_file_n('Exception in refresh_mv '||sqlerrm||get_time);
1855 return false;
1856 End;
1857 ------------------------------------------------------------------------
1858
1859 function get_dummy_mv(
1860 p_mv_name varchar2,
1861 p_mv_owner varchar2,
1862 p_dummy_mv out nocopy BSC_IM_UTILS.varchar_tabletype,
1863 p_number_dummy_mv out nocopy number
1864 )return boolean is
1865 l_mv_name varchar2(200);
1866 i integer;
1867 Begin
1868 if g_debug then
1869 write_to_log_file_n('In get_dummy_mv');
1870 end if;
1871 p_number_dummy_mv:=0;
1872 i:=1;
1873 loop
1874 l_mv_name:=substr(substr(p_mv_name,1,length(p_mv_name)-3),1,24)||'_D'||i||'MV';
1875 if BSC_IM_UTILS.check_mv(l_mv_name,null)=false then
1876 exit;
1877 else
1878 p_number_dummy_mv:=p_number_dummy_mv+1;
1879 p_dummy_mv(p_number_dummy_mv):=l_mv_name;
1880 i:=i+1;
1881 end if;
1882 end loop;
1883 if g_debug then
1884 write_to_log_file_n('Dummy MVs');
1885 for i in 1..p_number_dummy_mv loop
1886 write_to_log_file(p_dummy_mv(i));
1887 end loop;
1888 end if;
1889 return true;
1890 Exception when others then
1891 BSC_IM_UTILS.g_status_message:=sqlerrm;
1892 g_status_message:=sqlerrm;
1893 write_to_log_file_n('Exception in get_dummy_mv '||sqlerrm||get_time);
1894 return false;
1895 End;
1896
1897 ---------------------------------------------------------------
1898 function drop_mv_kpi(
1899 p_kpi varchar2,
1900 p_apps_origin varchar2,
1901 p_options BSC_IM_UTILS.varchar_tabletype,
1902 p_number_options number
1903 ) return boolean is
1904 -------------------------------------------------------------------------
1905 l_parent_summary_mv BSC_IM_UTILS.varchar_tabletype;
1906 l_child_summary_mv BSC_IM_UTILS.varchar_tabletype;
1907 l_number_pc_mv number;
1908 -------------------------------------------------------------------------
1909 l_ordered_summary_mv BSC_IM_UTILS.varchar_tabletype;
1910 l_ordered_summary_mv_rank BSC_IM_UTILS.number_tabletype;
1911 l_number_ordered_summary_mv number;
1912 -------------------------------------------------------------------------
1913 l_max_rank number;
1914 l_bsc_owner varchar2(200);
1915 -------------------------------------------------------------------------
1916 l_zero_code_mv BSC_IM_UTILS.varchar_tabletype;
1917 l_object_type BSC_IM_UTILS.varchar_tabletype;
1918 l_description BSC_IM_UTILS.varchar_tabletype;
1919 l_number_zero_code_mv number;
1920 -------------------------------------------------------------------------
1921 Begin
1922 if g_debug then
1923 write_to_log_file_n('In drop_mv_kpi for kpi '||p_kpi||get_time);
1924 end if;
1925 g_kpi:=p_kpi;
1926 if g_bsc_owner is null then
1927 g_bsc_owner:=BSC_IM_UTILS.get_bsc_owner;
1928 end if;
1929 l_bsc_owner:=g_bsc_owner;
1930 --get the ordered list of mv
1931 if get_ordered_mv_list(
1932 p_kpi,
1933 p_apps_origin,
1934 l_parent_summary_mv,
1935 l_child_summary_mv,
1936 l_number_pc_mv,
1937 l_ordered_summary_mv,
1938 l_ordered_summary_mv_rank,
1939 l_number_ordered_summary_mv,
1940 l_max_rank
1941 )=false then
1942 return false;
1943 end if;
1944 ------------------------------------------------------
1945 --the zero code mv
1946 if BSC_IM_INT_MD.get_object(
1947 p_kpi,
1948 p_apps_origin,
1949 'ZERO CODE MV',
1950 l_zero_code_mv,
1951 l_object_type,
1952 l_description,
1953 l_number_zero_code_mv)=false then
1954 return false;
1955 end if;
1956 if l_number_zero_code_mv>0 then
1957 for i in 1..l_number_zero_code_mv loop
1958 if BSC_IM_UTILS.drop_object(l_zero_code_mv(i),null)=false then
1959 null;
1960 end if;
1961 if BSC_IM_UTILS.drop_synonym(l_zero_code_mv(i))=false then
1962 null;
1963 end if;
1964 end loop;
1965 end if;
1966 ------------------------------------------------------
1967 for i in 0..l_max_rank loop
1968 for j in 1..l_number_ordered_summary_mv loop
1969 if l_ordered_summary_mv_rank(j)=l_max_rank-i then
1970 if g_debug then
1971 write_to_log_file_n('Drop '||l_ordered_summary_mv(j));
1972 end if;
1973 if BSC_IM_UTILS.drop_object(l_ordered_summary_mv(j),null)=false then
1974 null;
1975 end if;
1976 if BSC_IM_UTILS.drop_synonym(l_ordered_summary_mv(j))=false then
1977 null;
1978 end if;
1979 end if;
1980 end loop;
1981 end loop;
1982 --------------------------------------------------
1983 return true;
1984 Exception when others then
1985 BSC_IM_UTILS.g_status_message:=sqlerrm;
1986 g_status_message:=sqlerrm;
1987 write_to_log_file_n('Exception in drop_mv_kpi '||sqlerrm||get_time);
1988 return false;
1989 End;
1990
1991 function drop_mv(
1992 p_mv varchar2,
1993 p_options BSC_IM_UTILS.varchar_tabletype,
1994 p_number_options number
1995 )return boolean is
1996 l_bsc_owner varchar2(200);
1997 Begin
1998 if g_bsc_owner is null then
1999 g_bsc_owner:=BSC_IM_UTILS.get_bsc_owner;
2000 end if;
2001 l_bsc_owner:=g_bsc_owner;
2002 if BSC_IM_UTILS.is_mview(p_mv,null) then
2003 if BSC_IM_UTILS.drop_mv(p_mv,null)=false then
2004 null;
2005 end if;
2006 if BSC_IM_UTILS.drop_synonym(p_mv)=false then
2007 null;
2008 end if;
2009 else
2010 if BSC_IM_UTILS.drop_view(p_mv,null)=false then
2011 null;
2012 end if;
2013 end if;
2014 return true;
2015 Exception when others then
2016 BSC_IM_UTILS.g_status_message:=sqlerrm;
2017 g_status_message:=sqlerrm;
2018 write_to_log_file_n('Exception in drop_mv '||sqlerrm||get_time);
2019 return false;
2020 End;
2021 ---------------------------------------------------------------
2022
2023 function drop_summary_objects(
2024 p_mv_list varchar2,
2025 p_synonym_list varchar2,
2026 p_options varchar2,
2027 p_error_message out nocopy varchar2
2028 ) return boolean is
2029 l_method varchar2(200);
2030 l_mv BSC_IM_UTILS.varchar_tabletype;
2031 l_mv_owner BSC_IM_UTILS.varchar_tabletype;
2032 l_s_table BSC_IM_UTILS.varchar_tabletype;
2033 l_number_mv number;
2034 l_list varchar2(32000);
2035 l_options BSC_IM_UTILS.varchar_tabletype;
2036 l_number_options number;
2037 Begin
2038 p_error_message:=null;
2039 l_number_options:=0;
2040 if BSC_IM_UTILS.parse_values(p_options,',',l_options,l_number_options)=false then
2041 return false;
2042 end if;
2043 if BSC_IM_UTILS.get_option_value(l_options,l_number_options,'DEBUG LOG')='Y' then
2044 g_debug:=true;
2045 set_globals(g_debug);
2046 end if;
2047 if BSC_IM_UTILS.get_option_value(l_options,l_number_options,'TRACE')='Y' then
2048 BSC_IM_UTILS.set_trace;
2049 end if;
2050 if g_debug then
2051 write_to_log_file_n('In drop_summary_objects '||get_time);
2052 write_to_log_file('p_mv_list='||p_mv_list);
2053 write_to_log_file('p_synonym_list='||p_synonym_list);
2054 write_to_log_file('p_options='||p_options);
2055 end if;
2056 l_number_mv:=0;
2057 if BSC_IM_UTILS.parse_values(p_mv_list,',',l_mv,l_number_mv)=false then
2058 return false;
2059 end if;
2060 if BSC_IM_UTILS.parse_values(p_synonym_list,',',l_s_table,l_number_mv)=false then
2061 return false;
2062 end if;
2063 for i in 1..l_number_mv loop
2064 l_mv_owner(i):=BSC_IM_UTILS.get_table_owner(l_mv(i));
2065 end loop;
2066 if g_debug then
2067 write_to_log_file_n('The MV, S table and the owner');
2068 for i in 1..l_number_mv loop
2069 write_to_log_file(l_mv(i)||' '||l_s_table(i)||' '||l_mv_owner(i));
2070 end loop;
2071 end if;
2072 --drop the table, mv and the synonym
2073 for i in 1..l_number_mv loop
2074 if BSC_IM_UTILS.drop_mv(l_mv(i),l_mv_owner(i))=false then
2075 null;
2076 end if;
2077 if BSC_IM_UTILS.drop_synonym(l_mv(i))=false then
2078 null;
2079 end if;
2080 if BSC_IM_UTILS.drop_table(l_s_table(i),l_mv_owner(i))=false then
2081 null;
2082 end if;
2083 if BSC_IM_UTILS.drop_synonym(l_s_table(i))=false then
2084 null;
2085 end if;
2086 end loop;
2087 return true;
2088 Exception when others then
2089 BSC_IM_UTILS.g_status_message:=sqlerrm;
2090 p_error_message:=sqlerrm;
2091 g_status_message:=sqlerrm;
2092 write_to_log_file_n('Exception in drop_summary_objects '||sqlerrm||get_time);
2093 return false;
2094 End;
2095
2096 /*
2097 check to make sure that all indexes are present in the database.
2098 if any are missing, create them
2099 This API is actually used for error handling. In the initial refresh,
2100 we drop the MV indexes, the MV refresh could have succeeded but the
2101 index creation could have failed. Next time around, we should correct
2102 this problem and create the missing indexes.
2103 */
2104 function object_index_validation(
2105 p_object varchar2,
2106 p_owner varchar2,
2107 p_kpi varchar2,
2108 p_apps_origin varchar2,
2109 p_options BSC_IM_UTILS.varchar_tabletype,
2110 p_number_options number,
2111 p_create_non_unique_index boolean
2112 )return boolean is
2113 l_apps_origin varchar2(200);
2114 l_owner varchar2(200);
2115 ---BSC----------------------
2116 l_s_tables BSC_IM_UTILS.varchar_tabletype;
2117 l_number_s_tables number;
2118 l_fk BSC_IM_UTILS.varchar_tabletype;
2119 l_number_fk number;
2120 -------------------------------------------------------------------------
2121 l_index BSC_IM_UTILS.varchar_tabletype;
2122 l_uniqueness BSC_IM_UTILS.varchar_tabletype;
2123 l_tablespace BSC_IM_UTILS.varchar_tabletype;
2124 l_initial_extent BSC_IM_UTILS.number_tabletype;
2125 l_next_extent BSC_IM_UTILS.number_tabletype;
2126 l_max_extents BSC_IM_UTILS.number_tabletype;
2127 l_pct_increase BSC_IM_UTILS.number_tabletype;
2128 l_number_index number;
2129 ------
2130 l_ind_name BSC_IM_UTILS.varchar_tabletype;
2131 l_ind_col BSC_IM_UTILS.varchar_tabletype;
2132 l_number_ind_col number;
2133 -------------------------------------------------------------------------
2134 l_stmt varchar2(20000);
2135 l_index_tablespace varchar2(200);
2136 l_index_storage varchar2(2000);
2137 -------------------------------------------------------------------------
2138 l_create_non_unique_index boolean;
2139 -------------------------------------------------------------------------
2140
2141 l_zero_code_cols dbms_sql.varchar2_table;
2142 -----
2143 l_higher_level_view_exists boolean ;
2144 l_time_columns VARCHAR2(100):= '(PERIODICITY_ID, YEAR, PERIOD)';
2145 l_index_counter number := 1;
2146 l_nonzero_code_cols dbms_sql.varchar2_table;
2147 l_is_zmv boolean;
2148 l_zmv_exists_for_mv boolean;
2149 l_mv_name_for_zmv varchar2(100);
2150
2151 Begin
2152 return true;
2153 -- this is not required as we are calling create_mv_index already from refresh
2154 if g_debug then
2155 write_to_log_file_n('In object_index_validation for '||p_object||' '||p_owner||' p_apps_origin '||p_apps_origin||
2156 ' p_kpi '||p_kpi);
2157 end if;
2158 g_kpi:=p_kpi;
2159 l_create_non_unique_index:=p_create_non_unique_index ;
2160 l_apps_origin:=p_apps_origin;
2161 l_owner:=p_owner;
2162 if l_owner is null then
2163 l_owner:=bsc_im_utils.get_table_owner(p_object);
2164 if g_debug then
2165 write_to_log_file('l_owner='||l_owner);
2166 end if;
2167 end if;
2168 -----------------
2169 l_index_tablespace:=BSC_IM_UTILS.get_option_value(p_options,p_number_options,'INDEX TABLESPACE');
2170 l_index_storage:=BSC_IM_UTILS.get_option_value(p_options,p_number_options,'INDEX STORAGE');
2171 if l_index_tablespace is not null then
2172 if instr(lower(l_index_tablespace),'tablespace')<=0 then
2173 l_index_tablespace:=' tablespace '||l_index_tablespace;
2174 end if;
2175 end if;
2176 if l_index_storage is not null then
2177 if instr(lower(l_index_storage),'storage')<=0 then
2178 l_index_storage:=' storage '||l_index_storage;
2179 end if;
2180 end if;
2181 -----------------
2182 if l_apps_origin='BSC' then
2183 if BSC_BSC_ADAPTER.get_s_tables_for_mv(p_object,l_s_tables,l_number_s_tables)=false then
2184 return false;
2185 end if;
2186 if l_number_s_tables=0 then
2187 if g_debug then
2188 write_to_log_file_n('No s tables found for '||p_object||'. Do Validations to do...');
2189 end if;
2190 return true;
2191 end if;
2192 if BSC_BSC_ADAPTER.get_table_fks(l_s_tables,l_number_s_tables,l_fk,l_number_fk)=false then
2193 return false;
2194 end if;
2195 --first get the index info from the database
2196 if BSC_IM_UTILS.get_table_indexes(
2197 p_object,
2198 l_owner,
2199 l_index,
2200 l_uniqueness,
2201 l_tablespace,
2202 l_initial_extent,
2203 l_next_extent,
2204 l_max_extents,
2205 l_pct_increase,
2206 l_number_index,
2207 l_ind_name,
2208 l_ind_col,
2209 l_number_ind_col)=false then
2210 return false;
2211 end if;
2212 if create_mv_index(p_object,
2213 p_owner,
2214 p_kpi,
2215 p_apps_origin,
2216 l_index_tablespace,
2217 l_index_storage,
2218 p_create_non_unique_index,
2219 true-- called from refresh
2220 )= false then
2221 return false;
2222 else
2223 return true;
2224 end if;
2225
2226
2227 --quick check
2228 /*if l_number_index>=l_number_fk-3 then
2229 if g_debug then
2230 write_to_log_file_n('All indexes present.');
2231 end if;
2232 else
2233 --need to create missing indexes
2234 if g_debug then
2235 write_to_log_file_n('Going to create missing indexes');
2236 end if;
2237 if l_create_non_unique_index is null then
2238 --if the parent of this mv is a view, then create the non-unique indexes
2239 if BSC_IM_UTILS.is_parent_of_type_present(p_object,'VIEW') then
2240 l_create_non_unique_index:=true;
2241 else
2242 l_create_non_unique_index:=false;
2243 end if;
2244 end if;
2245 if l_create_non_unique_index then
2246 --try the non unique ones
2247 for i in 1..l_number_fk loop
2248 if l_fk(i)<>'PERIOD' and l_fk(i)<>'TYPE' and l_fk(i)<>'PERIODICITY_ID' and
2249 l_fk(i)<>'YEAR' then
2250 l_stmt:='create index '||l_owner||'.'||p_object||'N'||i||' on '||l_owner||'.'||p_object||'(';
2251 l_stmt:=l_stmt||l_fk(i)||',PERIODICITY_ID,YEAR,PERIOD)';
2252 --Enh#4239064: create index in parallel
2253 l_stmt:=l_stmt||l_index_tablespace||' '||l_index_storage||' parallel';
2254 if BSC_IM_UTILS.create_index(l_stmt,null)=false then
2255 return false;
2256 end if;
2257 --Enh#4239064: set to noparallel
2258 execute immediate 'alter index '||l_owner||'.'||p_object||'N'||i||' noparallel';
2259 end if;
2260 end loop;
2261 end if;
2262 end if;
2263 */
2264 end if;--if l_apps_origin='BSC' then
2265
2266 return true;
2267 Exception when others then
2268 g_status_message:=sqlerrm;
2269 write_to_log_file_n('Exception in object_index_validation '||sqlerrm);
2270 return false;
2271 End;
2272
2273 function check_old_mv_view(
2274 p_mv_name varchar2,
2275 p_mv_owner varchar2,
2276 p_type varchar2,
2277 p_options BSC_IM_UTILS.varchar_tabletype,
2278 p_number_options number
2279 )return varchar2 is
2280 l_status varchar2(200);
2281 Begin
2282 l_status:='CONTINUE';
2283 --check to see if MV RECREATE flag is off and MV already exists. then no need to do anything
2284 if BSC_IM_UTILS.get_option_value(p_options,p_number_options,'RECREATE')='Y' then
2285 if g_debug then
2286 write_to_log_file_n('MV RECREATE flag TRUE. Dropping the MV/View first first');
2287 end if;
2288 --p_mv_owner
2289 if drop_mv(p_mv_name,p_options,0)=false then
2290 null;
2291 end if;
2292 elsif BSC_IM_UTILS.get_option_value(p_options,p_number_options,'RESET MV LEVELS')='Y' then
2293 if p_type='MV' then
2294 if BSC_IM_UTILS.check_mv(p_mv_name,null) then
2295 if g_debug then
2296 write_to_log_file_n('MV '||p_mv_name||' already present');
2297 end if;
2298 return 'ALREADY PRESENT';
2299 else
2300 if g_debug then
2301 write_to_log_file_n(p_mv_name||' is a view...dropping');
2302 end if;
2303 if BSC_IM_UTILS.drop_view(p_mv_name,null)=false then
2304 null;
2305 end if;
2306 end if;
2307 elsif p_type='VIEW' then
2308 if BSC_IM_UTILS.check_view(p_mv_name,null) then
2309 if g_debug then
2310 write_to_log_file_n('View '||p_mv_name||' already present');
2311 end if;
2312 return 'ALREADY PRESENT';
2313 else
2314 if g_debug then
2315 write_to_log_file_n(p_mv_name||' is a MV...dropping');
2316 end if;
2317 if drop_mv(p_mv_name,p_options,0)=false then
2318 null;
2319 end if;
2320 end if;
2321 end if;
2322 else
2323 if p_type='MV' then
2324 if BSC_IM_UTILS.check_mv(p_mv_name,null) then
2325 if g_debug then
2326 write_to_log_file_n('MV RECREATE flag FALSE. MV already exists. No need to create the MV');
2327 end if;
2328 return 'ALREADY PRESENT';
2329 end if;
2330 elsif p_type='VIEW' then
2331 if BSC_IM_UTILS.check_view(p_mv_name,null) then
2332 if g_debug then
2333 write_to_log_file_n('MV RECREATE flag FALSE. View already exists. No need to create the View');
2334 end if;
2335 return 'ALREADY PRESENT';
2336 end if;
2337 end if;
2338 end if;
2339 return l_status;
2340 Exception when others then
2341 g_status_message:=sqlerrm;
2342 write_to_log_file_n('Exception in check_old_mv_view '||sqlerrm);
2343 return 'ERROR';
2344 End;
2345
2346 END BSC_MV_ADAPTER;