[Home] [Help]
PACKAGE BODY: APPS.BSC_MIGRATION
Source
1 PACKAGE BODY BSC_MIGRATION AS
2 /* $Header: BSCSMIGB.pls 120.58.12010000.2 2008/08/11 09:34:46 sirukull ship $ */
3
4 -- Global variables
5 g_metadata_tables t_metadata_tables;
6 g_num_metadata_tables NUMBER := 0;
7
8 g_src_resps t_array_of_number; -- array with the source responsibility ids
9 g_num_src_resps NUMBER := 0;
10 g_trg_resps t_array_of_number; -- array with the target responsibility ids
11 g_num_trg_resps NUMBER := 0;
12
13 g_tabs_filter t_array_of_number; -- array with the tabs in the filter
14 g_num_tabs_filter NUMBER := 0;
15 g_kpis_filter t_array_of_number; -- array with the KPIs in the filter
16 g_num_kpis_filter NUMBER := 0;
17
18 g_mig_tabs t_array_of_number; -- array with the tabs to be migrated
19 g_num_mig_tabs NUMBER := 0;
20 g_mig_kpis t_array_of_number; -- array with the kpis to be migrated
21 g_num_mig_kpis NUMBER := 0;
22 g_mig_tables t_array_of_varchar2; -- array with the tables to be migrated
23 g_num_mig_tables NUMBER := 0;
24
25 g_src_apps_flag BOOLEAN; -- True: source system is an apps system
26 g_src_bsc_schema VARCHAR2(30); -- BSC schema name in source system
27 g_sysadmin_user_id NUMBER; -- User id for SYSADMIN user in the target system
28
29 g_warnings BOOLEAN := FALSE;
30
31 /*===========================================================================+
32 this flag will check that if migration failed after syncup, in that
33 case we will not do the sync up again while exiting, else we will do sync up
34 before exit.
35 +============================================================================*/
36 g_syncup_done BOOLEAN; -- bug fix 6004972
37 g_error_synch_bsc_pmf EXCEPTION;
38 g_invalid_pmf_measures t_array_of_varchar2; -- array with PMF measures that not exist in the target
39 g_num_invalid_pmf_measures NUMBER := 0;
40 g_invalid_pmf_dimensions t_array_of_varchar2; -- array with PMF dimensions that not exist in the target
41 g_num_invalid_pmf_dimensions NUMBER := 0;
42 g_invalid_pmf_dim_levels t_array_of_varchar2; -- array with PMF dimension levels that not exist in the target
43 g_num_invalid_pmf_dim_levels NUMBER := 0;
44 g_invalid_kpis t_array_of_number; -- array with invalid kpis
45 g_num_invalid_kpis NUMBER := 0;
46 g_no_mig_kpis t_array_of_number; -- array of kpis that cannot be migrated
47 g_num_no_mig_kpis NUMBER := 0;
48
49 -- Enh#4697749 new global variables
50 g_migrated_ak_regions t_array_of_varchar2;
51 g_num_migrated_ak_regions NUMBER := 0;
52 g_migrated_functions t_array_of_varchar2;
53 g_num_migrated_functions NUMBER := 0;
54
55 --BSC-MV Note: variable to store the summarization level from the source.
56 --This value is gotten from BSC_SYS_INIT in the source
57 -- g_adv_sum_level = NULL means current architecture.
58 -- g_adv_sum_level <> NULL means BSC-MV/V architecture
59 g_adv_sum_level NUMBER := NULL;
60
61 g_adv_mig_features VARCHAR2(100) := NULL;
62
63 -- Constants
64 --- commented for bug 5583119
65 ---c_version CONSTANT VARCHAR2(10) := '5.3.0';
66 c_fto_long_date_time CONSTANT VARCHAR2(30) := 'Month DD, YYYY HH24:MI:SS';
67
68 c_comments_tbl CONSTANT VARCHAR2(30) := 'BSC_KPI_COMMENTS';
69 c_comments_bak CONSTANT VARCHAR2(30) := 'BSC_KPI_COMMENTS_BAK';
70
71 --bug 6004972 sync up api to be called in case of failures or exiting from migration
72 PROCEDURE sync_bis_bsc_metadata(h_error_msg OUT NOCOPY VARCHAR2) IS
73 BEGIN
74 -- --------------------------------------------------------------------
75 -- Synchronize Dimensions and Measures between BSC-PMF
76 -- --------------------------------------------------------------------
77 IF NOT BSC_UPGRADES.Synchronize_Dim_Objects(h_error_msg) THEN
78 RAISE g_error_synch_bsc_pmf;
79 END IF;
80
81 IF NOT BSC_UPGRADES.Synchronize_Dimensions(h_error_msg) THEN
82 RAISE g_error_synch_bsc_pmf;
83 END IF;
84
85 IF NOT BSC_UPGRADES.synchronize_measures(h_error_msg) THEN
86 RAISE g_error_synch_bsc_pmf;
87 END IF;
88 END sync_bis_bsc_metadata;
89
90 PROCEDURE syncup_dataset_id_in_target IS
91 TYPE t_cursor IS REF CURSOR;
92 h_cursor t_cursor;
93 h_sql VARCHAR2(2000);
94
95 h_count NUMBER;
96 h_short_name BIS_INDICATORS.SHORT_NAME%TYPE;
97 h_dataset_id BIS_INDICATORS.DATASET_ID%TYPE;
98
99 BEGIN
100 h_sql := 'SELECT DISTINCT si.short_name,si.dataset_id'||
101 ' FROM bis_indicators@'||g_db_link||' si'||
102 ', bsc_sys_datasets_b@'||g_db_link||' sd'||
103 ' WHERE sd.dataset_id = si.dataset_id AND'||
104 ' si.created_by NOT IN (:2, :3, :4, :5)';
105 IF(h_cursor%ISOPEN) THEN
106 CLOSE h_cursor;
107 END IF;
108 OPEN h_cursor FOR h_sql USING 1, 2,120,121;
109 LOOP
110 FETCH h_cursor INTO h_short_name,h_dataset_id;
111 EXIT WHEN h_cursor%NOTFOUND;
112 --EXECUTE IMMEDIATE h_upd_stmt USING h_dataset_id,h_short_name;
113 UPDATE bis_indicators SET dataset_id = h_dataset_id WHERE short_name = h_short_name;
114 END LOOP;
115 CLOSE h_cursor;
116
117 COMMIT;
118 EXCEPTION --ignore the exception if any
119 WHEN OTHERS THEN
120 ROLLBACK;
121 BSC_MESSAGE.Add(x_message => 'Error in syncup dataset ids'||sqlerrm,
122 x_source => 'BSC_MIGRATION.Migrate_System');
123 COMMIT;
124 IF(h_cursor%ISOPEN) THEN
125 CLOSE h_cursor;
126 END IF;
127 END;
128
129 /*===========================================================================+
130 | FUNCTION Assign_Target_Responsibilities
131 +============================================================================*/
132 FUNCTION Assign_Target_Responsibilities RETURN BOOLEAN IS
133
134 e_unexpected_error EXCEPTION;
135 e_add_roles_scorecard EXCEPTION;
136
137 h_error_msg VARCHAR2(2000);
138
139 h_sql VARCHAR2(32000);
140 h_condition VARCHAR2(32000);
141
142 h_message VARCHAR2(4000);
143 h_i NUMBER;
144 h_j NUMBER;
145
146 h_dist_trg_resps t_array_of_number;
147 h_num_dist_trg_resps NUMBER := 0;
148
149 h_decode_lst VARCHAR2(32000);
150 h_tab_condition VARCHAR2(32000);
151 h_kpi_condition VARCHAR2(32000);
152 h_src_resps_condition VARCHAR2(32000);
153
154 h_property_code VARCHAR2(50);
155
156
157 BEGIN
158 h_message := BSC_APPS.Get_Message('BSC_MIG_ASG_KPIS_TO_RESPS');
159 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
160
161 -- Delete current assigments
162 h_sql := 'DELETE FROM bsc_user_tab_access';
163 BSC_APPS.Execute_Immediate(h_sql);
164
165 h_sql := 'DELETE FROM bsc_user_list_access';
166 BSC_APPS.Execute_Immediate(h_sql);
167
168 h_sql := 'DELETE FROM bsc_user_kpi_access';
169 BSC_APPS.Execute_Immediate(h_sql);
170
171 -- Transfer source assigments to target
172 -- Initialize the array of distinct target responsibilities
173 h_num_dist_trg_resps := 0;
174 FOR h_i IN 1..g_num_trg_resps LOOP
175 IF NOT Item_Belong_To_Array_Number(g_trg_resps(h_i), h_dist_trg_resps, h_num_dist_trg_resps) THEN
176 h_num_dist_trg_resps := h_num_dist_trg_resps + 1;
177 h_dist_trg_resps(h_num_dist_trg_resps) := g_trg_resps(h_i);
178 END IF;
179 END LOOP;
180
181 -- Assign each different target responsibility base on his source responsibilities
182 h_tab_condition := BSC_APPS.Get_New_Big_In_Cond_Number(1, 'tab_id');
183 FOR h_i IN 1 .. g_num_mig_tabs LOOP
184 BSC_APPS.Add_Value_Big_In_Cond(1, g_mig_tabs(h_i));
185 END LOOP;
186
187 h_kpi_condition := BSC_APPS.Get_New_Big_In_Cond_Number(2, 'indicator');
188 FOR h_i IN 1 .. g_num_mig_kpis LOOP
189 BSC_APPS.Add_Value_Big_In_Cond(2, g_mig_kpis(h_i));
190 END LOOP;
191
192 FOR h_i IN 1..h_num_dist_trg_resps LOOP
193 -- Get the componets for the queries
194 h_decode_lst := NULL;
195
196 h_src_resps_condition := BSC_APPS.Get_New_Big_In_Cond_Number(3, 'responsibility_id');
197 FOR h_j IN 1..g_num_trg_resps LOOP
198 IF g_trg_resps(h_j) = h_dist_trg_resps(h_i) THEN
199 IF h_decode_lst IS NULL THEN
200 h_decode_lst := g_src_resps(h_j)||', '||h_dist_trg_resps(h_i);
201 ELSE
202 h_decode_lst := h_decode_lst||', '||g_src_resps(h_j)||', '||h_dist_trg_resps(h_i);
203 END IF;
204
205 BSC_APPS.Add_Value_Big_In_Cond(3, g_src_resps(h_j));
206 END IF;
207 END LOOP;
208
209 -- Transfer responsibilities for this target responsibility. All this logica is because
210 -- one target responsibility can correspond to many source responsibilities.
211 -- Also one source responsibility can correspond to many target responsibilities. We need
212 -- to be careful with the unique constraints in the access tables.
213
214 -- BSC_USER_TAB_ACCESS
215 h_sql := 'INSERT INTO bsc_user_tab_access (responsibility_id, tab_id, creation_date,'||
216 ' created_by, last_update_date, last_updated_by, last_update_login, start_date,'||
217 ' end_date)'||
218 ' SELECT DECODE (responsibility_id, '||h_decode_lst||'), tab_id, MAX(creation_date),'||
219 ' MAX(created_by), MAX(last_update_date), MAX(last_updated_by), MAX(last_update_login),'||
220 ' MAX(start_date), MAX(end_date)'||
221 ' FROM bsc_user_tab_access@'||g_db_link||
222 ' WHERE ('||h_src_resps_condition||')';
223 IF h_tab_condition IS NOT NULL THEN
224 h_sql := h_sql||' AND ('||h_tab_condition||')';
225 END IF;
226 h_sql := h_sql||' GROUP BY DECODE(responsibility_id, '||h_decode_lst||'), tab_id';
227 BSC_APPS.Execute_Immediate(h_sql);
228
229 -- BSC_USER_LIST_ACCESS
230 h_sql := 'INSERT INTO bsc_user_list_access (responsibility_id, tab_id, dim_level_index,'||
231 ' dim_level_value, creation_date, created_by, last_update_date, last_updated_by,'||
232 ' last_update_login)'||
233 ' SELECT DECODE (responsibility_id, '||h_decode_lst||'), tab_id, dim_level_index,'||
234 ' MIN(dim_level_value), MAX(creation_date), MAX(created_by), MAX(last_update_date),'||
235 ' MAX(last_updated_by), MAX(last_update_login)'||
236 ' FROM bsc_user_list_access@'||g_db_link||
237 ' WHERE ('||h_src_resps_condition||')';
238 IF h_tab_condition IS NOT NULL THEN
239 h_sql := h_sql||' AND ('||h_tab_condition||')';
240 END IF;
241 h_sql := h_sql||' GROUP BY DECODE(responsibility_id, '||h_decode_lst||'), tab_id, dim_level_index';
242 BSC_APPS.Execute_Immediate(h_sql);
243
244 -- BSC_USER_KPI_ACCESS
245 h_sql := 'INSERT INTO bsc_user_kpi_access (responsibility_id, indicator, creation_date,'||
246 ' created_by, last_update_date, last_updated_by, last_update_login, start_date,'||
247 ' end_date)'||
248 ' SELECT DECODE (responsibility_id, '||h_decode_lst||'), indicator, MAX(creation_date),'||
249 ' MAX(created_by), MAX(last_update_date), MAX(last_updated_by), MAX(last_update_login),'||
250 ' MAX(start_date), MAX(end_date)'||
251 ' FROM bsc_user_kpi_access@'||g_db_link||
252 ' WHERE ('||h_src_resps_condition||')';
253 IF h_kpi_condition IS NOT NULL THEN
254 h_sql := h_sql||' AND ('||h_kpi_condition||')';
255 END IF;
256 h_sql := h_sql||' GROUP BY DECODE(responsibility_id, '||h_decode_lst||'), indicator';
257 BSC_APPS.Execute_Immediate(h_sql);
258
259 END LOOP;
260
261 -- Assign custom links to the target responsibilities based on the accessibility of the source
262 -- responsibilities
263 IF BSC_APPS.APPS_ENV AND g_src_apps_flag THEN
264 -- Source and target systems are in APPS
265 FOR h_i IN 1..g_num_trg_resps LOOP
266 IF NOT BSC_LAUNCH_PAD_PVT.Migrate_Custom_Links_Security(g_trg_resps(h_i), g_src_resps(h_i), g_db_link) THEN
267 RAISE e_unexpected_error;
268 END IF;
269 END LOOP;
270 END IF;
271
272 -- Fix bug#3831534 It will grant Designer Role (update Acess) to all design user
273 -- (user with BSC_Manager or BSC_DESIGNER)
274 h_property_code := 'GRANT_ROLE_TAB';
275
276 delete from bsc_sys_init
277 where property_code = h_property_code;
278 commit;
279
280 IF NOT BSC_UPGRADES_GENERIC.upgrade_role_to_tabs(h_error_msg) THEN
281 RAISE e_add_roles_scorecard;
282 END IF;
283
284 RETURN TRUE;
285
286 EXCEPTION
287 WHEN e_unexpected_error THEN
288 BSC_MESSAGE.Add (x_message => BSC_APPS.Get_Message('BSC_MIG_FAIL_EXEC'),
289 x_source => 'BSC_MIGRATION.Assign_Target_Responsibilities');
290 RETURN FALSE;
291
292 WHEN e_add_roles_scorecard THEN
293 BSC_MESSAGE.Add (x_message => h_error_msg,
294 x_source => 'BSC_MIGRATION.Assign_Target_Responsibilities');
295 RETURN FALSE;
296
297 WHEN OTHERS THEN
298 BSC_MESSAGE.Add (x_message => SQLERRM,
299 x_source => 'BSC_MIGRATION.Assign_Target_Responsibilities');
300 RETURN FALSE;
301
302 END Assign_Target_Responsibilities;
303
304
305 /*===========================================================================+
306 | FUNCTION Check_Languages_TL_Tables
307 +============================================================================*/
308 FUNCTION Check_Languages_TL_Tables RETURN BOOLEAN IS
309
310 TYPE t_cursor IS REF CURSOR;
311 h_cursor t_cursor;
312
313 h_src_languages t_array_of_varchar2;
314 h_num_src_languages NUMBER := 0;
315 h_trg_languages t_array_of_varchar2;
316 h_num_trg_languages NUMBER := 0;
317
318 h_src_base_language VARCHAR2(4);
319
320 h_lang_code VARCHAR2(4);
321 h_installed_flag VARCHAR2(1);
322
323 h_i NUMBER;
324 h_j NUMBER;
325 h_table_name VARCHAR2(30);
326 h_sql VARCHAR2(32700);
327
328 h_column_name VARCHAR2(30);
329 h_lst_insert VARCHAR2(32700);
330 h_lst_select VARCHAR2(32700);
331
332 CURSOR c_columns IS
333 SELECT column_name
334 FROM user_tab_columns
335 WHERE table_name = UPPER(h_table_name);
336
337 CURSOR c_columns_apps IS
338 SELECT column_name
339 FROM all_tab_columns
340 WHERE table_name = UPPER(h_table_name) AND
341 owner = UPPER(BSC_APPS.BSC_APPS_SCHEMA);
342
343 BEGIN
344 -- Get supported languages in source system
345 h_sql := 'SELECT DISTINCT language_code, installed_flag'||
346 ' FROM fnd_languages@'||g_db_link||
347 ' WHERE installed_flag IN (:1, :2)';
348 OPEN h_cursor FOR h_sql USING 'B', 'I';
349 h_num_src_languages := 0;
350 LOOP
351 FETCH h_cursor INTO h_lang_code, h_installed_flag;
352 EXIT WHEN h_cursor%NOTFOUND;
353
354 h_num_src_languages := h_num_src_languages + 1;
355 h_src_languages(h_num_src_languages) := h_lang_code;
356
357 IF h_installed_flag = 'B' THEN
358 h_src_base_language := h_lang_code;
359 END IF;
360 END LOOP;
361 CLOSE h_cursor;
362
363 -- Get supported languages in target system
364 h_sql := 'SELECT DISTINCT language_code'||
365 ' FROM fnd_languages'||
366 ' WHERE installed_flag IN (:1, :2)';
367 OPEN h_cursor FOR h_sql USING 'B', 'I';
368 h_num_trg_languages := 0;
369 LOOP
370 FETCH h_cursor INTO h_lang_code;
371 EXIT WHEN h_cursor%NOTFOUND;
372
373 h_num_trg_languages := h_num_trg_languages + 1;
374 h_trg_languages(h_num_trg_languages) := h_lang_code;
375 END LOOP;
376 CLOSE h_cursor;
377
378
379 -- Fix _TL tables according to supported languages in the target system
380 FOR h_i IN 1..g_num_metadata_tables LOOP
381 IF g_metadata_tables(h_i).lang_flag THEN
382 h_table_name := g_metadata_tables(h_i).table_name;
383
384 -- For each language in the target system:
385 -- If language is not supported in the source system then
386 -- we generate the records for the target language based
387 -- on the base language of the source system
388 FOR h_j IN 1..h_num_trg_languages LOOP
389 IF NOT Item_Belong_To_Array_Varchar2(h_trg_languages(h_j),
390 h_src_languages,
391 h_num_src_languages) THEN
392 h_lst_insert := NULL;
393 h_lst_select := NULL;
394 IF NOT BSC_APPS.APPS_ENV THEN
395 -- Personal mode
396 OPEN c_columns;
397 FETCH c_columns INTO h_column_name;
398 WHILE c_columns%FOUND LOOP
399 IF h_lst_insert IS NOT NULL THEN
400 h_lst_insert := h_lst_insert||', ';
401 h_lst_select := h_lst_select||', ';
402 END IF;
403
404 h_lst_insert := h_lst_insert||h_column_name;
405
406 IF UPPER(h_column_name) = 'LANGUAGE' THEN
407 h_lst_select := h_lst_select||''''||h_trg_languages(h_j)||'''';
408 ELSE
409 h_lst_select := h_lst_select||h_column_name;
410 END IF;
411
412 FETCH c_columns INTO h_column_name;
413 END LOOP;
414 CLOSE c_columns;
415 ELSE
416 -- Apps mode
417 OPEN c_columns_apps;
418 FETCH c_columns_apps INTO h_column_name;
419 WHILE c_columns_apps%FOUND LOOP
420 IF h_lst_insert IS NOT NULL THEN
421 h_lst_insert := h_lst_insert||', ';
422 h_lst_select := h_lst_select||', ';
423 END IF;
424
425 h_lst_insert := h_lst_insert||h_column_name;
426
427 IF UPPER(h_column_name) = 'LANGUAGE' THEN
428 h_lst_select := h_lst_select||''''||h_trg_languages(h_j)||'''';
429 ELSE
430 h_lst_select := h_lst_select||h_column_name;
431 END IF;
432
433 FETCH c_columns_apps INTO h_column_name;
434 END LOOP;
435 CLOSE c_columns_apps;
436 END IF;
437
438 h_sql := 'INSERT INTO '||h_table_name||' ('||h_lst_insert||')'||
439 ' SELECT '||h_lst_select||
440 ' FROM '||h_table_name||
441 ' WHERE LANGUAGE = :1';
442 /* ' WHERE LANGUAGE = '''||h_src_base_language||'''';*/
443
444 EXECUTE IMMEDIATE h_sql USING h_src_base_language;
445
446 /* BSC_APPS.Execute_Immediate(h_sql); */
447
448 END IF;
449 END LOOP;
450
451 -- Delete records of source languages that dont exists in the
452 -- target system
453 FOR h_j IN 1..h_num_src_languages LOOP
454 IF NOT Item_Belong_To_Array_Varchar2(h_src_languages(h_j),
455 h_trg_languages,
456 h_num_trg_languages) THEN
457 h_sql := 'DELETE FROM '||h_table_name||
458 ' WHERE LANGUAGE = :1';
459 /* ' WHERE LANGUAGE = '''||h_src_languages(h_j)||'''';*/
460 EXECUTE IMMEDIATE h_sql USING h_src_languages(h_j);
461
462 /*BSC_APPS.Execute_Immediate(h_sql); */
463 END IF;
464 END LOOP;
465
466 COMMIT;
467 END IF;
468 END LOOP;
469
470 -- Fix dimension tables. They are TL tables too.
471 h_sql := 'SELECT level_table_name'||
472 ' FROM bsc_sys_dim_levels_b'||
473 ' WHERE nvl(source, ''BSC'') = ''BSC''';
474 OPEN h_cursor FOR h_sql;
475 LOOP
476 FETCH h_cursor INTO h_table_name;
477 EXIT WHEN h_cursor%NOTFOUND;
478
479 -- For each language in the target system:
480 -- If language is not supported in the source system then
481 -- we generate the records for the target language based
482 -- on the base language of the source system
483 FOR h_j IN 1..h_num_trg_languages LOOP
484 IF NOT Item_Belong_To_Array_Varchar2(h_trg_languages(h_j),
485 h_src_languages,
486 h_num_src_languages) THEN
487 h_lst_insert := NULL;
488 h_lst_select := NULL;
489 IF NOT BSC_APPS.APPS_ENV THEN
490 -- Personal mode
491 OPEN c_columns;
492 FETCH c_columns INTO h_column_name;
493 WHILE c_columns%FOUND LOOP
494 IF h_lst_insert IS NOT NULL THEN
495 h_lst_insert := h_lst_insert||', ';
496 h_lst_select := h_lst_select||', ';
497 END IF;
498
499 h_lst_insert := h_lst_insert||h_column_name;
500
501 IF UPPER(h_column_name) = 'LANGUAGE' THEN
502 h_lst_select := h_lst_select||''''||h_trg_languages(h_j)||'''';
503 ELSE
504 h_lst_select := h_lst_select||h_column_name;
505 END IF;
506
507 FETCH c_columns INTO h_column_name;
508 END LOOP;
509 CLOSE c_columns;
510 ELSE
511 -- Apps mode
512 OPEN c_columns_apps;
513 FETCH c_columns_apps INTO h_column_name;
514 WHILE c_columns_apps%FOUND LOOP
515 IF h_lst_insert IS NOT NULL THEN
516 h_lst_insert := h_lst_insert||', ';
517 h_lst_select := h_lst_select||', ';
518 END IF;
519
520 h_lst_insert := h_lst_insert||h_column_name;
521
522 IF UPPER(h_column_name) = 'LANGUAGE' THEN
523 h_lst_select := h_lst_select||''''||h_trg_languages(h_j)||'''';
524 ELSE
525 h_lst_select := h_lst_select||h_column_name;
526 END IF;
527
528 FETCH c_columns_apps INTO h_column_name;
529 END LOOP;
530 CLOSE c_columns_apps;
531 END IF;
532
533 h_sql := 'INSERT INTO '||h_table_name||' ('||h_lst_insert||')'||
534 ' SELECT '||h_lst_select||
535 ' FROM '||h_table_name||
536 ' WHERE LANGUAGE = :1';
537 EXECUTE IMMEDIATE h_sql USING h_src_base_language;
538 END IF;
539 END LOOP;
540
541 -- Delete records of source languages that dont exists in the
542 -- target system
543 FOR h_j IN 1..h_num_src_languages LOOP
544 IF NOT Item_Belong_To_Array_Varchar2(h_src_languages(h_j),
545 h_trg_languages,
546 h_num_trg_languages) THEN
547 h_sql := 'DELETE FROM '||h_table_name||
548 ' WHERE LANGUAGE = :1';
549 EXECUTE IMMEDIATE h_sql USING h_src_languages(h_j);
550 END IF;
551 END LOOP;
552
553 COMMIT;
554
555 END LOOP;
556 CLOSE h_cursor;
557
558 RETURN TRUE;
559
560 EXCEPTION
561 WHEN OTHERS THEN
562 BSC_MESSAGE.Add (x_message => SQLERRM,
563 x_source => 'BSC_MIGRATION.Check_Languages_TL_Tables');
564 RETURN FALSE;
565 END Check_Languages_TL_Tables;
566
567
568 /*===========================================================================+
569 | PROCEDURE Clean_Metadata_Invalid_PMF
570 +============================================================================*/
571 PROCEDURE Clean_Metadata_Invalid_PMF IS
572
573 h_sql VARCHAR2(32000);
574 h_condition VARCHAR2(32000);
575 h_i NUMBER;
576
577 BEGIN
578 -- Clean metadata from invalid measures
579
580 IF g_num_invalid_pmf_measures > 0 THEN
581 h_condition := BSC_APPS.Get_New_Big_In_Cond_Varchar2(1, 'short_name');
582 FOR h_i IN 1 .. g_num_invalid_pmf_measures LOOP
583 BSC_APPS.Add_Value_Big_In_Cond(1, g_invalid_pmf_measures(h_i));
584 END LOOP;
585
586 -- BSC_SYS_DATASET_CALC
587 h_sql := 'DELETE FROM bsc_sys_dataset_calc'||
588 ' WHERE dataset_id IN ('||
589 ' SELECT dataset_id'||
590 ' FROM bsc_sys_datasets_b'||
591 ' WHERE measure_id1 IN ('||
592 ' SELECT measure_id'||
593 ' FROM bsc_sys_measures'||
594 ' WHERE '||h_condition||
595 ' )'||
596 ' )';
597 BSC_APPS.Execute_Immediate(h_sql);
598
599 -- BSC_SYS_DATASETS_TL
600 h_sql := 'DELETE FROM bsc_sys_datasets_tl'||
601 ' WHERE dataset_id IN ('||
602 ' SELECT dataset_id'||
603 ' FROM bsc_sys_datasets_b'||
604 ' WHERE measure_id1 IN ('||
605 ' SELECT measure_id'||
606 ' FROM bsc_sys_measures'||
607 ' WHERE '||h_condition||
608 ' )'||
609 ' )';
610 BSC_APPS.Execute_Immediate(h_sql);
611
612 -- BSC_SYS_DATASETS_B
613 h_sql := 'DELETE FROM bsc_sys_datasets_b'||
614 ' WHERE measure_id1 IN ('||
615 ' SELECT measure_id'||
616 ' FROM bsc_sys_measures'||
617 ' WHERE '||h_condition||
618 ' )';
619 BSC_APPS.Execute_Immediate(h_sql);
620
621 -- BSC_DB_MEASURE_COLS_TL
622 h_sql := 'DELETE FROM bsc_db_measure_cols_tl'||
623 ' WHERE measure_col IN ('||
624 ' SELECT measure_col'||
625 ' FROM bsc_sys_measures'||
626 ' WHERE '||h_condition||
627 ' )';
628 BSC_APPS.Execute_Immediate(h_sql);
629
630 -- BSC_SYS_MEASURES
631 h_sql := 'DELETE FROM bsc_sys_measures'||
632 ' WHERE '||h_condition;
633 BSC_APPS.Execute_Immediate(h_sql);
634
635 END IF;
636
637 -- Clean metadata from invalid dimensions (dimension groups)
638
639 IF g_num_invalid_pmf_dimensions > 0 THEN
640 h_condition := BSC_APPS.Get_New_Big_In_Cond_Varchar2(1, 'short_name');
641 FOR h_i IN 1 .. g_num_invalid_pmf_dimensions LOOP
642 BSC_APPS.Add_Value_Big_In_Cond(1, g_invalid_pmf_dimensions(h_i));
643 END LOOP;
644
645 -- BSC_SYS_DIM_LEVELS_BY_GROUP
646 h_sql := 'DELETE FROM bsc_sys_dim_levels_by_group'||
647 ' WHERE dim_group_id IN ('||
648 ' SELECT dim_group_id'||
649 ' FROM bsc_sys_dim_groups_tl'||
650 ' WHERE '||h_condition||
651 ' )';
652 BSC_APPS.Execute_Immediate(h_sql);
653
654 -- BSC_SYS_DIM_GROUPS_TL
655 h_sql := 'DELETE FROM bsc_sys_dim_groups_tl'||
656 ' WHERE '||h_condition;
657 BSC_APPS.Execute_Immediate(h_sql);
658
659 END IF;
660
661 -- Clean metadata from invalid dimension levels
662
663 IF g_num_invalid_pmf_dim_levels > 0 THEN
664 h_condition := BSC_APPS.Get_New_Big_In_Cond_Varchar2(1, 'short_name');
665 FOR h_i IN 1 .. g_num_invalid_pmf_dim_levels LOOP
666 BSC_APPS.Add_Value_Big_In_Cond(1, g_invalid_pmf_dim_levels(h_i));
667 END LOOP;
668
669 -- BSC_SYS_DIM_LEVELS_BY_GROUP
670 h_sql := 'DELETE FROM bsc_sys_dim_levels_by_group'||
671 ' WHERE dim_level_id IN ('||
672 ' SELECT dim_level_id'||
673 ' FROM bsc_sys_dim_levels_b'||
674 ' WHERE '||h_condition||
675 ' )';
676 BSC_APPS.Execute_Immediate(h_sql);
677
678 -- BSC_SYS_DIM_LEVEL_COLS
679 h_sql := 'DELETE FROM bsc_sys_dim_level_cols'||
680 ' WHERE dim_level_id IN ('||
681 ' SELECT dim_level_id'||
682 ' FROM bsc_sys_dim_levels_b'||
683 ' WHERE '||h_condition||
684 ' )';
685 BSC_APPS.Execute_Immediate(h_sql);
686
687 -- BSC_SYS_DIM_LEVEL_RELS (dim_level_id)
688 h_sql := 'DELETE FROM bsc_sys_dim_level_rels'||
689 ' WHERE dim_level_id IN ('||
690 ' SELECT dim_level_id'||
691 ' FROM bsc_sys_dim_levels_b'||
692 ' WHERE '||h_condition||
693 ' )';
694 BSC_APPS.Execute_Immediate(h_sql);
695
696 -- BSC_SYS_DIM_LEVEL_RELS (parent_dim_level_id)
697 h_sql := 'DELETE FROM bsc_sys_dim_level_rels'||
698 ' WHERE parent_dim_level_id IN ('||
699 ' SELECT dim_level_id'||
700 ' FROM bsc_sys_dim_levels_b'||
701 ' WHERE '||h_condition||
702 ' )';
703 BSC_APPS.Execute_Immediate(h_sql);
704
705 -- BSC_SYS_DIM_LEVELS_TL
706 h_sql := 'DELETE FROM bsc_sys_dim_levels_tl'||
707 ' WHERE dim_level_id IN ('||
708 ' SELECT dim_level_id'||
709 ' FROM bsc_sys_dim_levels_b'||
710 ' WHERE '||h_condition||
711 ' )';
712 BSC_APPS.Execute_Immediate(h_sql);
713
714 -- BSC_SYS_DIM_LEVELS_B
715 h_sql := 'DELETE FROM bsc_sys_dim_levels_b'||
716 ' WHERE '||h_condition;
717 BSC_APPS.Execute_Immediate(h_sql);
718
719 END IF;
720
721 COMMIT;
722
723 END Clean_Metadata_Invalid_PMF;
724
725
726 -- ENH_B_TABLES_PERF: change to this function
727 /*===========================================================================+
728 | FUNCTION Create_Copy_Of_Table_Def
729 +============================================================================*/
730 FUNCTION Create_Copy_Of_Table_Def(
731 x_table IN VARCHAR2,
732 x_tbs_type IN VARCHAR2
733 ) RETURN BOOLEAN IS
734 h_b BOOLEAN;
735 BEGIN
736 h_b := Create_Copy_Of_Table_Def(x_table, x_tbs_type, FALSE);
737 RETURN h_b;
738 END Create_Copy_Of_Table_Def;
739
740
741 -- ENH_B_TABLES_PERF: change to this function
742 /*===========================================================================+
743 | FUNCTION Create_Copy_Of_Table_Def
744 +============================================================================*/
745 FUNCTION Create_Copy_Of_Table_Def(
746 x_table IN VARCHAR2,
747 x_tbs_type IN VARCHAR2,
748 x_with_partitions IN BOOLEAN
749 ) RETURN BOOLEAN IS
750
751 h_sql VARCHAR2(32700);
752
753 TYPE t_cursor IS REF CURSOR;
754 h_cursor t_cursor;
755
756 h_column_id NUMBER;
757 h_column_name VARCHAR2(30);
758 h_data_type VARCHAR2(30);
759 h_data_length NUMBER;
760 h_data_precision NUMBER;
761 h_data_scale NUMBER;
762 h_nullable VARCHAR2(1);
763
764 h_lst_columns VARCHAR2(32700);
765
766 h_storage VARCHAR2(2500);
767 h_initial_extent NUMBER;
768 h_next_extent NUMBER;
769 h_max_extents NUMBER;
770 h_pct_increase NUMBER;
771
772 h_table VARCHAR2(50);
773 h_count NUMBER;
774
775 BEGIN
776
777 h_table := UPPER(x_table);
778
779 --Bug3329329 Drop the table if exists before trying to create it
780 IF BSC_APPS.Table_Exists(h_table) THEN
781 -- Fix perf bug#4583017: do not truncate, just drop.
782 -- Truncate table to release space --> Bug: DROP TABLE don't release the space immediately
783 --h_sql := 'TRUNCATE TABLE '||h_table;
784 --BSC_APPS.Do_DDL(h_sql, AD_DDL.TRUNCATE_TABLE, h_table);
785
786 h_sql := 'DROP TABLE '||h_table;
787 BSC_APPS.Do_DDL(h_sql, AD_DDL.DROP_TABLE, h_table);
788 END IF;
789 ---------
790
791 IF NOT g_src_apps_flag THEN
792 -- The source is Non-Enterprise version
793 h_sql := 'SELECT column_id, column_name, data_type, data_length,'||
794 ' data_precision, data_scale, nullable'||
795 ' FROM user_tab_columns@'||g_db_link||
796 ' WHERE table_name = :1'||
797 ' ORDER BY column_id';
798 OPEN h_cursor FOR h_sql USING h_table;
799 ELSE
800 -- The source system is Enterprice version (APPS)
801 h_sql := 'SELECT column_id, column_name, data_type, data_length,'||
802 ' data_precision, data_scale, nullable'||
803 ' FROM all_tab_columns@'||g_db_link||
804 ' WHERE table_name = :1 AND'||
805 ' owner = :2'||
806 ' ORDER BY column_id';
807 OPEN h_cursor FOR h_sql USING h_table, g_src_bsc_schema;
808 END IF;
809
810 h_lst_columns := NULL;
811
812 LOOP
813 FETCH h_cursor INTO h_column_id, h_column_name, h_data_type, h_data_length, h_data_precision, h_data_scale, h_nullable;
814 EXIT WHEN h_cursor%NOTFOUND;
815
816 IF h_lst_columns IS NOT NULL THEN
817 h_lst_columns := h_lst_columns||', ';
818 END IF;
819
820 h_lst_columns := h_lst_columns||h_column_name;
821 h_lst_columns := h_lst_columns||' '||h_data_type;
822
823 IF h_data_type IN ('VARCHAR2', 'NVARCHAR2', 'RAW', 'CHAR', 'NCHAR') THEN
824 h_lst_columns := h_lst_columns||'('||h_data_length||')';
825 ELSIF h_data_type = 'FLOAT' THEN
826 IF h_data_precision IS NOT NULL THEN
827 h_lst_columns := h_lst_columns||'('||h_data_precision||')';
828 END IF;
829 ELSIF h_data_type = 'NUMBER' THEN
830 IF h_data_precision IS NOT NULL AND h_data_scale IS NOT NULL THEN
831 h_lst_columns := h_lst_columns||'('||h_data_precision||','||h_data_scale||')';
832 ELSIF h_data_precision IS NOT NULL THEN
833 h_lst_columns := h_lst_columns||'('||h_data_precision||')';
834 END IF;
835 END IF;
836
837 IF h_nullable = 'N' THEN
838 h_lst_columns := h_lst_columns||' NOT NULL';
839 END IF;
840
841 END LOOP;
842 CLOSE h_cursor;
843
844 -- Get the storage specs. The table in the target system is created with the same
845 -- storage specs from the source table.
846 IF NOT g_src_apps_flag THEN
847 -- The source is Non-Enterprise version
848 h_sql := 'SELECT initial_extent, next_extent, max_extents, pct_increase'||
849 ' FROM user_tables@'||g_db_link||
850 ' WHERE table_name = :1';
851 OPEN h_cursor FOR h_sql USING h_table;
852 ELSE
853 -- The source system is Enterprice version (APPS)
854 IF x_with_partitions THEN
855 -- See if the table has partitions in the source. In this case we need to read
856 -- storage parameters from all_tab_partitions
857 h_count := 0;
858 h_sql := 'select count(*)'||
859 ' from all_tab_partitions@'||g_db_link||
860 ' where table_owner = :1 and table_name = :2';
861 OPEN h_cursor FOR h_sql USING g_src_bsc_schema, h_table;
862 FETCH h_cursor INTO h_count;
863 CLOSE h_cursor;
864
865 IF h_count > 0 THEN
866 h_sql := 'select max(initial_extent), max(next_extent), max(max_extent), max(pct_increase)'||
867 ' from all_tab_partitions@'||g_db_link||
868 ' where table_owner = :1 and table_name = :2';
869 OPEN h_cursor FOR h_sql USING g_src_bsc_schema, h_table;
870 ELSE
871 h_sql := 'SELECT initial_extent, next_extent, max_extents, pct_increase'||
872 ' FROM all_tables@'||g_db_link||
873 ' WHERE table_name = :1 AND'||
874 ' owner = :2';
875 OPEN h_cursor FOR h_sql USING h_table, g_src_bsc_schema;
876 END IF;
877 ELSE
878 h_sql := 'SELECT initial_extent, next_extent, max_extents, pct_increase'||
879 ' FROM all_tables@'||g_db_link||
880 ' WHERE table_name = :1 AND'||
881 ' owner = :2';
882 OPEN h_cursor FOR h_sql USING h_table, g_src_bsc_schema;
883 END IF;
884 END IF;
885
886 --Fix bug#4206404: storage parameters may be null
887 FETCH h_cursor INTO h_initial_extent, h_next_extent, h_max_extents, h_pct_increase;
888 IF h_cursor%NOTFOUND THEN
889 h_storage := NULL;
890 ELSE
891 --Fix bug#4206404: storage parameters may be null
892 h_storage := NULL;
893 IF h_initial_extent IS NOT NULL THEN
894 h_storage := h_storage||' INITIAL '||TO_CHAR(h_initial_extent);
895 END IF;
896 --Fix perf bug#4583017: hard-code NEXT 4M
897 h_storage := h_storage||' NEXT 4M';
898 --IF h_next_extent IS NOT NULL THEN
899 -- h_storage := h_storage||' NEXT '||TO_CHAR(h_next_extent);
900 --END IF;
901 IF h_max_extents IS NOT NULL THEN
902 h_storage := h_storage||' MAXEXTENTS '||TO_CHAR(h_max_extents);
903 END IF;
904 IF h_pct_increase IS NOT NULL THEN
905 h_storage := h_storage||' PCTINCREASE '||TO_CHAR(h_pct_increase);
906 END IF;
907 IF h_storage IS NOT NULL THEN
908 h_storage := 'STORAGE ('||h_storage||')';
909 END IF;
910 END IF;
911 CLOSE h_cursor;
912
913 -- Create table
914 IF h_lst_columns IS NOT NULL THEN
915 h_sql := 'CREATE TABLE '||x_table||' ('||
916 h_lst_columns||
917 ')';
918 IF x_with_partitions THEN
919 h_sql := h_sql||' '||bsc_dbgen_metadata_reader.get_partition_clause;
920 END IF;
921 h_sql := h_sql||' TABLESPACE '||BSC_APPS.Get_Tablespace_Name(x_tbs_type)||' '||h_storage;
922
923 BSC_APPS.Do_DDL(h_sql, AD_DDL.CREATE_TABLE, x_table);
924 END IF;
925
926 RETURN TRUE;
927
928 EXCEPTION
929 WHEN OTHERS THEN
930 BSC_MESSAGE.Add (x_message => SQLERRM,
931 x_source => 'BSC_MIGRATION.Create_Copy_Of_Table_Def');
932 RETURN FALSE;
933
934 END Create_Copy_Of_Table_Def;
935
936
937 /*===========================================================================+
938 | FUNCTION Create_Copy_Of_View_Def
939 +============================================================================*/
940 FUNCTION Create_Copy_Of_View_Def(
941 x_view IN VARCHAR2,
942 x_replace IN BOOLEAN := TRUE
943 ) RETURN BOOLEAN IS
944
945 h_sql VARCHAR2(32700);
946
947 TYPE t_cursor IS REF CURSOR;
948 h_cursor t_cursor;
949
950 h_text VARCHAR2(30000);
951
952 h_column_id NUMBER;
953 h_column_name VARCHAR2(30);
954 h_lst_columns VARCHAR2(32000);
955 h_view VARCHAR2(50);
956
957 BEGIN
958 h_view := UPPER(x_view);
959
960 -- Get the columns of the view
961 -- The columns of the view are in user_tab_columns.
962 -- Because it is view, we know it should be in APPS scheme so qe can use
963 -- user_tab_columns even when in Apps environment.
964 h_sql := 'SELECT column_id, column_name'||
965 ' FROM user_tab_columns@'||g_db_link||
966 ' WHERE table_name = :1'||
967 ' ORDER BY column_id';
968 OPEN h_cursor FOR h_sql USING h_view;
969
970 h_lst_columns := NULL;
971
972 LOOP
973 FETCH h_cursor INTO h_column_id, h_column_name;
974 EXIT WHEN h_cursor%NOTFOUND;
975
976 IF h_lst_columns IS NOT NULL THEN
977 h_lst_columns := h_lst_columns||', ';
978 END IF;
979
980 h_lst_columns := h_lst_columns||h_column_name;
981
982 END LOOP;
983 CLOSE h_cursor;
984
985 -- Get the sql of the view
986 h_sql := 'SELECT text'||
987 ' FROM user_views@'||g_db_link||
988 ' WHERE view_name = :1';
989 OPEN h_cursor FOR h_sql USING h_view;
990
991 FETCH h_cursor INTO h_text;
992 IF h_cursor%FOUND THEN
993 BEGIN
994 h_sql := 'CREATE';
995 IF x_replace THEN
996 h_sql := h_sql||' OR REPLACE';
997 END IF;
998 h_sql := h_sql||' FORCE VIEW '||x_view||' ('||h_lst_columns||') AS '||h_text;
999 BSC_APPS.Execute_DDL(h_sql);
1000 EXCEPTION
1001 WHEN OTHERS THEN
1002 IF (SQLCODE = -24344) THEN
1003 NULL; -- Ignore, success with compilation error
1004 ELSIF (SQLCODE = -00955) THEN
1005 NULL; -- view already exists on the target do not oeverwrite
1006 ELSE
1007 BSC_MESSAGE.Add (x_message => SQLERRM,
1008 x_source => 'BSC_MIGRATION.Create_Copy_Of_View_Def');
1009 RETURN FALSE;
1010 END IF;
1011 END;
1012
1013 END IF;
1014 CLOSE h_cursor;
1015
1016 RETURN TRUE;
1017
1018 EXCEPTION
1019 WHEN OTHERS THEN
1020 BSC_MESSAGE.Add (x_message => SQLERRM,
1021 x_source => 'BSC_MIGRATION.Create_Copy_Of_View_Def');
1022 RETURN FALSE;
1023
1024 END Create_Copy_Of_View_Def;
1025
1026
1027 /*===========================================================================+
1028 | FUNCTION Create_Dynamic_Objects
1029 +============================================================================*/
1030 FUNCTION Create_Dynamic_Objects RETURN BOOLEAN IS
1031
1032 e_unexpected_error EXCEPTION;
1033
1034 h_sql VARCHAR2(32700);
1035
1036 TYPE t_cursor IS REF CURSOR;
1037 h_cursor t_cursor;
1038
1039 h_i NUMBER;
1040
1041 h_table VARCHAR2(30);
1042 h_view VARCHAR2(30);
1043 h_source VARCHAR2(10);
1044
1045 h_base_message VARCHAR2(4000);
1046 h_base_message_v VARCHAR2(4000);
1047 h_message VARCHAR2(4000);
1048
1049 h_tbs_type VARCHAR2(100);
1050
1051 -- ENH_B_TABLES_PERF: new variables
1052 h_rowid_table_name VARCHAR2(30);
1053 h_proj_table_name VARCHAR2(30);
1054
1055 --bug#5943112
1056 h_max_partitions NUMBER;
1057 h_num_partitions NUMBER;
1058 h_key_columns BSC_UPDATE_UTIL.t_array_of_varchar2;
1059 h_key_dim_tables BSC_UPDATE_UTIL.t_array_of_varchar2;
1060 h_source_columns BSC_UPDATE_UTIL.t_array_of_varchar2;
1061 h_source_dim_tables BSC_UPDATE_UTIL.t_array_of_varchar2;
1062 h_num_key_columns NUMBER;
1063 h_key_columns_create BOOLEAN;
1064 BEGIN
1065
1066 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_MIG_CREATE_OBJS'), BSC_APPS.OUTPUT_FILE);
1067
1068 h_base_message := BSC_APPS.Get_Message('BSC_CREATING_TABLE');
1069 h_base_message_v := BSC_APPS.Get_Message('BSC_CREATING_VIEW');
1070
1071 -- Dimension tables
1072 h_sql := 'SELECT level_table_name, level_view_name, nvl(source, ''BSC'')'||
1073 ' FROM bsc_sys_dim_levels_b';
1074 OPEN h_cursor FOR h_sql;
1075 LOOP
1076 FETCH h_cursor INTO h_table, h_view, h_source;
1077 EXIT WHEN h_cursor%NOTFOUND;
1078
1079 -- If the dimension is for PMF the value stored for table and view
1080 -- is the same and corresponds to a view
1081
1082 IF h_source = 'BSC' THEN
1083 -- create dimension table
1084 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
1085 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1086
1087 IF NOT Create_Copy_Of_Table_Def(h_table, BSC_APPS.dimension_table_tbs_type) THEN
1088 RAISE e_unexpected_error;
1089 END IF;
1090 END IF;
1091
1092 -- Create vl view
1093 h_message := BSC_APPS.Replace_Token(h_base_message_v, 'VIEW', h_view);
1094 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1095
1096 IF NOT Create_Copy_Of_View_Def(h_view) THEN
1097 RAISE e_unexpected_error;
1098 END IF;
1099
1100 END LOOP;
1101 CLOSE h_cursor;
1102
1103 -- Input tables for dimensions
1104 h_sql := 'SELECT table_name'||
1105 ' FROM bsc_db_tables'||
1106 ' WHERE table_type = 2';
1107 OPEN h_cursor FOR h_sql;
1108 LOOP
1109 FETCH h_cursor INTO h_table;
1110 EXIT WHEN h_cursor%NOTFOUND;
1111
1112 -- create dimension input table
1113 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
1114 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1115
1116 IF NOT Create_Copy_Of_Table_Def(h_table, BSC_APPS.input_table_tbs_type) THEN
1117 RAISE e_unexpected_error;
1118 END IF;
1119
1120 END LOOP;
1121 CLOSE h_cursor;
1122
1123
1124 -- MN Dimension tables
1125 h_sql := 'SELECT DISTINCT relation_col'||
1126 ' FROM bsc_sys_dim_level_rels'||
1127 ' WHERE relation_type = 2';
1128 OPEN h_cursor FOR h_sql;
1129 LOOP
1130 FETCH h_cursor INTO h_table;
1131 EXIT WHEN h_cursor%NOTFOUND;
1132
1133 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
1134 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1135
1136 IF NOT Create_Copy_Of_Table_Def(h_table, BSC_APPS.dimension_table_tbs_type) THEN
1137 RAISE e_unexpected_error;
1138 END IF;
1139 END LOOP;
1140 CLOSE h_cursor;
1141
1142
1143 -- Filter views
1144 h_base_message := BSC_APPS.Get_Message('BSC_CREATING_VIEW');
1145
1146 h_sql := 'SELECT level_view_name'||
1147 ' FROM bsc_sys_filters_views';
1148 OPEN h_cursor FOR h_sql;
1149 LOOP
1150 FETCH h_cursor INTO h_view;
1151 EXIT WHEN h_cursor%NOTFOUND;
1152
1153 h_message := BSC_APPS.Replace_Token(h_base_message, 'VIEW', h_view);
1154 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1155
1156 IF NOT Create_Copy_Of_View_Def(h_view) THEN
1157 RAISE e_unexpected_error;
1158 END IF;
1159 END LOOP;
1160 CLOSE h_cursor;
1161 --rkumar:bug#5943112
1162 h_max_partitions := bsc_dbgen_metadata_reader.get_max_partitions;
1163
1164 -- Data tables
1165 h_base_message := BSC_APPS.Get_Message('BSC_CREATING_TABLE');
1166
1167 FOR h_i IN 1..g_num_mig_tables LOOP
1168 h_table := g_mig_tables(h_i);
1169 h_num_key_columns := 0;
1170 h_key_columns_create:=false;
1171 IF NOT BSC_UPDATE_UTIL.Get_Information_Key_Columns(h_table,
1172 h_key_columns,
1173 h_key_dim_tables,
1174 h_source_columns,
1175 h_source_dim_tables,
1176 h_num_key_columns) THEN
1177 RAISE e_unexpected_error;
1178 END IF;
1179 if ((h_num_key_columns > 0) AND (h_max_partitions > 1) ) then
1180 h_key_columns_create:=true;
1181 end if;
1182 --BSC-MV Note: Create only existing tables
1183 IF g_adv_sum_level IS NULL THEN
1184 -- BSC summary tables architecture. All summary tables exists
1185 IF Is_Input_Table(h_table) THEN
1186 h_tbs_type := BSC_APPS.input_table_tbs_type;
1187
1188 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
1189 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1190 IF NOT Create_Copy_Of_Table_Def(h_table, h_tbs_type) THEN
1191 RAISE e_unexpected_error;
1192 END IF;
1193
1194 -- ENH_B_TABLES_PERF: check if the input table has a rowid table
1195 h_rowid_table_name := Get_RowId_Table_Name(h_table);
1196 IF h_rowid_table_name IS NOT NULL THEN
1197 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_rowid_table_name);
1198 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1199 IF NOT Create_Copy_Of_Table_Def(h_rowid_table_name, h_tbs_type) THEN
1200 RAISE e_unexpected_error;
1201 END IF;
1202 END IF;
1203
1204 ELSIF Is_Base_Table(h_table) THEN
1205 h_tbs_type := BSC_APPS.base_table_tbs_type;
1206
1207 -- ENH_B_TABLES_PERF: check if the base table has a projection table
1208 h_proj_table_name := Get_Proj_Table_Name(h_table);
1209 IF h_proj_table_name IS NULL THEN
1210 -- create the base table in the standard way
1211 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
1212 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1213 IF NOT Create_Copy_Of_Table_Def(h_table, h_tbs_type) THEN
1214 RAISE e_unexpected_error;
1215 END IF;
1216 ELSE
1217 -- new strategy: b table has a projection table and may be partitioned
1218 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
1219 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1220 IF NOT Create_Copy_Of_Table_Def(h_table, h_tbs_type, h_key_columns_create) THEN
1221 RAISE e_unexpected_error;
1222 END IF;
1223 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_proj_table_name);
1224 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1225 IF NOT Create_Copy_Of_Table_Def(h_proj_table_name, h_tbs_type, h_key_columns_create) THEN
1226 RAISE e_unexpected_error;
1227 END IF;
1228
1229 END IF;
1230 ELSE
1231 h_tbs_type := BSC_APPS.summary_table_tbs_type;
1232
1233 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
1234 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1235 IF NOT Create_Copy_Of_Table_Def(h_table, h_tbs_type) THEN
1236 RAISE e_unexpected_error;
1237 END IF;
1238 END IF;
1239 ELSE
1240 -- BSC-MV architecture. Generation type = -1 means the table does not exists
1241 IF BSC_UPDATE_UTIL.Get_Table_Generation_Type(h_table) <> -1 THEN
1242 IF Is_Input_Table(h_table) THEN
1243 h_tbs_type := BSC_APPS.input_table_tbs_type;
1244
1245 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
1246 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1247 IF NOT Create_Copy_Of_Table_Def(h_table, h_tbs_type) THEN
1248 RAISE e_unexpected_error;
1249 END IF;
1250
1251 -- ENH_B_TABLES_PERF: check if the input table has a rowid table
1252 h_rowid_table_name := Get_RowId_Table_Name(h_table);
1253 IF h_rowid_table_name IS NOT NULL THEN
1254 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_rowid_table_name);
1255 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1256 IF NOT Create_Copy_Of_Table_Def(h_rowid_table_name, h_tbs_type) THEN
1257 RAISE e_unexpected_error;
1258 END IF;
1259 END IF;
1260
1261 ELSIF Is_Base_Table(h_table) THEN
1262 h_tbs_type := BSC_APPS.base_table_tbs_type;
1263
1264 -- ENH_B_TABLES_PERF: check if the base table has a projection table in the source
1265 h_proj_table_name := Get_Proj_Table_Name(h_table);
1266 IF h_proj_table_name IS NULL THEN
1267 -- create the base table in the standard way
1268 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
1269 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1270 IF NOT Create_Copy_Of_Table_Def(h_table, h_tbs_type) THEN
1271 RAISE e_unexpected_error;
1272 END IF;
1273 ELSE
1274 -- new strategy: b table has a projection table and may be partitioned
1275 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
1276 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1277 IF NOT Create_Copy_Of_Table_Def(h_table, h_tbs_type, h_key_columns_create) THEN
1278 RAISE e_unexpected_error;
1279 END IF;
1280 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_proj_table_name);
1281 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1282 IF NOT Create_Copy_Of_Table_Def(h_proj_table_name, h_tbs_type, h_key_columns_create) THEN
1283 RAISE e_unexpected_error;
1284 END IF;
1285 END IF;
1286
1287 ELSE
1288 h_tbs_type := BSC_APPS.summary_table_tbs_type;
1289
1290 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
1291 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1292 IF NOT Create_Copy_Of_Table_Def(h_table, h_tbs_type) THEN
1293 RAISE e_unexpected_error;
1294 END IF;
1295 END IF;
1296 END IF;
1297 END IF;
1298 END LOOP;
1299
1300 -- BSC-MV Note: Create projection tables
1301 IF g_adv_sum_level IS NOT NULL THEN
1302 h_sql := 'SELECT DISTINCT projection_data'||
1303 ' FROM bsc_kpi_data_tables'||
1304 ' WHERE projection_data IS NOT NULL';
1305 OPEN h_cursor FOR h_sql;
1306 LOOP
1307 FETCH h_cursor INTO h_table;
1308 EXIT WHEN h_cursor%NOTFOUND;
1309
1310 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
1311 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1312
1313 IF NOT Create_Copy_Of_Table_Def(h_table, BSC_APPS.summary_table_tbs_type) THEN
1314 RAISE e_unexpected_error;
1315 END IF;
1316 END LOOP;
1317 CLOSE h_cursor;
1318 END IF;
1319
1320 RETURN TRUE;
1321
1322 EXCEPTION
1323 WHEN e_unexpected_error THEN
1324 BSC_MESSAGE.Add (x_message => BSC_APPS.Get_Message('BSC_MIG_FAIL_CREATE_OBJS'),
1325 x_source => 'BSC_MIGRATION.Create_Dynamic_Objects');
1326 RETURN FALSE;
1327
1328 WHEN OTHERS THEN
1329 BSC_MESSAGE.Add (x_message => SQLERRM,
1330 x_source => 'BSC_MIGRATION.Create_Dynamic_Objects');
1331 RETURN FALSE;
1332 END Create_Dynamic_Objects;
1333
1334
1335 /*===========================================================================+
1336 | FUNCTION Create_Indexes_Dynamic_Tables
1337 +============================================================================*/
1338 FUNCTION Create_Indexes_Dynamic_Tables RETURN BOOLEAN IS
1339
1340 e_unexpected_error EXCEPTION;
1341
1342 h_sql VARCHAR2(32700);
1343 TYPE t_cursor IS REF CURSOR;
1344 h_cursor t_cursor;
1345
1346 h_i NUMBER;
1347
1348 h_table VARCHAR2(30);
1349
1350 h_tbs_type VARCHAR2(100);
1351
1352 h_rowid_table_name VARCHAR2(30);
1353 h_proj_table_name VARCHAR2(30);
1354
1355 BEGIN
1356
1357 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_MIG_CREATE_INDEXES'), BSC_APPS.OUTPUT_FILE);
1358
1359 -- Dimension tables
1360 h_sql := 'SELECT level_table_name'||
1361 ' FROM bsc_sys_dim_levels_b';
1362 OPEN h_cursor FOR h_sql;
1363 LOOP
1364 FETCH h_cursor INTO h_table;
1365 EXIT WHEN h_cursor%NOTFOUND;
1366 IF NOT Create_Table_Indexes(h_table, BSC_APPS.dimension_index_tbs_type) THEN
1367 RAISE e_unexpected_error;
1368 END IF;
1369 END LOOP;
1370 CLOSE h_cursor;
1371
1372 -- Dimension input tables
1373 h_sql := 'SELECT table_name'||
1374 ' FROM bsc_db_tables'||
1375 ' WHERE table_type = 2';
1376 OPEN h_cursor FOR h_sql;
1377 LOOP
1378 FETCH h_cursor INTO h_table;
1379 EXIT WHEN h_cursor%NOTFOUND;
1380
1381 IF NOT Create_Table_Indexes(h_table, BSC_APPS.input_index_tbs_type) THEN
1382 RAISE e_unexpected_error;
1383 END IF;
1384 END LOOP;
1385 CLOSE h_cursor;
1386
1387 -- MN Dimension tables
1388 h_sql := 'SELECT DISTINCT relation_col'||
1389 ' FROM bsc_sys_dim_level_rels'||
1390 ' WHERE relation_type = 2';
1391 OPEN h_cursor FOR h_sql;
1392 LOOP
1393 FETCH h_cursor INTO h_table;
1394 EXIT WHEN h_cursor%NOTFOUND;
1395
1396 IF NOT Create_Table_Indexes(h_table, BSC_APPS.dimension_index_tbs_type) THEN
1397 RAISE e_unexpected_error;
1398 END IF;
1399 END LOOP;
1400 CLOSE h_cursor;
1401
1402 -- Data tables
1403 FOR h_i IN 1..g_num_mig_tables LOOP
1404 h_table := g_mig_tables(h_i);
1405
1406 --BSC-MV Note: Create index only for existing tables
1407 IF g_adv_sum_level IS NULL THEN
1408 -- BSC summary tables architecture. All summary tables exists
1409
1410 IF Is_Input_Table(h_table) THEN
1411 h_tbs_type := BSC_APPS.input_index_tbs_type;
1412
1413 IF NOT Create_Table_Indexes(h_table, h_tbs_type) THEN
1414 RAISE e_unexpected_error;
1415 END IF;
1416
1417 -- ENH_B_TABLES_PERF: check if the input table has a rowid table
1418 h_rowid_table_name := Get_RowId_Table_Name(h_table);
1419 IF h_rowid_table_name IS NOT NULL THEN
1420 IF NOT Create_Table_Indexes(h_rowid_table_name, h_tbs_type) THEN
1421 RAISE e_unexpected_error;
1422 END IF;
1423 END IF;
1424
1425 ELSIF Is_Base_Table(h_table) THEN
1426 h_tbs_type := BSC_APPS.base_index_tbs_type;
1427
1428 IF NOT Create_Table_Indexes(h_table, h_tbs_type) THEN
1429 RAISE e_unexpected_error;
1430 END IF;
1431
1432 -- ENH_B_TABLES_PERF: check if the base table has a projection table
1433 h_proj_table_name := Get_Proj_Table_Name(h_table);
1434 IF h_proj_table_name IS NOT NULL THEN
1435 IF NOT Create_Table_Indexes(h_proj_table_name, h_tbs_type) THEN
1436 RAISE e_unexpected_error;
1437 END IF;
1438 END IF;
1439
1440 ELSE
1441 h_tbs_type := BSC_APPS.summary_index_tbs_type;
1442
1443 IF NOT Create_Table_Indexes(h_table, h_tbs_type) THEN
1444 RAISE e_unexpected_error;
1445 END IF;
1446 END IF;
1447
1448 ELSE
1449 -- BSC-MV architecture. Generation type = -1 means the table does not exists
1450 IF BSC_UPDATE_UTIL.Get_Table_Generation_Type(h_table) <> -1 THEN
1451 IF Is_Input_Table(h_table) THEN
1452 h_tbs_type := BSC_APPS.input_index_tbs_type;
1453
1454 IF NOT Create_Table_Indexes(h_table, h_tbs_type) THEN
1455 RAISE e_unexpected_error;
1456 END IF;
1457
1458 -- ENH_B_TABLES_PERF: check if the input table has a rowid table
1459 h_rowid_table_name := Get_RowId_Table_Name(h_table);
1460 IF h_rowid_table_name IS NOT NULL THEN
1461 IF NOT Create_Table_Indexes(h_rowid_table_name, h_tbs_type) THEN
1462 RAISE e_unexpected_error;
1463 END IF;
1464 END IF;
1465
1466 ELSIF Is_Base_Table(h_table) THEN
1467 h_tbs_type := BSC_APPS.base_index_tbs_type;
1468
1469 IF NOT Create_Table_Indexes(h_table, h_tbs_type) THEN
1470 RAISE e_unexpected_error;
1471 END IF;
1472
1473 -- ENH_B_TABLES_PERF: check if the base table has a projection table
1474 h_proj_table_name := Get_Proj_Table_Name(h_table);
1475 IF h_proj_table_name IS NOT NULL THEN
1476 IF NOT Create_Table_Indexes(h_proj_table_name, h_tbs_type) THEN
1477 RAISE e_unexpected_error;
1478 END IF;
1479 END IF;
1480
1481 ELSE
1482 h_tbs_type := BSC_APPS.summary_index_tbs_type;
1483
1484 IF NOT Create_Table_Indexes(h_table, h_tbs_type) THEN
1485 RAISE e_unexpected_error;
1486 END IF;
1487 END IF;
1488 END IF;
1489 END IF;
1490
1491 END LOOP;
1492
1493 -- BSC-MV Note: Create index on projection tables
1494 IF g_adv_sum_level IS NOT NULL THEN
1495 h_sql := 'SELECT DISTINCT projection_data'||
1496 ' FROM bsc_kpi_data_tables'||
1497 ' WHERE projection_data IS NOT NULL';
1498 OPEN h_cursor FOR h_sql;
1499 LOOP
1500 FETCH h_cursor INTO h_table;
1501 EXIT WHEN h_cursor%NOTFOUND;
1502
1503 IF NOT Create_Table_Indexes(h_table, BSC_APPS.summary_index_tbs_type) THEN
1504 RAISE e_unexpected_error;
1505 END IF;
1506 END LOOP;
1507 CLOSE h_cursor;
1508 END IF;
1509
1510 RETURN TRUE;
1511
1512 EXCEPTION
1513 WHEN e_unexpected_error THEN
1514 BSC_MESSAGE.Add (x_message => BSC_APPS.Get_Message('BSC_MIG_FAIL_CREATE_OBJS'),
1515 x_source => 'BSC_MIGRATION.Create_Indexes_Dynamic_Tables');
1516 RETURN FALSE;
1517
1518 WHEN OTHERS THEN
1519 BSC_MESSAGE.Add (x_message => SQLERRM,
1520 x_source => 'BSC_MIGRATION.Create_Indexes_Dynamic_Tables');
1521 RETURN FALSE;
1522 END Create_Indexes_Dynamic_Tables;
1523
1524
1525 /*===========================================================================+
1526 | FUNCTION Analyze_Base_And_Dim_Tables
1527 +============================================================================*/
1528 FUNCTION Analyze_Base_And_Dim_Tables RETURN BOOLEAN IS
1529
1530 h_sql VARCHAR2(32700);
1531 TYPE t_cursor IS REF CURSOR;
1532 h_cursor t_cursor;
1533
1534 h_i NUMBER;
1535
1536 h_table VARCHAR2(30);
1537
1538 BEGIN
1539
1540 -- Dimension tables
1541 h_sql := 'SELECT level_table_name'||
1542 ' FROM bsc_sys_dim_levels_b'||
1543 ' WHERE NVL(source, ''BSC'') = ''BSC''';
1544 OPEN h_cursor FOR h_sql;
1545 LOOP
1546 FETCH h_cursor INTO h_table;
1547 EXIT WHEN h_cursor%NOTFOUND;
1548
1549 BSC_BIA_WRAPPER.Analyze_Table(h_table);
1550 commit;
1551 END LOOP;
1552 CLOSE h_cursor;
1553
1554 -- Base Tables
1555 FOR h_i IN 1..g_num_mig_tables LOOP
1556 h_table := g_mig_tables(h_i);
1557
1558 IF Is_Base_Table(h_table) THEN
1559 BSC_BIA_WRAPPER.Analyze_Table(h_table);
1560 END IF;
1561 END LOOP;
1562
1563 RETURN TRUE;
1564
1565 EXCEPTION
1566 WHEN OTHERS THEN
1567 BSC_MESSAGE.Add (x_message => SQLERRM,
1568 x_source => 'BSC_MIGRATION.Analyze_Base_And_Dim_Tables');
1569 RETURN FALSE;
1570 END Analyze_Base_And_Dim_Tables;
1571
1572
1573 /*===========================================================================+
1574 | FUNCTION Create_Table_Indexes
1575 +============================================================================*/
1576 FUNCTION Create_Table_Indexes(
1577 x_table IN VARCHAR2,
1578 x_tbs_type IN VARCHAR2
1579 ) RETURN BOOLEAN IS
1580
1581 h_storage VARCHAR2(250);
1582 h_initial_extent NUMBER;
1583 h_next_extent NUMBER;
1584 h_max_extents NUMBER;
1585 h_pct_increase NUMBER;
1586
1587 TYPE t_cursor IS REF CURSOR;
1588 h_cursor t_cursor;
1589 h_cursor_i t_cursor;
1590
1591 h_sql VARCHAR2(32700);
1592
1593 h_index_name VARCHAR2(30);
1594 h_index_type VARCHAR2(50);
1595 h_partitioned VARCHAR2(10);
1596 h_uniqueness VARCHAR2(9);
1597 h_column_position NUMBER;
1598 h_column_name VARCHAR2(30);
1599
1600 h_base_message VARCHAR2(4000);
1601 h_message VARCHAR2(4000);
1602
1603 h_lst_columns VARCHAR2(32000);
1604 h_table VARCHAR2(50);
1605 h_count NUMBER;
1606
1607 BEGIN
1608 -- ENH_B_TABLES_PERF: need to enhance this function to take into account bitmap indexes too
1609
1610 h_table := UPPER(x_table);
1611
1612 h_base_message := BSC_APPS.Get_Message('BSC_CREATING_INDEX');
1613
1614 IF NOT g_src_apps_flag THEN
1615 -- The source is Non-Enterprise version
1616 h_sql := 'SELECT index_name, index_type, uniqueness, initial_extent, next_extent, max_extents, pct_increase, partitioned'||
1617 ' FROM user_indexes@'||g_db_link||
1618 ' WHERE table_name = :1';
1619 OPEN h_cursor FOR h_sql USING h_table;
1620 ELSE
1621 -- The source system is Enterprice version (APPS)
1622 h_sql := 'SELECT index_name, index_type, uniqueness, initial_extent, next_extent, max_extents, pct_increase, partitioned'||
1623 ' FROM all_indexes@'||g_db_link||
1624 ' WHERE table_name = :1 AND'||
1625 ' owner = :2';
1626 OPEN h_cursor FOR h_sql USING h_table, g_src_bsc_schema;
1627 END IF;
1628
1629 LOOP
1630 FETCH h_cursor INTO h_index_name, h_index_type, h_uniqueness, h_initial_extent, h_next_extent,
1631 h_max_extents, h_pct_increase, h_partitioned;
1632 EXIT WHEN h_cursor%NOTFOUND;
1633
1634 --Fix bug#4206404: storage parameters may be null
1635 h_storage := NULL;
1636 IF h_initial_extent IS NOT NULL THEN
1637 h_storage := h_storage||' INITIAL '||TO_CHAR(h_initial_extent);
1638 END IF;
1639 --Fix perf bug#4583017: hard-code NEXT 4M
1640 h_storage := h_storage||' NEXT 4M';
1641 --IF h_next_extent IS NOT NULL THEN
1642 -- h_storage := h_storage||' NEXT '||TO_CHAR(h_next_extent);
1643 --END IF;
1644 IF h_max_extents IS NOT NULL THEN
1645 h_storage := h_storage||' MAXEXTENTS '||TO_CHAR(h_max_extents);
1646 END IF;
1647 IF h_pct_increase IS NOT NULL THEN
1648 h_storage := h_storage||' PCTINCREASE '||TO_CHAR(h_pct_increase);
1649 END IF;
1650 IF h_storage IS NOT NULL THEN
1651 h_storage := 'STORAGE ('||h_storage||')';
1652 END IF;
1653
1654 h_message := BSC_APPS.Replace_Token(h_base_message, 'INDEX', h_index_name);
1655 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1656
1657 IF NOT g_src_apps_flag THEN
1658 -- The source is Non-Enterprise version
1659 h_sql := 'SELECT column_position, column_name'||
1660 ' FROM user_ind_columns@'||g_db_link||
1661 ' WHERE index_name = :1'||
1662 ' ORDER BY column_position';
1663 OPEN h_cursor_i FOR h_sql USING h_index_name;
1664 ELSE
1665 -- The source system is Enterprice version (APPS)
1666 h_sql := 'SELECT column_position, column_name'||
1667 ' FROM all_ind_columns@'||g_db_link||
1668 ' WHERE index_name = :1 AND'||
1669 ' index_owner = :2'||
1670 ' ORDER BY column_position';
1671 OPEN h_cursor_i FOR h_sql USING h_index_name, g_src_bsc_schema;
1672 END IF;
1673
1674 h_lst_columns := NULL;
1675
1676 LOOP
1677 FETCH h_cursor_i INTO h_column_position, h_column_name;
1678 EXIT WHEN h_cursor_i%NOTFOUND;
1679
1680 IF h_lst_columns IS NULL THEN
1681 h_lst_columns := h_column_name;
1682 ELSE
1683 h_lst_columns := h_lst_columns||', '||h_column_name;
1684 END IF;
1685
1686 END LOOP;
1687 CLOSE h_cursor_i;
1688
1689 IF h_lst_columns IS NOT NULL THEN
1690 IF h_index_type = 'BITMAP' THEN
1691 h_sql := 'CREATE BITMAP INDEX';
1692 ELSE
1693 IF h_uniqueness = 'UNIQUE' THEN
1694 h_sql := 'CREATE UNIQUE INDEX';
1695 ELSE
1696 h_sql := 'CREATE INDEX';
1697 END IF;
1698 END IF;
1699 -- Fix performance bug#3860149: create index in parallel
1700 -- Fix perf bug#4583017: Use NOLOGGING COMPUTE STATISTICS option
1701 h_sql := h_sql||' '||h_index_name||
1702 ' ON '||x_table||' ('||h_lst_columns||
1703 ')';
1704
1705 --Bug#4769877: need to use LOCAL if the table is partitioned
1706 IF h_index_type = 'BITMAP' THEN
1707 select count(partition_name)
1708 into h_count
1709 from all_tab_partitions
1710 where table_owner = g_src_bsc_schema and table_name = x_table;
1711
1712 IF h_count > 0 THEN
1713 h_sql := h_sql||' LOCAL';
1714 END IF;
1715 END IF;
1716
1717 h_sql := h_sql||' PARALLEL NOLOGGING COMPUTE STATISTICS'||
1718 ' TABLESPACE '||BSC_APPS.Get_Tablespace_Name(x_tbs_type)||' '||h_storage;
1719 BSC_APPS.Do_DDL(h_sql, AD_DDL.CREATE_INDEX, h_index_name);
1720 commit;
1721
1722 -- Fix performance bug#3860149: do not leave the index in parallel
1723 -- Fix perf bug#4583017: Use NOLOGGING option
1724 h_sql := 'ALTER INDEX '||BSC_APPS.bsc_apps_schema||'.'||h_index_name||' NOPARALLEL LOGGING';
1725 BSC_APPS.Execute_Immediate(h_sql);
1726 commit;
1727 END IF;
1728
1729 END LOOP;
1730 CLOSE h_cursor;
1731
1732 RETURN TRUE;
1733
1734 EXCEPTION
1735 WHEN OTHERS THEN
1736 BSC_MESSAGE.Add (x_message => SQLERRM,
1737 x_source => 'BSC_MIGRATION.Create_Table_Indexes');
1738 RETURN FALSE;
1739
1740 END Create_Table_Indexes;
1741
1742
1743 /*===========================================================================+
1744 | FUNCTION Decompose_Numeric_List
1745 +============================================================================*/
1746 FUNCTION Decompose_Numeric_List(
1747 x_string IN VARCHAR2,
1748 x_number_array IN OUT NOCOPY t_array_of_number,
1749 x_separator IN VARCHAR2
1750 ) RETURN NUMBER IS
1751
1752 e_invalid_format EXCEPTION;
1753
1754 h_num_items NUMBER := 0;
1755
1756 h_sub_string VARCHAR2(32700);
1757 h_position NUMBER;
1758
1759 BEGIN
1760
1761 IF x_string IS NOT NULL THEN
1762 h_sub_string := x_string;
1763 h_position := INSTR(h_sub_string, x_separator);
1764
1765 WHILE h_position <> 0 LOOP
1766 h_num_items := h_num_items + 1;
1767 x_number_array(h_num_items) := TO_NUMBER(RTRIM(LTRIM(SUBSTR(h_sub_string, 1, h_position - 1))));
1768
1769 IF x_number_array(h_num_items) IS NULL THEN
1770 RAISE e_invalid_format;
1771 END IF;
1772
1773 h_sub_string := SUBSTR(h_sub_string, h_position + 1);
1774 h_position := INSTR(h_sub_string, x_separator);
1775 END LOOP;
1776
1777 h_num_items := h_num_items + 1;
1778 x_number_array(h_num_items) := TO_NUMBER(RTRIM(LTRIM(h_sub_string)));
1779
1780 IF x_number_array(h_num_items) IS NULL THEN
1781 RAISE e_invalid_format;
1782 END IF;
1783
1784 END IF;
1785
1786 RETURN h_num_items;
1787
1788 EXCEPTION
1789 WHEN e_invalid_format THEN
1790 RETURN (-1);
1791 WHEN OTHERS THEN
1792 RETURN (-1);
1793
1794 END Decompose_Numeric_List;
1795
1796
1797 /*===========================================================================+
1798 | FUNCTION Delete_Metadata_Tables
1799 +============================================================================*/
1800 FUNCTION Delete_Metadata_Tables RETURN BOOLEAN IS
1801
1802 h_i NUMBER;
1803
1804 h_sql VARCHAR2(2000);
1805
1806 h_message VARCHAR2(4000);
1807 h_base_message VARCHAR2(4000);
1808
1809 BEGIN
1810 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_MIG_DELETE_METADATA'), BSC_APPS.OUTPUT_FILE);
1811
1812 h_base_message := BSC_APPS.Get_Message('BSC_DELETING_DATA');
1813
1814 FOR h_i IN 1..g_num_metadata_tables LOOP
1815 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', g_metadata_tables(h_i).table_name);
1816 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1817
1818 -- Fix bug#4430901: Use truncate instead of delete
1819 h_sql := 'TRUNCATE TABLE '||g_metadata_tables(h_i).table_name;
1820 BSC_APPS.Do_DDL(h_sql, AD_DDL.TRUNCATE_TABLE, g_metadata_tables(h_i).table_name);
1821 COMMIT;
1822 END LOOP;
1823
1824 RETURN TRUE;
1825
1826 EXCEPTION
1827 WHEN OTHERS THEN
1828 BSC_MESSAGE.Add (x_message => SQLERRM,
1829 x_source => 'BSC_MIGRATION.Delete_Metadata_Tables');
1830 RETURN FALSE;
1831 END Delete_Metadata_Tables;
1832
1833
1834 /*===========================================================================+
1835 | FUNCTION Drop_Dynamic_Objects
1836 +============================================================================*/
1837 FUNCTION Drop_Dynamic_Objects RETURN BOOLEAN IS
1838
1839 CURSOR c_data_tables IS
1840 SELECT table_name
1841 FROM bsc_db_tables;
1842
1843 CURSOR c_dim_tables IS
1844 SELECT level_table_name, level_view_name, nvl(edw_flag,0)
1845 FROM bsc_sys_dim_levels_b;
1846
1847 CURSOR c_mn_dim_tables IS
1848 SELECT DISTINCT relation_col
1849 FROM bsc_sys_dim_level_rels
1850 WHERE relation_type = 2;
1851
1852 CURSOR c_filter_views IS
1853 SELECT level_view_name
1854 FROM bsc_sys_filters_views;
1855
1856 -- ENH_B_TABLES_PERF: get rowid tables created for input tables
1857 CURSOR c_rowid_tables IS
1858 select bsc_migration.get_rowid_table_name(table_name)
1859 from bsc_db_tables
1860 where table_type = 0;
1861
1862 -- ENH_B_TABLES_PERF: get rowid tables created for input tables
1863 CURSOR c_proj_tables IS
1864 select bsc_migration.get_proj_table_name(table_name)
1865 from bsc_db_tables
1866 where table_type = 1;
1867
1868 h_table VARCHAR2(30);
1869 h_edw_flag NUMBER;
1870 h_view VARCHAR2(30);
1871 h_sql VARCHAR2(32700);
1872 h_base_message VARCHAR2(4000);
1873 h_base_message_v VARCHAR2(4000);
1874 h_message VARCHAR2(4000);
1875 h_mv VARCHAR2(50);
1876 h_uv VARCHAR2(50);
1877
1878 e_unexpected_error EXCEPTION;
1879
1880 TYPE t_cursor IS REF CURSOR;
1881 h_cursor t_cursor;
1882
1883 h_mv_name VARCHAR2(30);
1884 h_error_message_drop_mv VARCHAR2(2000);
1885 e_error_drop_mv EXCEPTION;
1886
1887 BEGIN
1888
1889 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_MIG_DROP_OBJECTS'), BSC_APPS.OUTPUT_FILE);
1890
1891 h_base_message := BSC_APPS.Get_Message('BSC_DROPPING_TABLE');
1892 h_base_message_v := BSC_APPS.Get_Message('BSC_DROPPING_VIEW');
1893
1894 -- Drop dimension tables
1895 -- EDW Note: EDW Dimension tables are materialized views
1896 OPEN c_dim_tables;
1897 FETCH c_dim_tables INTO h_table, h_view, h_edw_flag;
1898 WHILE c_dim_tables%FOUND LOOP
1899 IF h_edw_flag = 0 THEN
1900 -- BSC dimension
1901 IF BSC_APPS.Table_Exists(h_table) THEN
1902 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
1903 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1904
1905 -- Fix perf bug#4583017: do not truncate, just drop.
1906 -- Truncate table to release space --> Bug: DROP TABLE don't release the space immediately
1907 --h_sql := 'TRUNCATE TABLE '||h_table;
1908 --BSC_APPS.Do_DDL(h_sql, AD_DDL.TRUNCATE_TABLE, h_table);
1909
1910 h_sql := 'DROP TABLE '||h_table;
1911 BSC_APPS.Do_DDL(h_sql, AD_DDL.DROP_TABLE, h_table);
1912 END IF;
1913
1914 -- Drop the Vl view
1915 IF BSC_APPS.View_Exists(h_view) THEN
1916 h_message := BSC_APPS.Replace_Token(h_base_message_v, 'VIEW', h_view);
1917 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1918
1919 h_sql := 'DROP VIEW '||h_view;
1920 BSC_APPS.Execute_DDL(h_sql);
1921 END IF;
1922
1923 ELSE
1924 -- EDW dimension
1925 IF BSC_APPS.Object_Exists(h_table) THEN
1926 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
1927 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1928
1929 BSC_INTEGRATION_MV_GEN.Drop_Materialized_View(h_table, 'Y');
1930 IF BSC_APPS.CheckError('BSC_INTEGRATION_MV_GEN.Drop_Materialized_View') THEN
1931 RAISE e_unexpected_error;
1932 END IF;
1933
1934 END IF;
1935
1936 END IF;
1937
1938 FETCH c_dim_tables INTO h_table, h_view, h_edw_flag;
1939 END LOOP;
1940 CLOSE c_dim_tables;
1941
1942 -- Drop mn dimension tables
1943 -- EDW Note: No mn dimensions are from EDW
1944 OPEN c_mn_dim_tables;
1945 FETCH c_mn_dim_tables INTO h_table;
1946 WHILE c_mn_dim_tables%FOUND LOOP
1947 IF BSC_APPS.Table_Exists(h_table) THEN
1948 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
1949 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1950
1951 -- Fix perf bug#4583017: do not truncate, just drop.
1952 -- Truncate table to release space --> Bug: DROP TABLE don't release the space immediately
1953 --h_sql := 'TRUNCATE TABLE '||h_table;
1954 --BSC_APPS.Do_DDL(h_sql, AD_DDL.TRUNCATE_TABLE, h_table);
1955
1956 h_sql := 'DROP TABLE '||h_table;
1957 BSC_APPS.Do_DDL(h_sql, AD_DDL.DROP_TABLE, h_table);
1958 END IF;
1959
1960 FETCH c_mn_dim_tables INTO h_table;
1961 END LOOP;
1962 CLOSE c_mn_dim_tables;
1963
1964 -- Drop filter views
1965 h_base_message := BSC_APPS.Get_Message('BSC_DROPPING_VIEW');
1966
1967 OPEN c_filter_views;
1968 FETCH c_filter_views INTO h_view;
1969 WHILE c_filter_views%FOUND LOOP
1970 IF BSC_APPS.View_Exists(h_view) THEN
1971 h_message := BSC_APPS.Replace_Token(h_base_message, 'VIEW', h_view);
1972 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1973
1974 h_sql := 'DROP VIEW '||h_view;
1975 BSC_APPS.Execute_DDL(h_sql);
1976 END IF;
1977
1978 FETCH c_filter_views INTO h_view;
1979 END LOOP;
1980 CLOSE c_filter_views;
1981
1982 -- Drop data tables (input, base and system tables)
1983 h_base_message := BSC_APPS.Get_Message('BSC_DROPPING_TABLE');
1984
1985 OPEN c_data_tables;
1986 FETCH c_data_tables INTO h_table;
1987 WHILE c_data_tables%FOUND LOOP
1988 IF BSC_APPS.Table_Exists(h_table) THEN
1989 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
1990 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
1991
1992 -- Fix perf bug#4583017: do not truncate, just drop.
1993 -- Truncate table to release space --> Bug: DROP TABLE don't release the space immediately
1994 --h_sql := 'TRUNCATE TABLE '||h_table;
1995 --BSC_APPS.Do_DDL(h_sql, AD_DDL.TRUNCATE_TABLE, h_table);
1996
1997 h_sql := 'DROP TABLE '||h_table;
1998 BSC_APPS.Do_DDL(h_sql, AD_DDL.DROP_TABLE, h_table);
1999 END IF;
2000
2001 -- BSC-MV Note: I am commenting this code. EDW is not supported and
2002 -- this code affect the performance.
2003 -- -- EDW note: I dont know at this point, whether the table is a S, B or I table
2004 -- -- neither if the table is from EDW. So I check if there is a materialized
2005 -- -- view corresponding to this table. In that case I drop the materialize view.
2006 -- h_mv := h_table||'_MV_V';
2007 -- IF BSC_APPS.Object_Exists(h_mv) THEN
2008 -- BSC_INTEGRATION_MV_GEN.Drop_Materialized_View(h_table, 'N');
2009 -- IF BSC_APPS.CheckError('BSC_INTEGRATION_MV_GEN.Drop_Materialized_View') THEN
2010 -- RAISE e_unexpected_error;
2011 -- END IF;
2012 -- END IF;
2013 --
2014 -- -- Same for the union view.
2015 -- h_uv := h_table||'_V';
2016 -- IF BSC_APPS.View_Exists(h_uv) THEN
2017 -- h_sql := 'DROP VIEW '||h_uv;
2018 -- BSC_APPS.Execute_DDL(h_sql);
2019 -- END IF;
2020
2021 FETCH c_data_tables INTO h_table;
2022 END LOOP;
2023 CLOSE c_data_tables;
2024
2025 -- ENH_B_TABLES_PERF: Drop rowid tables created for input tables
2026 OPEN c_rowid_tables;
2027 FETCH c_rowid_tables INTO h_table;
2028 WHILE c_rowid_tables%FOUND LOOP
2029 IF h_table IS NOT NULL THEN
2030 IF BSC_APPS.Table_Exists(h_table) THEN
2031 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
2032 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
2033
2034 h_sql := 'DROP TABLE '||h_table;
2035 BSC_APPS.Do_DDL(h_sql, AD_DDL.DROP_TABLE, h_table);
2036 END IF;
2037 END IF;
2038 FETCH c_rowid_tables INTO h_table;
2039 END LOOP;
2040 CLOSE c_rowid_tables;
2041
2042 -- ENH_B_TABLES_PERF: Drop projection tables created for base tables
2043 OPEN c_proj_tables;
2044 FETCH c_proj_tables INTO h_table;
2045 WHILE c_proj_tables%FOUND LOOP
2046 IF h_table IS NOT NULL THEN
2047 IF BSC_APPS.Table_Exists(h_table) THEN
2048 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
2049 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
2050
2051 h_sql := 'DROP TABLE '||h_table;
2052 BSC_APPS.Do_DDL(h_sql, AD_DDL.DROP_TABLE, h_table);
2053 END IF;
2054 END IF;
2055 FETCH c_proj_tables INTO h_table;
2056 END LOOP;
2057 CLOSE c_proj_tables;
2058
2059 -- BSC-MV Note: Drop all MVs used by the Kpis
2060 h_base_message := BSC_APPS.Get_Message('BSC_DROPPING_VIEW');
2061
2062 h_sql := 'SELECT DISTINCT MV_NAME'||
2063 ' FROM BSC_KPI_DATA_TABLES'||
2064 ' WHERE MV_NAME IS NOT NULL';
2065 OPEN h_cursor FOR h_sql;
2066 LOOP
2067 FETCH h_cursor INTO h_mv_name;
2068 EXIT WHEN h_cursor%NOTFOUND;
2069
2070 h_message := BSC_APPS.Replace_Token(h_base_message, 'VIEW', h_mv_name);
2071 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
2072
2073 IF NOT BSC_BIA_WRAPPER.Drop_Summary_MV(h_mv_name, h_error_message_drop_mv) THEN
2074 RAISE e_error_drop_mv;
2075 END IF;
2076 END LOOP;
2077 CLOSE h_cursor;
2078
2079 -- BSC-MV Note: Also Drop all MV used for targets
2080 h_sql := 'SELECT DISTINCT BSC_BIA_WRAPPER.Get_Sum_Table_MV_Name(SOURCE_TABLE_NAME) MV_NAME'||
2081 ' FROM BSC_DB_TABLES_RELS'||
2082 ' WHERE TABLE_NAME IN ('||
2083 ' SELECT TABLE_NAME'||
2084 ' FROM BSC_KPI_DATA_TABLES'||
2085 ' WHERE TABLE_NAME IS NOT NULL'||
2086 ' ) AND'||
2087 ' RELATION_TYPE = 1';
2088 OPEN h_cursor FOR h_sql;
2089 LOOP
2090 FETCH h_cursor INTO h_mv_name;
2091 EXIT WHEN h_cursor%NOTFOUND;
2092
2093 h_message := BSC_APPS.Replace_Token(h_base_message, 'VIEW', h_mv_name);
2094 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
2095
2096 IF NOT BSC_BIA_WRAPPER.Drop_Summary_MV(h_mv_name, h_error_message_drop_mv) THEN
2097 RAISE e_error_drop_mv;
2098 END IF;
2099
2100 END LOOP;
2101 CLOSE h_cursor;
2102
2103 -- BSC-MV Note: Also drop all the projection tables
2104 h_base_message := BSC_APPS.Get_Message('BSC_DROPPING_TABLE');
2105
2106 h_sql := 'SELECT DISTINCT PROJECTION_DATA'||
2107 ' FROM BSC_KPI_DATA_TABLES'||
2108 ' WHERE PROJECTION_DATA IS NOT NULL';
2109 OPEN h_cursor FOR h_sql;
2110 LOOP
2111 FETCH h_cursor INTO h_table;
2112 EXIT WHEN h_cursor%NOTFOUND;
2113
2114 IF BSC_APPS.Table_Exists(h_table) THEN
2115 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
2116 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
2117
2118 -- Fix perf bug#4583017: do not truncate, just drop.
2119 -- Truncate table to release space --> Bug: DROP TABLE don't release the space immediately
2120 --h_sql := 'TRUNCATE TABLE '||h_table;
2121 --BSC_APPS.Do_DDL(h_sql, AD_DDL.TRUNCATE_TABLE, h_table);
2122
2123 h_sql := 'DROP TABLE '||h_table;
2124 BSC_APPS.Do_DDL(h_sql, AD_DDL.DROP_TABLE, h_table);
2125 END IF;
2126 END LOOP;
2127 CLOSE h_cursor;
2128
2129 RETURN TRUE;
2130
2131 EXCEPTION
2132 WHEN e_unexpected_error THEN
2133 BSC_MESSAGE.Add (x_message => BSC_APPS.Get_Message('BSC_ERROR_DROPPING_OLD_DB_OBJ'),
2134 x_source => 'BSC_MIGRATION.Drop_Dynamic_Objects');
2135 RETURN FALSE;
2136
2137 WHEN e_error_drop_mv THEN
2138 BSC_MESSAGE.Add (x_message => 'BSC_BIA_WRAPPER.Drop_Summary_MV: '||h_mv_name||' '||h_error_message_drop_mv,
2139 x_source => 'BSC_MIGRATION.Drop_Dynamic_Objects');
2140 RETURN FALSE;
2141
2142 WHEN OTHERS THEN
2143 BSC_MESSAGE.Add (x_message => SQLERRM,
2144 x_source => 'BSC_MIGRATION.Drop_Dynamic_Objects');
2145 RETURN FALSE;
2146
2147 END Drop_Dynamic_Objects;
2148
2149
2150 --LOCKING: new function
2151 /*===========================================================================+
2152 | FUNCTION Lock_Migration
2153 +============================================================================*/
2154 FUNCTION Lock_Migration (
2155 x_process_id IN NUMBER,
2156 x_msg_data OUT NOCOPY VARCHAR2
2157 ) RETURN BOOLEAN IS
2158
2159 h_src_responsibilities VARCHAR2(32000) := NULL;
2160 h_trg_responsibilities VARCHAR2(32000) := NULL;
2161 h_tab_filter VARCHAR2(32000) := NULL;
2162 h_kpi_filter VARCHAR2(32000) := NULL;
2163 h_overwrite VARCHAR2(32000) := NULL;
2164 h_adv_mig_features VARCHAR2(32000) := NULL;
2165
2166 h_tabs_filter t_array_of_number; -- array with the tabs in the filter
2167 h_num_tabs_filter NUMBER := 0;
2168 h_kpis_filter t_array_of_number; -- array with the KPIs in the filter
2169 h_num_kpis_filter NUMBER := 0;
2170
2171 h_i NUMBER;
2172 h_sql VARCHAR2(32000);
2173
2174 h_object_key varchar2(30);
2175 h_object_type varchar2(50);
2176 h_lock_type varchar2(1);
2177 h_query_time date;
2178 h_program_id number;
2179 h_user_id number;
2180 h_cascade_lock_level number;
2181
2182 h_return_status VARCHAR2(10);
2183 h_msg_count NUMBER;
2184 h_msg_data VARCHAR2(4000);
2185 e_system_lock EXCEPTION;
2186
2187 BEGIN
2188
2189 --Lock the entire target system
2190 BSC_APPS.Write_Line_Log('Locking Target System:', BSC_APPS.OUTPUT_FILE);
2191 BSC_APPS.Write_Line_Log('Locking the whole system', BSC_APPS.OUTPUT_FILE);
2192 BSC_LOCKS_PUB.Get_System_Lock (
2193 p_program_id => -800,
2194 p_user_id => BSC_APPS.apps_user_id,
2195 x_return_status => h_return_status,
2196 x_msg_count => h_msg_count,
2197 x_msg_data => h_msg_data
2198 );
2199 IF h_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2200 RAISE e_system_lock;
2201 END IF;
2202
2203 --In the source, lock the indicators or scorecards or the whole system according to the filters
2204 -- Get parameters from BSC_DB_LOADER_CONTROL
2205 BSC_APPS.Write_Line_Log('Locking Source System:', BSC_APPS.OUTPUT_FILE);
2206 Get_Migration_Parameters(
2207 p_process_id => x_process_id,
2208 x_src_responsibilities => h_src_responsibilities,
2209 x_trg_responsibilities => h_trg_responsibilities,
2210 x_tab_filter => h_tab_filter,
2211 x_kpi_filter => h_kpi_filter,
2212 x_overwrite => h_overwrite,
2213 x_adv_mig_features => h_adv_mig_features,
2214 x_db_link => g_db_link
2215 );
2216
2217 h_num_tabs_filter := Decompose_Numeric_List(h_tab_filter, h_tabs_filter, ',');
2218 h_num_kpis_filter := Decompose_Numeric_List(h_kpi_filter, h_kpis_filter, ',');
2219
2220 h_sql := 'BEGIN FND_MSG_PUB.Initialize@'||g_db_link||'; END;';
2221 execute immediate h_sql;
2222
2223 h_sql := 'BEGIN BSC_APPS.Init_Bsc_Apps@'||g_db_link||'; END;';
2224 execute immediate h_sql;
2225
2226 h_lock_type := 'W';
2227 h_query_time := SYSDATE;
2228 h_program_id := -800;
2229 -- Fix bug#4873385 get user id for source system
2230 h_user_id := Get_Source_User_Id;
2231 h_cascade_lock_level := 0;
2232
2233 --Lock the scorecards if the migration is by scorecards (it is in cascade mode)
2234 h_object_type := 'SCORECARD';
2235 FOR h_i IN 1..h_num_tabs_filter LOOP
2236 h_object_key := h_tabs_filter(h_i);
2237
2238 BSC_APPS.Write_Line_Log('Locking SCORECARD '||h_object_key, BSC_APPS.OUTPUT_FILE);
2239
2240 h_sql := 'BEGIN BSC_LOCKS_PUB.GET_SYSTEM_LOCK@'||g_db_link||' ('||
2241 ' p_object_key => :1'||
2242 ',p_object_type => :2'||
2243 ',p_lock_type => :3'||
2244 ',p_query_time => :4'||
2245 ',p_program_id => :5'||
2246 ',p_user_id => :6'||
2247 ',p_cascade_lock_level => :7'||
2248 ',x_return_status => :8'||
2249 ',x_msg_count => :9'||
2250 ',x_msg_data => :10); END;';
2251 execute immediate h_sql
2252 using h_object_key, h_object_type, h_lock_type, h_query_time, h_program_id,
2253 h_user_id, h_cascade_lock_level, OUT h_return_status, OUT h_msg_count, OUT h_msg_data;
2254
2255 IF h_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2256 RAISE e_system_lock;
2257 END IF;
2258 END LOOP;
2259
2260 --Lock the kpis if the migration is by kpis (in cascade)
2261 h_object_type := 'OBJECTIVE';
2262 FOR h_i IN 1..h_num_kpis_filter LOOP
2263 h_object_key := h_kpis_filter(h_i);
2264
2265 BSC_APPS.Write_Line_Log('Locking OBJECTIVE '||h_object_key, BSC_APPS.OUTPUT_FILE);
2266
2267 h_sql := 'BEGIN BSC_LOCKS_PUB.GET_SYSTEM_LOCK@'||g_db_link||' ('||
2268 ' p_object_key => :1'||
2269 ',p_object_type => :2'||
2270 ',p_lock_type => :3'||
2271 ',p_query_time => :4'||
2272 ',p_program_id => :5'||
2273 ',p_user_id => :6'||
2274 ',p_cascade_lock_level => :7'||
2275 ',x_return_status => :8'||
2276 ',x_msg_count => :9'||
2277 ',x_msg_data => :10); END;';
2278 execute immediate h_sql
2279 using h_object_key, h_object_type, h_lock_type, h_query_time, h_program_id,
2280 h_user_id, h_cascade_lock_level, OUT h_return_status, OUT h_msg_count, OUT h_msg_data;
2281
2282 IF h_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2283 RAISE e_system_lock;
2284 END IF;
2285 END LOOP;
2286
2287 --Lock the entire source system if there is no filters
2288 IF h_num_kpis_filter = 0 AND h_num_tabs_filter = 0 THEN
2289
2290 BSC_APPS.Write_Line_Log('Locking the whole system', BSC_APPS.OUTPUT_FILE);
2291
2292 h_sql := 'BEGIN BSC_LOCKS_PUB.GET_SYSTEM_LOCK@'||g_db_link||' ('||
2293 'p_program_id => :1'||
2294 ',p_user_id => :2'||
2295 ',x_return_status => :3'||
2296 ',x_msg_count => :4'||
2297 ',x_msg_data => :5); END;';
2298 execute immediate h_sql
2299 using h_program_id, h_user_id, OUT h_return_status, OUT h_msg_count, OUT h_msg_data;
2300
2301 IF h_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2302 RAISE e_system_lock;
2303 END IF;
2304 END IF;
2305
2306 RETURN TRUE;
2307 EXCEPTION
2308 WHEN e_system_lock THEN
2309 x_msg_data := h_msg_data;
2310 RETURN FALSE;
2311 WHEN OTHERS THEN
2312 x_msg_data := SQLERRM;
2313 RETURN FALSE;
2314 END Lock_Migration;
2315
2316
2317 /*===========================================================================+
2318 | PROCEDURE Execute_Migration
2319 +============================================================================*/
2320 PROCEDURE Execute_Migration (
2321 ERRBUF OUT NOCOPY VARCHAR2,
2322 RETCODE OUT NOCOPY VARCHAR2,
2323 x_src_responsibilities IN VARCHAR2,
2324 x_trg_responsibilities IN VARCHAR2,
2325 x_tab_filter IN VARCHAR2,
2326 x_kpi_filter IN VARCHAR2,
2327 x_overwrite IN VARCHAR2
2328 ) IS
2329
2330 e_error EXCEPTION;
2331 e_warning EXCEPTION;
2332 h_count NUMBER;
2333
2334 --LOCKING: new variables
2335 h_return_status VARCHAR2(10);
2336 h_msg_count NUMBER;
2337 h_msg_data VARCHAR2(4000);
2338 e_system_lock EXCEPTION;
2339 h_sql VARCHAR2(32000);
2340 h_null VARCHAR2(1);
2341
2342 h_src_responsibilities VARCHAR2(32000) := NULL;
2343 h_trg_responsibilities VARCHAR2(32000) := NULL;
2344 h_tab_filter VARCHAR2(32000) := NULL;
2345 h_kpi_filter VARCHAR2(32000) := NULL;
2346 h_overwrite VARCHAR2(32000) := NULL;
2347 h_adv_mig_features VARCHAR2(32000) := NULL;
2348
2349 h_source_user_id NUMBER;
2350 h_error_msg VARCHAR2(4000);
2351
2352 BEGIN
2353 -- Initialize BSC/APPS global variables
2354 BSC_APPS.Init_Bsc_Apps;
2355
2356 -- LOCKING: call this api
2357 FND_MSG_PUB.Initialize;
2358
2359 -- Initializes the error message stack
2360 BSC_MESSAGE.Init(g_debug_flag);
2361
2362 -- Initialize the temporal table used for big 'in' conditions
2363 BSC_APPS.Init_Big_In_Cond_Table;
2364
2365 -- Alter session set global_names = false to disable the enforcement
2366 -- of database link name must be equals to remote database name.
2367 h_sql := 'ALTER SESSION SET GLOBAL_NAMES = FALSE';
2368 BSC_APPS.Execute_Immediate(h_sql);
2369
2370 Get_Migration_Parameters(
2371 p_process_id => x_src_responsibilities,
2372 x_src_responsibilities => h_src_responsibilities,
2373 x_trg_responsibilities => h_trg_responsibilities,
2374 x_tab_filter => h_tab_filter,
2375 x_kpi_filter => h_kpi_filter,
2376 x_overwrite => h_overwrite,
2377 x_adv_mig_features => h_adv_mig_features,
2378 x_db_link => g_db_link
2379 );
2380
2381 --LOCKING: Call this api for backward compatibility
2382 BSC_LOCKS_PUB.Get_System_Lock (
2383 p_program_id => -800,
2384 p_user_id => BSC_APPS.apps_user_id,
2385 p_icx_session_id => null,
2386 x_return_status => h_return_status,
2387 x_msg_count => h_msg_count,
2388 x_msg_data => h_msg_data
2389 );
2390 IF h_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2391 RAISE e_system_lock;
2392 END IF;
2393
2394 --Fix bug#4873385 if the user BSC_APPS.apps_user_id does not exists in the source system
2395 -- then we lock the source system with the user ANONYMOUS
2396 h_source_user_id := Get_Source_User_Id;
2397
2398 -- Fix bug#4480209 LOCKING: Need to call this api for backward compatibility
2399 h_sql := 'BEGIN FND_MSG_PUB.Initialize@'||g_db_link||'; END;';
2400 execute immediate h_sql;
2401 h_sql := 'BEGIN BSC_APPS.Init_Bsc_Apps@'||g_db_link||'; END;';
2402 execute immediate h_sql;
2403 h_null := NULL;
2404 h_sql := 'BEGIN BSC_LOCKS_PUB.Get_System_Lock@'||g_db_link||' ('||
2405 'p_program_id => :1,'||
2406 'p_user_id => :2,'||
2407 'p_icx_session_id => :3,'||
2408 'x_return_status => :4,'||
2409 'x_msg_count => :5,'||
2410 'x_msg_data => :6); END;';
2411 -- Fix bug#4648979: Migration should run with iViewer in the source system. Passign new program -802
2412 execute immediate h_sql
2413 using -802, h_source_user_id, h_null, OUT h_return_status, OUT h_msg_count, OUT h_msg_data;
2414 IF h_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2415 RAISE e_system_lock;
2416 END IF;
2417
2418 --LOCKING: Lock the whole target system and the kpis to be migrated in the source
2419 -- note that x_src_responsibilities has the process_id
2420 IF NOT Lock_Migration(x_src_responsibilities, h_msg_data) THEN
2421 RAISE e_system_lock;
2422 END IF;
2423
2424 --LOCKING: Call the autonomous transaction procedure
2425 Migrate_System_AT(x_src_responsibilities,
2426 x_trg_responsibilities,
2427 x_tab_filter,
2428 x_kpi_filter,
2429 x_overwrite);
2430
2431
2432 --LOCKING: Commit to release locks
2433 COMMIT;
2434
2435 SELECT count(*)
2436 INTO h_count
2437 FROM bsc_message_logs
2438 WHERE type = 0
2439 AND UPPER(source) = 'BSC_MIGRATION.MIGRATE_SYSTEM'
2440 AND last_update_login = USERENV('SESSIONID');
2441
2442 IF h_count > 0 THEN
2443 IF NOT g_syncup_done THEN
2444 sync_bis_bsc_metadata(h_error_msg);
2445 END IF;
2446 RAISE e_error;
2447 END IF;
2448
2449 IF g_warnings THEN
2450 IF NOT g_syncup_done THEN
2451 sync_bis_bsc_metadata(h_error_msg);
2452 END IF;
2453 RAISE e_warning;
2454 END IF;
2455
2456 -- LOCKING
2457 BSC_LOCKS_PUB.Remove_System_Lock;
2458
2459 -- Fix bug#4480209: need to call this in the source system too
2460 h_sql := 'BEGIN BSC_LOCKS_PUB.Remove_System_Lock@'||g_db_link||'; END;';
2461 execute immediate h_sql;
2462
2463 EXCEPTION
2464 WHEN e_error THEN
2465 ERRBUF := BSC_APPS.Get_Message('BSC_MIG_FAIL_EXEC');
2466 RETCODE := 2; -- Request completed with errors
2467 -- LOCKING
2468 BSC_LOCKS_PUB.Remove_System_Lock;
2469 -- Fix bug#4624462: need to call this in the source system too
2470 h_sql := 'BEGIN BSC_LOCKS_PUB.Remove_System_Lock@'||g_db_link||'; END;';
2471 execute immediate h_sql;
2472
2473 --LOCKING
2474 WHEN e_system_lock THEN
2475 ERRBUF := h_msg_data;
2476 RETCODE := 2; -- Request completed with errors
2477 -- LOCKING
2478 BSC_LOCKS_PUB.Remove_System_Lock;
2479 -- Fix bug#4624462: need to call this in the source system too
2480 h_sql := 'BEGIN BSC_LOCKS_PUB.Remove_System_Lock@'||g_db_link||'; END;';
2481 execute immediate h_sql;
2482
2483 WHEN e_warning THEN
2484 ERRBUF := '';
2485 RETCODE := 1; -- Request completed with warning
2486 -- LOCKING
2487 BSC_LOCKS_PUB.Remove_System_Lock;
2488 -- Fix bug#4624462: need to call this in the source system too
2489 h_sql := 'BEGIN BSC_LOCKS_PUB.Remove_System_Lock@'||g_db_link||'; END;';
2490 execute immediate h_sql;
2491
2492 WHEN g_error_synch_bsc_pmf THEN
2493 ROLLBACK;
2494 BSC_MESSAGE.flush;
2495 BSC_MESSAGE.Add(x_message => h_error_msg,
2496 x_source => 'BSC_MIGRATION.Migrate_System',
2497 x_mode => 'I');
2498 COMMIT;
2499
2500 BSC_APPS.Write_Errors_To_Log;
2501
2502 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'TIME')||
2503 BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'SYMBOL_COLON')||
2504 ' '||TO_CHAR(SYSDATE, c_fto_long_date_time), BSC_APPS.OUTPUT_FILE);
2505 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_PROGRAM_COMPLETED'), BSC_APPS.OUTPUT_FILE);
2506
2507 ERRBUF := BSC_APPS.Get_Message('BSC_MIG_FAIL_EXEC');
2508 RETCODE := 2; -- Request completed with errors
2509 -- LOCKING
2510 BSC_LOCKS_PUB.Remove_System_Lock;
2511 h_sql := 'BEGIN BSC_LOCKS_PUB.Remove_System_Lock@'||g_db_link||'; END;';
2512 execute immediate h_sql;
2513
2514 WHEN OTHERS THEN
2515 BSC_MESSAGE.Add(x_message => SQLERRM,
2516 x_source => 'BSC_MIGRATION.Execute_Migration',
2517 x_mode => 'I');
2518 COMMIT;
2519
2520 BSC_APPS.Write_Errors_To_Log;
2521
2522 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'TIME')||
2523 BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'SYMBOL_COLON')||
2524 ' '||TO_CHAR(SYSDATE, c_fto_long_date_time), BSC_APPS.OUTPUT_FILE);
2525 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_PROGRAM_COMPLETED'), BSC_APPS.OUTPUT_FILE);
2526
2527
2528 ERRBUF := BSC_UPDATE_UTIL.Get_Message('BSC_UPDATE_PROC_FAILED');
2529 RETCODE := 2; -- Request completed with errors
2530
2531 -- LOCKING
2532 BSC_LOCKS_PUB.Remove_System_Lock;
2533 -- Fix bug#4624462: need to call this in the source system too
2534 h_sql := 'BEGIN BSC_LOCKS_PUB.Remove_System_Lock@'||g_db_link||'; END;';
2535 execute immediate h_sql;
2536
2537 END Execute_Migration;
2538
2539
2540 /*===========================================================================+
2541 | FUNCTION Get_Lst_Table_Columns
2542 +============================================================================*/
2543 FUNCTION Get_Lst_Table_Columns(
2544 x_table IN VARCHAR2
2545 ) RETURN VARCHAR2 IS
2546
2547 h_lst VARCHAR2(32700);
2548 h_column_name VARCHAR2(30);
2549
2550 CURSOR c_columns IS
2551 SELECT column_name
2552 FROM user_tab_columns
2553 WHERE table_name = UPPER(x_table);
2554
2555 CURSOR c_columns_apps IS
2556 SELECT column_name
2557 FROM all_tab_columns
2558 WHERE table_name = UPPER(x_table) AND
2559 owner = UPPER(BSC_APPS.BSC_APPS_SCHEMA);
2560
2561 BEGIN
2562 h_lst := NULL;
2563 IF NOT BSC_APPS.APPS_ENV THEN
2564 -- Personal mode
2565 OPEN c_columns;
2566 FETCH c_columns INTO h_column_name;
2567 WHILE c_columns%FOUND LOOP
2568 IF h_lst IS NOT NULL THEN
2569 h_lst := h_lst||', ';
2570 END IF;
2571
2572 h_lst := h_lst||h_column_name;
2573
2574 FETCH c_columns INTO h_column_name;
2575 END LOOP;
2576 CLOSE c_columns;
2577 ELSE
2578 -- Apps mode
2579 OPEN c_columns_apps;
2580 FETCH c_columns_apps INTO h_column_name;
2581 WHILE c_columns_apps%FOUND LOOP
2582 IF h_lst IS NOT NULL THEN
2583 h_lst := h_lst||', ';
2584 END IF;
2585
2586 h_lst := h_lst||h_column_name;
2587
2588 FETCH c_columns_apps INTO h_column_name;
2589 END LOOP;
2590 CLOSE c_columns_apps;
2591 END IF;
2592
2593 RETURN h_lst;
2594
2595 END Get_Lst_Table_Columns;
2596
2597
2598 /*===========================================================================+
2599 | PROCEDURE Get_Migration_Parameters
2600 +============================================================================*/
2601 PROCEDURE Get_Migration_Parameters(
2602 p_process_id IN VARCHAR2,
2603 x_src_responsibilities IN OUT NOCOPY VARCHAR2,
2604 x_trg_responsibilities IN OUT NOCOPY VARCHAR2,
2605 x_tab_filter IN OUT NOCOPY VARCHAR2,
2606 x_kpi_filter IN OUT NOCOPY VARCHAR2,
2607 x_overwrite IN OUT NOCOPY VARCHAR2,
2608 x_adv_mig_features IN OUT NOCOPY VARCHAR2,
2609 x_db_link IN OUT NOCOPY VARCHAR2
2610 ) IS
2611 TYPE t_cursor IS REF CURSOR;
2612 h_cursor t_cursor;
2613 h_sql VARCHAR2(32000);
2614 h_parameter VARCHAR2(30);
2615 h_parameter_type VARCHAR2(30);
2616 h_parameter_value VARCHAR2(30);
2617
2618 BEGIN
2619 x_src_responsibilities := NULL;
2620 x_trg_responsibilities := NULL;
2621 x_tab_filter := NULL;
2622 x_kpi_filter := NULL;
2623 x_overwrite := NULL;
2624 x_adv_mig_features := NULL;
2625
2626 -- need to sort to get source and target responsibilities in the proper order
2627 h_sql := 'SELECT input_table_name'||
2628 ' FROM bsc_db_loader_control'||
2629 ' WHERE process_id = :1'||
2630 ' ORDER BY input_table_name';
2631
2632 OPEN h_cursor FOR h_sql USING p_process_id;
2633 LOOP
2634 FETCH h_cursor INTO h_parameter;
2635 EXIT WHEN h_cursor%NOTFOUND;
2636
2637 h_parameter_type := SUBSTR(h_parameter, 1, 2);
2638 h_parameter_value := SUBSTR(h_parameter, INSTR(h_parameter, '_') + 1);
2639
2640 IF h_parameter_type = 'SR' THEN
2641 -- source responsibility
2642 IF x_src_responsibilities IS NULL THEN
2643 x_src_responsibilities := h_parameter_value;
2644 ELSE
2645 x_src_responsibilities := x_src_responsibilities||','||h_parameter_value;
2646 END IF;
2647 ELSIF h_parameter_type = 'TR' THEN
2648 -- target responsibility
2649 IF x_trg_responsibilities IS NULL THEN
2650 x_trg_responsibilities := h_parameter_value;
2651 ELSE
2652 x_trg_responsibilities := x_trg_responsibilities||','||h_parameter_value;
2653 END IF;
2654 ELSIF h_parameter_type = 'TF' THEN
2655 -- tab filter
2656 IF x_tab_filter IS NULL THEN
2657 x_tab_filter := h_parameter_value;
2658 ELSE
2659 x_tab_filter := x_tab_filter||','||h_parameter_value;
2660 END IF;
2661 ELSIF h_parameter_type = 'KF' THEN
2662 -- kpi filter
2663 IF x_kpi_filter IS NULL THEN
2664 x_kpi_filter := h_parameter_value;
2665 ELSE
2666 x_kpi_filter := x_kpi_filter||','||h_parameter_value;
2667 END IF;
2668 ELSIF h_parameter_type = 'AF' THEN
2669 -- advanced features
2670 IF h_parameter_value = 'NULL' THEN
2671 x_adv_mig_features := null;
2672 ELSE
2673 x_adv_mig_features := h_parameter_value;
2674 END IF;
2675 ELSIF h_parameter_type = 'DB' THEN
2676 -- database link
2677 x_db_link := h_parameter_value;
2678 ELSE
2679 -- overwrite flag 'OF'
2680 -- It is expected only one record
2681 x_overwrite := h_parameter_value;
2682 END IF;
2683 END LOOP;
2684 CLOSE h_cursor;
2685
2686 END Get_Migration_Parameters;
2687
2688
2689 /*===========================================================================+
2690 | PROCEDURE Init_Invalid_PMF_Objects
2691 +============================================================================*/
2692 PROCEDURE Init_Invalid_PMF_Objects IS
2693
2694 TYPE t_cursor IS REF CURSOR;
2695 h_cursor t_cursor;
2696 h_sql VARCHAR2(20000);
2697
2698 h_pmf VARCHAR2(3) := 'PMF';
2699
2700 h_invalid_measure VARCHAR2(50);
2701 h_invalid_dimension VARCHAR2(50);
2702 h_invalid_dim_level VARCHAR2(50);
2703 h_invalid_kpi NUMBER;
2704
2705 --Fix bug#4226188 : need these new variables
2706 h_bis_dimension_rec BIS_DIMENSION_PUB.Dimension_Rec_Type;
2707 h_error_tbl BIS_UTILITIES_PUB.Error_Tbl_Type;
2708 h_return_status VARCHAR2(1);
2709 h_dgrp_dim VARCHAR2(50);
2710
2711 BEGIN
2712
2713 -- --------------------------------------------------------------------------
2714 -- Get the PMF dimensions (dimension groups) used in the source system that do no exist in
2715 -- the target system
2716
2717 -- Enh#4697749
2718 -- First we are going to migrate all the non-pre-seeded existing source dimensions
2719 -- those are BSC/PMF dimensions created by the customer and not by product teams
2720 -- it will migrate also all the DGRP_% dimensions
2721 Migrate_Custom_PMF_Dimensions;
2722
2723 -- Get all the invalid dimensions. PMF dimensions not existing in the target
2724 g_num_invalid_pmf_dimensions := 0;
2725 h_sql := 'SELECT DISTINCT bsc_d.short_name'||
2726 ' FROM bsc_sys_dim_levels_b@'||g_db_link||' bsc_do,'||
2727 ' bsc_sys_dim_groups_vl@'||g_db_link||' bsc_d,'||
2728 ' bsc_sys_dim_levels_by_group@'||g_db_link||' bsc_dlg,'||
2729 ' bis_dimensions pmf_d'||
2730 ' WHERE bsc_do.dim_level_id = bsc_dlg.dim_level_id AND'||
2731 ' bsc_dlg.dim_group_id = bsc_d.dim_group_id AND'||
2732 ' bsc_do.source = :1 AND'||
2733 ' bsc_d.short_name = pmf_d.short_name(+) AND'||
2734 ' pmf_d.short_name IS NULL';
2735 OPEN h_cursor FOR h_sql USING h_pmf;
2736 LOOP
2737 FETCH h_cursor INTO h_invalid_dimension;
2738 EXIT WHEN h_cursor%NOTFOUND;
2739
2740 g_num_invalid_pmf_dimensions := g_num_invalid_pmf_dimensions + 1;
2741 g_invalid_pmf_dimensions(g_num_invalid_pmf_dimensions) := h_invalid_dimension;
2742 END LOOP;
2743 CLOSE h_cursor;
2744
2745 -- Get indicators using those invalid dimensions
2746 h_sql := 'SELECT DISTINCT k.indicator'||
2747 ' FROM bsc_kpi_dim_groups@'||g_db_link||' k,'||
2748 ' bsc_sys_dim_levels_b@'||g_db_link||' bsc_do,'||
2749 ' bsc_sys_dim_groups_vl@'||g_db_link||' bsc_d,'||
2750 ' bsc_sys_dim_levels_by_group@'||g_db_link||' bsc_dlg,'||
2751 ' bis_dimensions pmf_d'||
2752 ' WHERE k.dim_group_id = bsc_d.dim_group_id AND'||
2753 ' bsc_do.dim_level_id = bsc_dlg.dim_level_id AND'||
2754 ' bsc_dlg.dim_group_id = bsc_d.dim_group_id AND'||
2755 ' bsc_do.source = :1 AND'||
2756 ' bsc_d.short_name = pmf_d.short_name(+) AND'||
2757 ' pmf_d.short_name IS NULL';
2758 OPEN h_cursor FOR h_sql USING h_pmf;
2759 LOOP
2760 FETCH h_cursor INTO h_invalid_kpi;
2761 EXIT WHEN h_cursor%NOTFOUND;
2762
2763 IF NOT Item_Belong_To_Array_Number(h_invalid_kpi, g_invalid_kpis, g_num_invalid_kpis) THEN
2764 g_num_invalid_kpis := g_num_invalid_kpis + 1;
2765 g_invalid_kpis(g_num_invalid_kpis) := h_invalid_kpi;
2766 END IF;
2767 END LOOP;
2768 CLOSE h_cursor;
2769
2770 -- ---------------------------------------------------------------------
2771 -- Get the PMF dimension levels used in the source system that do no exist in
2772 -- the target system
2773
2774 -- Enh#4697749
2775 -- First we are going to migrate all the non-pre-seeded existing source dimension levels
2776 -- those are BSC/PMF dimension levels created by the customer and not by product teams
2777 Migrate_Custom_PMF_Dim_Levels;
2778
2779 -- Get all the invalid dimension levels. PMF dimension levels not existing in the target
2780 g_num_invalid_pmf_dim_levels := 0;
2781 h_sql := 'SELECT DISTINCT bsc_dl.short_name'||
2782 ' FROM bsc_sys_dim_levels_b@'||g_db_link||' bsc_dl, bis_levels pmf_dl'||
2783 ' WHERE bsc_dl.source = :1 AND'||
2784 ' bsc_dl.short_name = pmf_dl.short_name(+) AND'||
2785 ' pmf_dl.short_name IS NULL';
2786 OPEN h_cursor FOR h_sql USING h_pmf;
2787 LOOP
2788 FETCH h_cursor INTO h_invalid_dim_level;
2789 EXIT WHEN h_cursor%NOTFOUND;
2790
2791 g_num_invalid_pmf_dim_levels := g_num_invalid_pmf_dim_levels + 1;
2792 g_invalid_pmf_dim_levels(g_num_invalid_pmf_dim_levels) := h_invalid_dim_level;
2793 END LOOP;
2794 CLOSE h_cursor;
2795
2796 -- Get indicators using those invalid dimension levels
2797 h_sql := 'SELECT DISTINCT k.indicator'||
2798 ' FROM bsc_kpi_dim_levels_b@'||g_db_link||' k,'||
2799 ' bsc_sys_dim_levels_b@'||g_db_link||' bsc_dl,'||
2800 ' bis_levels pmf_dl'||
2801 ' WHERE k.level_table_name = bsc_dl.level_table_name AND'||
2802 ' bsc_dl.source = :1 AND'||
2803 ' bsc_dl.short_name = pmf_dl.short_name(+) AND'||
2804 ' pmf_dl.short_name IS NULL';
2805 OPEN h_cursor FOR h_sql USING h_pmf;
2806 LOOP
2807 FETCH h_cursor INTO h_invalid_kpi;
2808 EXIT WHEN h_cursor%NOTFOUND;
2809
2810 IF NOT Item_Belong_To_Array_Number(h_invalid_kpi, g_invalid_kpis, g_num_invalid_kpis) THEN
2811 g_num_invalid_kpis := g_num_invalid_kpis + 1;
2812 g_invalid_kpis(g_num_invalid_kpis) := h_invalid_kpi;
2813 END IF;
2814 END LOOP;
2815 CLOSE h_cursor;
2816
2817 -- ---------------------------------------------------------------------
2818 -- Get the PMF measures used in the source system that do no exist in
2819 -- the target system
2820
2821 -- Enh#4697749
2822 -- First we are going to migrate all the non-pre-seeded existing source measures
2823 -- those are BSC/PMF measures created by the customer and not by product teams
2824 Migrate_Custom_PMF_Measures;
2825
2826 -- Get all the invalid measures. PMF measures not existing in the target
2827 g_num_invalid_pmf_measures := 0;
2828 h_sql := 'SELECT DISTINCT bsc_m.short_name'||
2829 ' FROM bsc_sys_measures@'||g_db_link||' bsc_m, bis_indicators pmf_m'||
2830 ' WHERE bsc_m.source = :1 AND'||
2831 ' bsc_m.short_name = pmf_m.short_name(+) AND'||
2832 ' pmf_m.short_name IS NULL';
2833 OPEN h_cursor FOR h_sql USING h_pmf;
2834 LOOP
2835 FETCH h_cursor INTO h_invalid_measure;
2836 EXIT WHEN h_cursor%NOTFOUND;
2837
2838 g_num_invalid_pmf_measures := g_num_invalid_pmf_measures + 1;
2839 g_invalid_pmf_measures(g_num_invalid_pmf_measures) := h_invalid_measure;
2840 END LOOP;
2841 CLOSE h_cursor;
2842
2843 -- Get indicators using those invalid measures
2844 --Fix bug#4932663 remove this line
2845 --g_num_invalid_kpis := 0;
2846
2847 h_sql := 'SELECT DISTINCT k.indicator'||
2848 ' FROM bsc_kpi_analysis_measures_b@'||g_db_link||' k,'||
2849 ' bsc_sys_datasets_b@'||g_db_link||' d,'||
2850 ' bsc_sys_measures@'||g_db_link||' m,'||
2851 ' bis_indicators i'||
2852 ' WHERE k.dataset_id = d.dataset_id AND'||
2853 ' d.measure_id1 = m.measure_id AND'||
2854 ' m.source = :1 AND'||
2855 ' m.short_name = i.short_name (+) AND'||
2856 ' i.short_name IS NULL';
2857 OPEN h_cursor FOR h_sql USING h_pmf;
2858 LOOP
2859 FETCH h_cursor INTO h_invalid_kpi;
2860 EXIT WHEN h_cursor%NOTFOUND;
2861
2862 g_num_invalid_kpis := g_num_invalid_kpis + 1;
2863 g_invalid_kpis(g_num_invalid_kpis) := h_invalid_kpi;
2864 END LOOP;
2865 CLOSE h_cursor;
2866
2867 -- ---------------------------------------------------------------------------
2868 -- Fix bug#4226188: This is a new validation. We want to get the dimensions used by the measures
2869 -- that not exists in the target
2870 h_sql := 'SELECT DISTINCT d.short_name'||
2871 ' FROM bis_indicator_dimensions@'||g_db_link||' id,'||
2872 ' bis_indicators@'||g_db_link||' i,'||
2873 ' bis_dimensions@'||g_db_link||' d,'||
2874 ' bis_dimensions td'||
2875 ' WHERE i.indicator_id = id.indicator_id AND'||
2876 ' d.dimension_id = id.dimension_id AND'||
2877 ' td.short_name = d.short_name(+) AND '||
2878 ' td.short_name IS NULL';
2879 OPEN h_cursor FOR h_sql;
2880 LOOP
2881 FETCH h_cursor INTO h_invalid_dimension;
2882 EXIT WHEN h_cursor%NOTFOUND;
2883
2884 IF NOT Item_Belong_To_Array_Varchar2(h_invalid_dimension, g_invalid_pmf_dimensions, g_num_invalid_pmf_dimensions) THEN
2885 g_num_invalid_pmf_dimensions := g_num_invalid_pmf_dimensions + 1;
2886 g_invalid_pmf_dimensions(g_num_invalid_pmf_dimensions) := h_invalid_dimension;
2887 END IF;
2888 END LOOP;
2889 CLOSE h_cursor;
2890
2891 --Fix bug#4226188: Now get the indicators using PMF measures whose dimensions does not exists in the target
2892 h_sql := 'SELECT DISTINCT k.indicator'||
2893 ' FROM bsc_kpi_analysis_measures_b@'||g_db_link||' k,'||
2894 ' bsc_sys_datasets_b@'||g_db_link||' d,'||
2895 ' bsc_sys_measures@'||g_db_link||' m,'||
2896 ' bis_indicator_dimensions@'||g_db_link||' id,'||
2897 ' bis_indicators@'||g_db_link||' i,'||
2898 ' bis_dimensions@'||g_db_link||' sd,'||
2899 ' bis_dimensions td'||
2900 ' WHERE k.dataset_id = d.dataset_id AND'||
2901 ' d.measure_id1 = m.measure_id AND'||
2902 ' m.source = :1 AND'||
2903 ' m.short_name = i.short_name AND'||
2904 ' i.indicator_id = id.indicator_id AND'||
2905 ' sd.dimension_id = id.dimension_id AND'||
2906 ' td.short_name = sd.short_name(+) AND'||
2907 ' td.short_name IS NULL';
2908 OPEN h_cursor FOR h_sql USING h_pmf;
2909 LOOP
2910 FETCH h_cursor INTO h_invalid_kpi;
2911 EXIT WHEN h_cursor%NOTFOUND;
2912
2913 IF NOT Item_Belong_To_Array_Number(h_invalid_kpi, g_invalid_kpis, g_num_invalid_kpis) THEN
2914 g_num_invalid_kpis := g_num_invalid_kpis + 1;
2915 g_invalid_kpis(g_num_invalid_kpis) := h_invalid_kpi;
2916 END IF;
2917 END LOOP;
2918 CLOSE h_cursor;
2919
2920 END Init_Invalid_PMF_Objects;
2921
2922
2923 /*===========================================================================+
2924 | PROCEDURE Init_Metadata_Tables_Array
2925 +============================================================================*/
2926 PROCEDURE Init_Metadata_Tables_Array IS
2927 BEGIN
2928 g_num_metadata_tables := 0;
2929
2930 g_num_metadata_tables := g_num_metadata_tables + 1;
2931 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_BIS_MEASURES_DATA';
2932 g_metadata_tables(g_num_metadata_tables).level := 0;
2933 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
2934 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
2935 g_metadata_tables(g_num_metadata_tables).copy_flag := FALSE;
2936 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
2937
2938 g_num_metadata_tables := g_num_metadata_tables + 1;
2939 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_DB_CALCULATIONS';
2940 g_metadata_tables(g_num_metadata_tables).level := 3;
2941 g_metadata_tables(g_num_metadata_tables).level_column := 'TABLE_NAME';
2942 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
2943 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
2944 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
2945
2946 g_num_metadata_tables := g_num_metadata_tables + 1;
2947 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_DB_CALENDAR';
2948 g_metadata_tables(g_num_metadata_tables).level := 0;
2949 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
2950 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
2951 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
2952 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
2953
2954 g_num_metadata_tables := g_num_metadata_tables + 1;
2955 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_DB_LOADER_CONTROL';
2956 g_metadata_tables(g_num_metadata_tables).level := 0;
2957 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
2958 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
2959 g_metadata_tables(g_num_metadata_tables).copy_flag := FALSE;
2960 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
2961
2962 g_num_metadata_tables := g_num_metadata_tables + 1;
2963 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_DB_MEASURE_COLS_TL';
2964 g_metadata_tables(g_num_metadata_tables).level := 0;
2965 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
2966 -- Bug#2977516 We need to migrate all rows in BSC_DB_MEASURE_COLS_TL
2967 -- There are valid cases were a column is in BSC_DB_MEASURE_COLS_TL and not in BSC_SYS_MEASURES:
2968 -- 1. Internal columns
2969 -- 2. Measures renamed as formulas
2970 --g_metadata_tables(g_num_metadata_tables).level_condition := 'MEASURE_COL IN ('||
2971 -- ' SELECT MEASURE_COL'||
2972 -- ' FROM BSC_SYS_MEASURES@'||g_db_link||
2973 -- ' WHERE NVL(EDW_FLAG,0) = 0)';
2974 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
2975 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
2976 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
2977
2978 g_num_metadata_tables := g_num_metadata_tables + 1;
2979 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_DB_MEASURE_GROUPS_TL';
2980 g_metadata_tables(g_num_metadata_tables).level := 0;
2981 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
2982 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
2983 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
2984 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
2985
2986 g_num_metadata_tables := g_num_metadata_tables + 1;
2987 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_DB_PROCESS_CONTROL';
2988 g_metadata_tables(g_num_metadata_tables).level := 0;
2989 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
2990 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
2991 g_metadata_tables(g_num_metadata_tables).copy_flag := FALSE;
2992 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
2993
2994 g_num_metadata_tables := g_num_metadata_tables + 1;
2995 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_DB_RESERVED_WORDS';
2996 g_metadata_tables(g_num_metadata_tables).level := 0;
2997 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
2998 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
2999 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3000 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3001
3002 -- This table will copy data tables according to the kpis being migrated.
3003 g_num_metadata_tables := g_num_metadata_tables + 1;
3004 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_DB_TABLES';
3005 g_metadata_tables(g_num_metadata_tables).level := 3;
3006 g_metadata_tables(g_num_metadata_tables).level_column := 'TABLE_NAME';
3007 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3008 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3009 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3010
3011 -- This is for input tables for dimensions which are system level objects
3012 g_num_metadata_tables := g_num_metadata_tables + 1;
3013 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_DB_TABLES';
3014 g_metadata_tables(g_num_metadata_tables).level := 0;
3015 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3016 g_metadata_tables(g_num_metadata_tables).level_condition := 'TABLE_TYPE = 2';
3017 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3018 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3019
3020 g_num_metadata_tables := g_num_metadata_tables + 1;
3021 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_DB_TABLES_COLS';
3022 g_metadata_tables(g_num_metadata_tables).level := 3;
3023 g_metadata_tables(g_num_metadata_tables).level_column := 'TABLE_NAME';
3024 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3025 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3026 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3027
3028 -- This table will copy relationships between DATA tables
3029 -- according to the kpis being migrated
3030 g_num_metadata_tables := g_num_metadata_tables + 1;
3031 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_DB_TABLES_RELS';
3032 g_metadata_tables(g_num_metadata_tables).level := 3;
3033 g_metadata_tables(g_num_metadata_tables).level_column := 'TABLE_NAME';
3034 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3035 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3036 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3037
3038 -- This is for relations between dimension tables and input tables which are system level objects
3039 g_num_metadata_tables := g_num_metadata_tables + 1;
3040 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_DB_TABLES_RELS';
3041 g_metadata_tables(g_num_metadata_tables).level := 0;
3042 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3043 g_metadata_tables(g_num_metadata_tables).level_condition := 'TABLE_NAME IN ('||
3044 ' SELECT LEVEL_TABLE_NAME'||
3045 ' FROM BSC_SYS_DIM_LEVELS_B@'||g_db_link||')';
3046 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3047 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3048
3049 -- Add for bug#2728248
3050 -- This is for relations between MN dimension tables and its input tables which are system level objects
3051 g_num_metadata_tables := g_num_metadata_tables + 1;
3052 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_DB_TABLES_RELS';
3053 g_metadata_tables(g_num_metadata_tables).level := 0;
3054 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3055 g_metadata_tables(g_num_metadata_tables).level_condition := 'TABLE_NAME IN ('||
3056 ' SELECT RELATION_COL'||
3057 ' FROM BSC_SYS_DIM_LEVEL_RELS@'||g_db_link||
3058 ' WHERE RELATION_TYPE = 2)';
3059 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3060 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3061
3062 g_num_metadata_tables := g_num_metadata_tables + 1;
3063 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_DB_VALIDATION';
3064 g_metadata_tables(g_num_metadata_tables).level := 0;
3065 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3066 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3067 g_metadata_tables(g_num_metadata_tables).copy_flag := FALSE;
3068 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3069
3070 g_num_metadata_tables := g_num_metadata_tables + 1;
3071 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_DB_WEEK_MAPS';
3072 g_metadata_tables(g_num_metadata_tables).level := 0;
3073 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3074 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3075 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3076 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3077
3078 g_num_metadata_tables := g_num_metadata_tables + 1;
3079 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_CALENDARS_B';
3080 g_metadata_tables(g_num_metadata_tables).level := 0;
3081 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3082 g_metadata_tables(g_num_metadata_tables).level_condition := 'NVL(EDW_FLAG, 0) = 0';
3083 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3084 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3085
3086 g_num_metadata_tables := g_num_metadata_tables + 1;
3087 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_CALENDARS_TL';
3088 g_metadata_tables(g_num_metadata_tables).level := 0;
3089 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3090 g_metadata_tables(g_num_metadata_tables).level_condition := 'CALENDAR_ID IN ('||
3091 ' SELECT CALENDAR_ID'||
3092 ' FROM BSC_SYS_CALENDARS_B@'||g_db_link||
3093 ' WHERE NVL(EDW_FLAG,0) = 0)';
3094 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3095 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3096
3097 g_num_metadata_tables := g_num_metadata_tables + 1;
3098 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_EDW_CALENDAR_TYPE_TL';
3099 g_metadata_tables(g_num_metadata_tables).level := 0;
3100 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3101 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3102 g_metadata_tables(g_num_metadata_tables).copy_flag := FALSE;
3103 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3104
3105 g_num_metadata_tables := g_num_metadata_tables + 1;
3106 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_EDW_PERIODS_TL';
3107 g_metadata_tables(g_num_metadata_tables).level := 0;
3108 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3109 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3110 g_metadata_tables(g_num_metadata_tables).copy_flag := FALSE;
3111 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3112
3113 g_num_metadata_tables := g_num_metadata_tables + 1;
3114 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPIS_B';
3115 g_metadata_tables(g_num_metadata_tables).level := 2;
3116 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3117 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3118 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3119 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3120
3121 g_num_metadata_tables := g_num_metadata_tables + 1;
3122 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPIS_TL';
3123 g_metadata_tables(g_num_metadata_tables).level := 2;
3124 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3125 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3126 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3127 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3128
3129 g_num_metadata_tables := g_num_metadata_tables + 1;
3130 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_ANALYSIS_GROUPS';
3131 g_metadata_tables(g_num_metadata_tables).level := 2;
3132 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3133 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3134 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3135 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3136
3137 g_num_metadata_tables := g_num_metadata_tables + 1;
3138 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_ANALYSIS_MEASURES_B';
3139 g_metadata_tables(g_num_metadata_tables).level := 2;
3140 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3141 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3142 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3143 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3144
3145 g_num_metadata_tables := g_num_metadata_tables + 1;
3146 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_ANALYSIS_MEASURES_TL';
3147 g_metadata_tables(g_num_metadata_tables).level := 2;
3148 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3149 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3150 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3151 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3152
3153 g_num_metadata_tables := g_num_metadata_tables + 1;
3154 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_ANALYSIS_OPT_USER';
3155 g_metadata_tables(g_num_metadata_tables).level := 0;
3156 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3157 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3158 g_metadata_tables(g_num_metadata_tables).copy_flag := FALSE;
3159 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3160
3161 g_num_metadata_tables := g_num_metadata_tables + 1;
3162 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_ANALYSIS_OPTIONS_B';
3163 g_metadata_tables(g_num_metadata_tables).level := 2;
3164 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3165 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3166 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3167 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3168
3169 g_num_metadata_tables := g_num_metadata_tables + 1;
3170 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_ANALYSIS_OPTIONS_TL';
3171 g_metadata_tables(g_num_metadata_tables).level := 2;
3172 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3173 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3174 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3175 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3176
3177 g_num_metadata_tables := g_num_metadata_tables + 1;
3178 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_CALCULATIONS';
3179 g_metadata_tables(g_num_metadata_tables).level := 2;
3180 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3181 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3182 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3183 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3184
3185 g_num_metadata_tables := g_num_metadata_tables + 1;
3186 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_CALCULATIONS_USER';
3187 g_metadata_tables(g_num_metadata_tables).level := 0;
3188 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3189 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3190 g_metadata_tables(g_num_metadata_tables).copy_flag := FALSE;
3191 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3192
3193 g_num_metadata_tables := g_num_metadata_tables + 1;
3194 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_CAUSE_EFFECT_RELS';
3195 g_metadata_tables(g_num_metadata_tables).level := 0;
3196 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3197 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3198 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3199 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3200
3201 g_num_metadata_tables := g_num_metadata_tables + 1;
3202 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_COMMENTS';
3203 g_metadata_tables(g_num_metadata_tables).level := 2;
3204 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3205 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3206 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3207 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3208
3209 g_num_metadata_tables := g_num_metadata_tables + 1;
3210 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_DATA_TABLES';
3211 g_metadata_tables(g_num_metadata_tables).level := 2;
3212 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3213 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3214 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3215 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3216
3217 g_num_metadata_tables := g_num_metadata_tables + 1;
3218 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_DEFAULTS_B';
3219 g_metadata_tables(g_num_metadata_tables).level := 2;
3220 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3221 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3222 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3223 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3224
3225 g_num_metadata_tables := g_num_metadata_tables + 1;
3226 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_DEFAULTS_TL';
3227 g_metadata_tables(g_num_metadata_tables).level := 2;
3228 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3229 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3230 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3231 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3232
3233 g_num_metadata_tables := g_num_metadata_tables + 1;
3234 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_DIM_GROUPS';
3235 g_metadata_tables(g_num_metadata_tables).level := 2;
3236 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3237 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3238 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3239 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3240
3241 g_num_metadata_tables := g_num_metadata_tables + 1;
3242 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_DIM_LEVELS_B';
3243 g_metadata_tables(g_num_metadata_tables).level := 2;
3244 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3245 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3246 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3247 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3248
3249 g_num_metadata_tables := g_num_metadata_tables + 1;
3250 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_DIM_LEVELS_TL';
3251 g_metadata_tables(g_num_metadata_tables).level := 2;
3252 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3253 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3254 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3255 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3256
3257 g_num_metadata_tables := g_num_metadata_tables + 1;
3258 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_DIM_LEVELS_USER';
3259 g_metadata_tables(g_num_metadata_tables).level := 0;
3260 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3261 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3262 g_metadata_tables(g_num_metadata_tables).copy_flag := FALSE;
3263 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3264
3265 g_num_metadata_tables := g_num_metadata_tables + 1;
3266 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_DIM_LEVEL_PROPERTIES';
3267 g_metadata_tables(g_num_metadata_tables).level := 2;
3268 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3269 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3270 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3271 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3272
3273 g_num_metadata_tables := g_num_metadata_tables + 1;
3274 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_DIM_SETS_TL';
3275 g_metadata_tables(g_num_metadata_tables).level := 2;
3276 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3277 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3278 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3279 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3280
3281 g_num_metadata_tables := g_num_metadata_tables + 1;
3282 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_GRAPHS';
3283 g_metadata_tables(g_num_metadata_tables).level := 0;
3284 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3285 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3286 g_metadata_tables(g_num_metadata_tables).copy_flag := FALSE;
3287 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3288
3289 g_num_metadata_tables := g_num_metadata_tables + 1;
3290 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_MM_CONTROLS';
3291 g_metadata_tables(g_num_metadata_tables).level := 2;
3292 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3293 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3294 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3295 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3296
3297 g_num_metadata_tables := g_num_metadata_tables + 1;
3298 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_PERIODICITIES';
3299 g_metadata_tables(g_num_metadata_tables).level := 2;
3300 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3301 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3302 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3303 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3304
3305 g_num_metadata_tables := g_num_metadata_tables + 1;
3306 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_PERIODICITIES_USER';
3307 g_metadata_tables(g_num_metadata_tables).level := 0;
3308 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3309 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3310 g_metadata_tables(g_num_metadata_tables).copy_flag := FALSE;
3311 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3312
3313 g_num_metadata_tables := g_num_metadata_tables + 1;
3314 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_PROPERTIES';
3315 g_metadata_tables(g_num_metadata_tables).level := 2;
3316 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3317 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3318 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3319 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3320
3321 g_num_metadata_tables := g_num_metadata_tables + 1;
3322 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_SERIES_COLORS';
3323 g_metadata_tables(g_num_metadata_tables).level := 2;
3324 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3325 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3326 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3327 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3328
3329 g_num_metadata_tables := g_num_metadata_tables + 1;
3330 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_SHELL_CMDS_TL';
3331 g_metadata_tables(g_num_metadata_tables).level := 2;
3332 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3333 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3334 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3335 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3336
3337 g_num_metadata_tables := g_num_metadata_tables + 1;
3338 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_SHELL_CMDS_USER';
3339 g_metadata_tables(g_num_metadata_tables).level := 0;
3340 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3341 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3342 g_metadata_tables(g_num_metadata_tables).copy_flag := FALSE;
3343 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3344
3345 g_num_metadata_tables := g_num_metadata_tables + 1;
3346 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_SUBTITLES_TL';
3347 g_metadata_tables(g_num_metadata_tables).level := 2;
3348 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3349 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3350 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3351 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3352
3353 g_num_metadata_tables := g_num_metadata_tables + 1;
3354 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_TREE_NODES_B';
3355 g_metadata_tables(g_num_metadata_tables).level := 2;
3356 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3357 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3358 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3359 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3360
3361 g_num_metadata_tables := g_num_metadata_tables + 1;
3362 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_TREE_NODES_TL';
3363 g_metadata_tables(g_num_metadata_tables).level := 2;
3364 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3365 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3366 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3367 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3368
3369 --BSC-MV Note: This table is part of ODF, so we can migrate even in old architecture
3370 g_num_metadata_tables := g_num_metadata_tables + 1;
3371 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_REPORTING_CALENDAR';
3372 g_metadata_tables(g_num_metadata_tables).level := 0;
3373 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3374 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3375 -- Fix bug#4873669: bsc_reporting_calendar is partitioned now. We are not going to
3376 -- copy the data from source. We are going to call populate_reporting_calendar
3377 -- later.
3378 g_metadata_tables(g_num_metadata_tables).copy_flag := FALSE; --TRUE;
3379 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3380
3381 g_num_metadata_tables := g_num_metadata_tables + 1;
3382 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_BENCHMARKS_B';
3383 g_metadata_tables(g_num_metadata_tables).level := 0;
3384 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3385 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3386 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3387 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3388
3389 g_num_metadata_tables := g_num_metadata_tables + 1;
3390 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_BENCHMARKS_TL';
3391 g_metadata_tables(g_num_metadata_tables).level := 0;
3392 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3393 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3394 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3395 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3396
3397 g_num_metadata_tables := g_num_metadata_tables + 1;
3398 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_BM_GROUPS';
3399 g_metadata_tables(g_num_metadata_tables).level := 0;
3400 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3401 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3402 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3403 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3404
3405 g_num_metadata_tables := g_num_metadata_tables + 1;
3406 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_CALCULATIONS';
3407 g_metadata_tables(g_num_metadata_tables).level := 0;
3408 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3409 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3410 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3411 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3412
3413 g_num_metadata_tables := g_num_metadata_tables + 1;
3414 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_COM_DIM_LEVELS';
3415 g_metadata_tables(g_num_metadata_tables).level := 1;
3416 g_metadata_tables(g_num_metadata_tables).level_column := 'TAB_ID';
3417 g_metadata_tables(g_num_metadata_tables).level_condition := 'DIM_LEVEL_ID IN ('||
3418 ' SELECT DIM_LEVEL_ID'||
3419 ' FROM BSC_SYS_DIM_LEVELS_B@'||g_db_link||
3420 ' WHERE NVL(EDW_FLAG,0) = 0)';
3421 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3422 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3423
3424 g_num_metadata_tables := g_num_metadata_tables + 1;
3425 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_DATASETS_B';
3426 g_metadata_tables(g_num_metadata_tables).level := 0;
3427 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3428 g_metadata_tables(g_num_metadata_tables).level_condition := 'NVL(EDW_FLAG, 0) = 0';
3429 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3430 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3431
3432 g_num_metadata_tables := g_num_metadata_tables + 1;
3433 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_DATASETS_TL';
3434 g_metadata_tables(g_num_metadata_tables).level := 0;
3435 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3436 g_metadata_tables(g_num_metadata_tables).level_condition := 'DATASET_ID IN ('||
3437 ' SELECT DATASET_ID'||
3438 ' FROM BSC_SYS_DATASETS_B@'||g_db_link||
3439 ' WHERE NVL(EDW_FLAG,0) = 0)';
3440 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3441 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3442
3443 g_num_metadata_tables := g_num_metadata_tables + 1;
3444 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_DATASET_CALC';
3445 g_metadata_tables(g_num_metadata_tables).level := 0;
3446 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3447 g_metadata_tables(g_num_metadata_tables).level_condition := 'DATASET_ID IN ('||
3448 ' SELECT DATASET_ID'||
3449 ' FROM BSC_SYS_DATASETS_B@'||g_db_link||
3450 ' WHERE NVL(EDW_FLAG,0) = 0)';
3451 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3452 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3453
3454 g_num_metadata_tables := g_num_metadata_tables + 1;
3455 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_DIM_GROUPS_TL';
3456 g_metadata_tables(g_num_metadata_tables).level := 0;
3457 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3458 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3459 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3460 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3461
3462 g_num_metadata_tables := g_num_metadata_tables + 1;
3463 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_DIM_LEVELS_B';
3464 g_metadata_tables(g_num_metadata_tables).level := 0;
3465 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3466 g_metadata_tables(g_num_metadata_tables).level_condition := 'NVL(EDW_FLAG, 0) = 0';
3467 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3468 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3469
3470 g_num_metadata_tables := g_num_metadata_tables + 1;
3471 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_DIM_LEVELS_BY_GROUP';
3472 g_metadata_tables(g_num_metadata_tables).level := 0;
3473 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3474 g_metadata_tables(g_num_metadata_tables).level_condition := 'DIM_LEVEL_ID IN ('||
3475 ' SELECT DIM_LEVEL_ID'||
3476 ' FROM BSC_SYS_DIM_LEVELS_B@'||g_db_link||
3477 ' WHERE NVL(EDW_FLAG,0) = 0)';
3478 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3479 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3480
3481 g_num_metadata_tables := g_num_metadata_tables + 1;
3482 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_DIM_LEVELS_TL';
3483 g_metadata_tables(g_num_metadata_tables).level := 0;
3484 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3485 g_metadata_tables(g_num_metadata_tables).level_condition := 'DIM_LEVEL_ID IN ('||
3486 ' SELECT DIM_LEVEL_ID'||
3487 ' FROM BSC_SYS_DIM_LEVELS_B@'||g_db_link||
3488 ' WHERE NVL(EDW_FLAG,0) = 0)';
3489 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3490 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3491
3492 g_num_metadata_tables := g_num_metadata_tables + 1;
3493 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_DIM_LEVEL_COLS';
3494 g_metadata_tables(g_num_metadata_tables).level := 0;
3495 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3496 g_metadata_tables(g_num_metadata_tables).level_condition := 'DIM_LEVEL_ID IN ('||
3497 ' SELECT DIM_LEVEL_ID'||
3498 ' FROM BSC_SYS_DIM_LEVELS_B@'||g_db_link||
3499 ' WHERE NVL(EDW_FLAG,0) = 0)';
3500 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3501 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3502
3503 g_num_metadata_tables := g_num_metadata_tables + 1;
3504 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_DIM_LEVEL_RELS';
3505 g_metadata_tables(g_num_metadata_tables).level := 0;
3506 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3507 g_metadata_tables(g_num_metadata_tables).level_condition := 'DIM_LEVEL_ID IN ('||
3508 ' SELECT DIM_LEVEL_ID'||
3509 ' FROM BSC_SYS_DIM_LEVELS_B@'||g_db_link||
3510 ' WHERE NVL(EDW_FLAG,0) = 0)';
3511 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3512 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3513
3514 g_num_metadata_tables := g_num_metadata_tables + 1;
3515 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_FILES';
3516 g_metadata_tables(g_num_metadata_tables).level := 2;
3517 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3518 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3519 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3520 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3521
3522 g_num_metadata_tables := g_num_metadata_tables + 1;
3523 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_FILTERS';
3524 g_metadata_tables(g_num_metadata_tables).level := 0;
3525 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3526 g_metadata_tables(g_num_metadata_tables).level_condition := 'SOURCE_TYPE = 0 AND'||
3527 ' DIM_LEVEL_ID IN ('||
3528 ' SELECT DIM_LEVEL_ID'||
3529 ' FROM BSC_SYS_DIM_LEVELS_B@'||g_db_link||
3530 ' WHERE NVL(EDW_FLAG,0) = 0)';
3531 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3532 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3533
3534 g_num_metadata_tables := g_num_metadata_tables + 1;
3535 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_FILTERS';
3536 g_metadata_tables(g_num_metadata_tables).level := 1;
3537 g_metadata_tables(g_num_metadata_tables).level_column := 'SOURCE_CODE';
3538 g_metadata_tables(g_num_metadata_tables).level_condition := 'SOURCE_TYPE = 1 AND'||
3539 ' DIM_LEVEL_ID IN ('||
3540 ' SELECT DIM_LEVEL_ID'||
3541 ' FROM BSC_SYS_DIM_LEVELS_B@'||g_db_link||
3542 ' WHERE NVL(EDW_FLAG,0) = 0)';
3543 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3544 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3545
3546 g_num_metadata_tables := g_num_metadata_tables + 1;
3547 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_FILTERS';
3548 g_metadata_tables(g_num_metadata_tables).level := 2;
3549 g_metadata_tables(g_num_metadata_tables).level_column := 'SOURCE_CODE';
3550 g_metadata_tables(g_num_metadata_tables).level_condition := 'SOURCE_TYPE = 2';
3551 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3552 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3553
3554 g_num_metadata_tables := g_num_metadata_tables + 1;
3555 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_FILTERS_VIEWS';
3556 g_metadata_tables(g_num_metadata_tables).level := 0;
3557 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3558 g_metadata_tables(g_num_metadata_tables).level_condition := 'SOURCE_TYPE = 0 AND'||
3559 ' DIM_LEVEL_ID IN ('||
3560 ' SELECT DIM_LEVEL_ID'||
3561 ' FROM BSC_SYS_DIM_LEVELS_B@'||g_db_link||
3562 ' WHERE NVL(EDW_FLAG,0) = 0)';
3563 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3564 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3565
3566 g_num_metadata_tables := g_num_metadata_tables + 1;
3567 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_FILTERS_VIEWS';
3568 g_metadata_tables(g_num_metadata_tables).level := 1;
3569 g_metadata_tables(g_num_metadata_tables).level_column := 'SOURCE_CODE';
3570 g_metadata_tables(g_num_metadata_tables).level_condition := 'SOURCE_TYPE = 1 AND'||
3571 ' DIM_LEVEL_ID IN ('||
3572 ' SELECT DIM_LEVEL_ID'||
3573 ' FROM BSC_SYS_DIM_LEVELS_B@'||g_db_link||
3574 ' WHERE NVL(EDW_FLAG,0) = 0)';
3575 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3576 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3577
3578 g_num_metadata_tables := g_num_metadata_tables + 1;
3579 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_FILTERS_VIEWS';
3580 g_metadata_tables(g_num_metadata_tables).level := 2;
3581 g_metadata_tables(g_num_metadata_tables).level_column := 'SOURCE_CODE';
3582 g_metadata_tables(g_num_metadata_tables).level_condition := 'SOURCE_TYPE = 2';
3583 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3584 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3585
3586 g_num_metadata_tables := g_num_metadata_tables + 1;
3587 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_FORMATS';
3588 g_metadata_tables(g_num_metadata_tables).level := 0;
3589 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3590 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3591 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3592 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3593
3594 g_num_metadata_tables := g_num_metadata_tables + 1;
3595 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_IMAGES';
3596 g_metadata_tables(g_num_metadata_tables).level := 0;
3597 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3598 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3599 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE; --blob columns are handled by DMLs as others type of columns
3600 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3601
3602 g_num_metadata_tables := g_num_metadata_tables + 1;
3603 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_IMAGES_MAP_TL';
3604 g_metadata_tables(g_num_metadata_tables).level := 0;
3605 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3606 g_metadata_tables(g_num_metadata_tables).level_condition := 'SOURCE_TYPE = 0';
3607 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3608 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3609 --CONDITION CHANGE FOR ENH 5844382, PICK UP SOURCE_TYPE = 3 ALSO
3610 g_num_metadata_tables := g_num_metadata_tables + 1;
3611 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_IMAGES_MAP_TL';
3612 g_metadata_tables(g_num_metadata_tables).level := 1;
3613 g_metadata_tables(g_num_metadata_tables).level_column := 'SOURCE_CODE';
3614 g_metadata_tables(g_num_metadata_tables).level_condition := 'SOURCE_TYPE = 1 OR SOURCE_TYPE = 3';
3615 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3616 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE; -- Only 1 flag per table
3617
3618 g_num_metadata_tables := g_num_metadata_tables + 1;
3619 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_IMAGES_MAP_TL';
3620 g_metadata_tables(g_num_metadata_tables).level := 2;
3621 g_metadata_tables(g_num_metadata_tables).level_column := 'SOURCE_CODE';
3622 g_metadata_tables(g_num_metadata_tables).level_condition := 'SOURCE_TYPE = 2';
3623 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3624 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE; --Only 1 flag per table
3625 /*--bug fix 5680620m bsc_sys_init is a special case and will be
3626 handled separately
3627 g_num_metadata_tables := g_num_metadata_tables + 1;
3628 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_INIT';
3629 g_metadata_tables(g_num_metadata_tables).level := 0;
3630 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3631 g_metadata_tables(g_num_metadata_tables).level_condition := 'PROPERTY_CODE <> ''EDW_INSTALLED''';
3632 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3633 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;*/
3634
3635 g_num_metadata_tables := g_num_metadata_tables + 1;
3636 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_KPI_COLORS';
3637 g_metadata_tables(g_num_metadata_tables).level := 2;
3638 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3639 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3640 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3641 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3642
3643 g_num_metadata_tables := g_num_metadata_tables + 1;
3644 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_LABELS_B';
3645 g_metadata_tables(g_num_metadata_tables).level := 0;
3646 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3647 g_metadata_tables(g_num_metadata_tables).level_condition := 'SOURCE_TYPE = 0';
3648 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3649 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3650
3651 g_num_metadata_tables := g_num_metadata_tables + 1;
3652 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_LABELS_B';
3653 g_metadata_tables(g_num_metadata_tables).level := 1;
3654 g_metadata_tables(g_num_metadata_tables).level_column := 'SOURCE_CODE';
3655 g_metadata_tables(g_num_metadata_tables).level_condition := 'SOURCE_TYPE = 1';
3656 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3657 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3658
3659 g_num_metadata_tables := g_num_metadata_tables + 1;
3660 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_LABELS_B';
3661 g_metadata_tables(g_num_metadata_tables).level := 2;
3662 g_metadata_tables(g_num_metadata_tables).level_column := 'SOURCE_CODE';
3663 g_metadata_tables(g_num_metadata_tables).level_condition := 'SOURCE_TYPE = 2';
3664 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3665 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3666
3667 g_num_metadata_tables := g_num_metadata_tables + 1;
3668 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_LABELS_TL';
3669 g_metadata_tables(g_num_metadata_tables).level := 0;
3670 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3671 g_metadata_tables(g_num_metadata_tables).level_condition := 'SOURCE_TYPE = 0';
3672 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3673 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3674
3675 g_num_metadata_tables := g_num_metadata_tables + 1;
3676 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_LABELS_TL';
3677 g_metadata_tables(g_num_metadata_tables).level := 1;
3678 g_metadata_tables(g_num_metadata_tables).level_column := 'SOURCE_CODE';
3679 g_metadata_tables(g_num_metadata_tables).level_condition := 'SOURCE_TYPE = 1';
3680 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3681 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE; -- Only 1 flag per table
3682
3683 g_num_metadata_tables := g_num_metadata_tables + 1;
3684 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_LABELS_TL';
3685 g_metadata_tables(g_num_metadata_tables).level := 2;
3686 g_metadata_tables(g_num_metadata_tables).level_column := 'SOURCE_CODE';
3687 g_metadata_tables(g_num_metadata_tables).level_condition := 'SOURCE_TYPE = 2';
3688 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3689 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE; --Only 1 flag per table
3690
3691 g_num_metadata_tables := g_num_metadata_tables + 1;
3692 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_LINES';
3693 g_metadata_tables(g_num_metadata_tables).level := 0;
3694 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3695 g_metadata_tables(g_num_metadata_tables).level_condition := 'SOURCE_TYPE = 0';
3696 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3697 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3698
3699 g_num_metadata_tables := g_num_metadata_tables + 1;
3700 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_LINES';
3701 g_metadata_tables(g_num_metadata_tables).level := 1;
3702 g_metadata_tables(g_num_metadata_tables).level_column := 'SOURCE_CODE';
3703 g_metadata_tables(g_num_metadata_tables).level_condition := 'SOURCE_TYPE = 1';
3704 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3705 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3706
3707 g_num_metadata_tables := g_num_metadata_tables + 1;
3708 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_LINES';
3709 g_metadata_tables(g_num_metadata_tables).level := 2;
3710 g_metadata_tables(g_num_metadata_tables).level_column := 'SOURCE_CODE';
3711 g_metadata_tables(g_num_metadata_tables).level_condition := 'SOURCE_TYPE = 2';
3712 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3713 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3714
3715 g_num_metadata_tables := g_num_metadata_tables + 1;
3716 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_MEASURES';
3717 g_metadata_tables(g_num_metadata_tables).level := 0;
3718 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3719 g_metadata_tables(g_num_metadata_tables).level_condition := 'NVL(EDW_FLAG, 0) = 0';
3720 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3721 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3722
3723 g_num_metadata_tables := g_num_metadata_tables + 1;
3724 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_MM_CONTROLS_TL';
3725 g_metadata_tables(g_num_metadata_tables).level := 0;
3726 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3727 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3728 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3729 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3730
3731 g_num_metadata_tables := g_num_metadata_tables + 1;
3732 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_PERIODICITIES';
3733 g_metadata_tables(g_num_metadata_tables).level := 0;
3734 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3735 g_metadata_tables(g_num_metadata_tables).level_condition := 'NVL(EDW_FLAG, 0) = 0';
3736 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3737 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3738
3739 g_num_metadata_tables := g_num_metadata_tables + 1;
3740 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_PERIODICITIES_TL';
3741 g_metadata_tables(g_num_metadata_tables).level := 0;
3742 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3743 g_metadata_tables(g_num_metadata_tables).level_condition := 'PERIODICITY_ID IN ('||
3744 ' SELECT PERIODICITY_ID'||
3745 ' FROM BSC_SYS_PERIODICITIES@'||g_db_link||
3746 ' WHERE NVL(EDW_FLAG, 0) = 0)';
3747 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3748 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3749
3750 g_num_metadata_tables := g_num_metadata_tables + 1;
3751 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_PERIODS';
3752 g_metadata_tables(g_num_metadata_tables).level := 0;
3753 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3754 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3755 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3756 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3757
3758 g_num_metadata_tables := g_num_metadata_tables + 1;
3759 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_PERIODS_TL';
3760 g_metadata_tables(g_num_metadata_tables).level := 0;
3761 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3762 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3763 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3764 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3765
3766 g_num_metadata_tables := g_num_metadata_tables + 1;
3767 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_SERIES_COLORS';
3768 g_metadata_tables(g_num_metadata_tables).level := 0;
3769 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3770 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3771 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3772 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3773
3774 g_num_metadata_tables := g_num_metadata_tables + 1;
3775 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_USER_OPTIONS';
3776 g_metadata_tables(g_num_metadata_tables).level := 0;
3777 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3778 g_metadata_tables(g_num_metadata_tables).level_condition := 'SOURCE_TYPE = 0';
3779 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3780 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3781
3782 g_num_metadata_tables := g_num_metadata_tables + 1;
3783 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_USER_OPTIONS';
3784 g_metadata_tables(g_num_metadata_tables).level := 1;
3785 g_metadata_tables(g_num_metadata_tables).level_column := 'SOURCE_CODE';
3786 g_metadata_tables(g_num_metadata_tables).level_condition := 'SOURCE_TYPE = 1';
3787 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3788 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3789
3790 g_num_metadata_tables := g_num_metadata_tables + 1;
3791 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_USER_OPTIONS';
3792 g_metadata_tables(g_num_metadata_tables).level := 2;
3793 g_metadata_tables(g_num_metadata_tables).level_column := 'SOURCE_CODE';
3794 g_metadata_tables(g_num_metadata_tables).level_condition := 'SOURCE_TYPE = 2';
3795 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3796 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3797
3798 g_num_metadata_tables := g_num_metadata_tables + 1;
3799 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_TABS_B';
3800 g_metadata_tables(g_num_metadata_tables).level := 1;
3801 g_metadata_tables(g_num_metadata_tables).level_column := 'TAB_ID';
3802 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3803 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3804 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3805
3806 g_num_metadata_tables := g_num_metadata_tables + 1;
3807 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_TABS_TL';
3808 g_metadata_tables(g_num_metadata_tables).level := 1;
3809 g_metadata_tables(g_num_metadata_tables).level_column := 'TAB_ID';
3810 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3811 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3812 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3813
3814 g_num_metadata_tables := g_num_metadata_tables + 1;
3815 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_TAB_CSF_B';
3816 g_metadata_tables(g_num_metadata_tables).level := 1;
3817 g_metadata_tables(g_num_metadata_tables).level_column := 'TAB_ID';
3818 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3819 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3820 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3821
3822 g_num_metadata_tables := g_num_metadata_tables + 1;
3823 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_TAB_CSF_TL';
3824 g_metadata_tables(g_num_metadata_tables).level := 1;
3825 g_metadata_tables(g_num_metadata_tables).level_column := 'TAB_ID';
3826 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3827 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3828 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3829
3830 g_num_metadata_tables := g_num_metadata_tables + 1;
3831 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_TAB_INDICATORS';
3832 g_metadata_tables(g_num_metadata_tables).level := 2;
3833 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3834 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3835 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3836 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3837
3838 g_num_metadata_tables := g_num_metadata_tables + 1;
3839 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_TAB_IND_GROUPS_B';
3840 g_metadata_tables(g_num_metadata_tables).level := 1;
3841 g_metadata_tables(g_num_metadata_tables).level_column := 'TAB_ID';
3842 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3843 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3844 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3845
3846 g_num_metadata_tables := g_num_metadata_tables + 1;
3847 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_TAB_IND_GROUPS_TL';
3848 g_metadata_tables(g_num_metadata_tables).level := 1;
3849 g_metadata_tables(g_num_metadata_tables).level_column := 'TAB_ID';
3850 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3851 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3852 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3853
3854 g_num_metadata_tables := g_num_metadata_tables + 1;
3855 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_TAB_VIEW_KPI_TL';
3856 g_metadata_tables(g_num_metadata_tables).level := 2;
3857 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3858 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3859 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3860 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3861
3862 -- bug 5990196 for tables bsc_tab_view_labels_b and bsc_tab_view_labels_tl
3863 -- added condition for objective based migration of data, as the tab_id is -99
3864 -- for simulation objectives
3865
3866 g_num_metadata_tables := g_num_metadata_tables + 1;
3867 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_TAB_VIEW_LABELS_B';
3868 g_metadata_tables(g_num_metadata_tables).level := 1;
3869 g_metadata_tables(g_num_metadata_tables).level_column := 'TAB_ID';
3870 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3871 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3872 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3873
3874 g_num_metadata_tables := g_num_metadata_tables + 1;
3875 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_TAB_VIEW_LABELS_B';
3876 g_metadata_tables(g_num_metadata_tables).level := 2;
3877 g_metadata_tables(g_num_metadata_tables).level_column := 'TAB_VIEW_ID';
3878 g_metadata_tables(g_num_metadata_tables).level_condition := 'TAB_ID = -999';
3879 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3880 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3881
3882 g_num_metadata_tables := g_num_metadata_tables + 1;
3883 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_TAB_VIEW_LABELS_TL';
3884 g_metadata_tables(g_num_metadata_tables).level := 1;
3885 g_metadata_tables(g_num_metadata_tables).level_column := 'TAB_ID';
3886 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3887 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3888 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3889
3890 g_num_metadata_tables := g_num_metadata_tables + 1;
3891 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_TAB_VIEW_LABELS_TL';
3892 g_metadata_tables(g_num_metadata_tables).level := 2;
3893 g_metadata_tables(g_num_metadata_tables).level_column := 'TAB_VIEW_ID';
3894 g_metadata_tables(g_num_metadata_tables).level_condition := 'TAB_ID = -999';
3895 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3896 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3897
3898 g_num_metadata_tables := g_num_metadata_tables + 1;
3899 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_TAB_VIEWS_B';
3900 g_metadata_tables(g_num_metadata_tables).level := 1;
3901 g_metadata_tables(g_num_metadata_tables).level_column := 'TAB_ID';
3902 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3903 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3904 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3905
3906 g_num_metadata_tables := g_num_metadata_tables + 1;
3907 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_TAB_VIEWS_TL';
3908 g_metadata_tables(g_num_metadata_tables).level := 1;
3909 g_metadata_tables(g_num_metadata_tables).level_column := 'TAB_ID';
3910 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3911 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3912 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3913
3914 g_num_metadata_tables := g_num_metadata_tables + 1;
3915 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_UI_COLOR_SCHEMES';
3916 g_metadata_tables(g_num_metadata_tables).level := 0;
3917 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3918 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3919 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3920 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3921
3922 g_num_metadata_tables := g_num_metadata_tables + 1;
3923 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_UI_COLOR_USER';
3924 g_metadata_tables(g_num_metadata_tables).level := 0;
3925 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3926 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3927 g_metadata_tables(g_num_metadata_tables).copy_flag := FALSE;
3928 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3929
3930 g_num_metadata_tables := g_num_metadata_tables + 1;
3931 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_COLORS_B';
3932 g_metadata_tables(g_num_metadata_tables).level := 0;
3933 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3934 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3935 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3936 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3937
3938 g_num_metadata_tables := g_num_metadata_tables + 1;
3939 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_COLORS_TL';
3940 g_metadata_tables(g_num_metadata_tables).level := 0;
3941 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3942 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3943 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3944 g_metadata_tables(g_num_metadata_tables).lang_flag := TRUE;
3945
3946 g_num_metadata_tables := g_num_metadata_tables + 1;
3947 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_COLOR_TYPE_PROPS';
3948 g_metadata_tables(g_num_metadata_tables).level := 2;
3949 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3950 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3951 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3952 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3953
3954 --5979829 bug fix, added right parenthesis.. in the condition
3955 g_num_metadata_tables := g_num_metadata_tables + 1;
3956 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_COLOR_RANGES';
3957 g_metadata_tables(g_num_metadata_tables).level := 0;
3958 g_metadata_tables(g_num_metadata_tables).level_column := NULL;
3959 g_metadata_tables(g_num_metadata_tables).level_condition := ' COLOR_RANGE_ID IN ( ' ||
3960 ' SELECT COLOR_RANGE_ID ' ||
3961 ' FROM BSC_COLOR_TYPE_PROPS) ';
3962 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3963 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3964
3965 g_num_metadata_tables := g_num_metadata_tables + 1;
3966 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_MEASURE_PROPS';
3967 g_metadata_tables(g_num_metadata_tables).level := 2;
3968 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3969 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3970 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3971 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3972
3973 g_num_metadata_tables := g_num_metadata_tables + 1;
3974 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_KPI_MEASURE_WEIGHTS';
3975 g_metadata_tables(g_num_metadata_tables).level := 2;
3976 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3977 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3978 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3979 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3980
3981 g_num_metadata_tables := g_num_metadata_tables + 1;
3982 g_metadata_tables(g_num_metadata_tables).table_name := 'BSC_SYS_OBJECTIVE_COLORS';
3983 g_metadata_tables(g_num_metadata_tables).level := 2;
3984 g_metadata_tables(g_num_metadata_tables).level_column := 'INDICATOR';
3985 g_metadata_tables(g_num_metadata_tables).level_condition := NULL;
3986 g_metadata_tables(g_num_metadata_tables).copy_flag := TRUE;
3987 g_metadata_tables(g_num_metadata_tables).lang_flag := FALSE;
3988
3989 -- Tables with information by customized by user
3990 -- These tables are not migrated but we need to delete records from target system
3991 -- BSC_KPI_ANALYSIS_OPT_USER
3992 -- BSC_KPI_CALCULATIONS_USER
3993 -- BSC_KPI_DIM_LEVELS_USER
3994 -- BSC_KPI_PERIODICITIES_USER
3995 -- BSC_KPI_SHELL_CMDS_USER
3996 -- BSC_UI_COLOR_USER
3997 -- BSC_KPI_GRAPHS (This table needs to be deleted in the target. Portlet wiil create
3998 -- records here dynamically and we cannot leave as is becasue
3999 -- this table make reference to images in BSC_SYS_IMAGES and
4000 -- after migration the images could not correspond.
4001 -- BSC_BIS_MEASURES_DATA (This table needs to be deleted in the target. Viewer will create
4002 -- records here dynamically by demand.
4003
4004 -- Bug 2125440 (Solution approved by Patricia and Vinod)
4005 -- This tables are not deleted from the target and are not copied from source
4006 -- because they are used by portlets.
4007 -- BSC_USER_KPIGRAPH_PLUGS
4008 -- BSC_USER_KPILIST_PLUGS
4009 -- BSC_USER_KPILIST_KPIS
4010 -- BSC_USER_PARAMETERS_B
4011 -- BSC_USER_PARAMETERS_TL
4012
4013 -- Security Level tables
4014 -- BSC_APPS_USERS
4015 -- BSC_RESPONSIBILITY
4016 -- BSC_RESPONSIBILITY_TL
4017 -- BSC_USERS
4018 -- BSC_USER_INFO
4019 -- BSC_USER_KPI_ACCESS
4020 -- BSC_USER_LIST_ACCESS
4021 -- BSC_USER_RESPONSIBILITY
4022 -- BSC_USER_TAB_ACCESS
4023
4024 -- This table is not deleted from the target and is not copied from source
4025 -- because the migration program use this table.
4026 -- BSC_MESSAGE_LOGS
4027
4028 -- Ignored tables.
4029 -- BSC_INSTALL_LOGS
4030 -- BSC_UPGRADE_TASK
4031
4032 END Init_Metadata_Tables_Array;
4033
4034
4035 /*===========================================================================+
4036 | FUNCTION Init_Migration_Objects_Arrays
4037 +============================================================================*/
4038 FUNCTION Init_Migration_Objects_Arrays RETURN BOOLEAN IS
4039
4040 TYPE t_cursor IS REF CURSOR;
4041 h_cursor t_cursor;
4042 h_sql VARCHAR2(32700);
4043
4044 h_filter_condition VARCHAR2(32700);
4045 h_resp_cond VARCHAR2(32700);
4046 h_tab_cond VARCHAR2(32700);
4047 h_kpi_cond VARCHAR2(32700);
4048
4049 h_message VARCHAR2(2000);
4050
4051 h_i NUMBER;
4052
4053 h_tab_id NUMBER;
4054 h_kpi_id NUMBER;
4055
4056 h_table VARCHAR2(30);
4057 h_tables t_array_of_varchar2;
4058 h_num_tables NUMBER := 0;
4059
4060 BEGIN
4061
4062 -- ------------------------------------------------------------------------------------
4063 -- Initialize the arrays of PMF measures, dimensions and dimension levels that do not
4064 -- exist in the target. Also init an array with the indicators using those PMF objects
4065 -- We cannot migrate those indicators.
4066 Init_Invalid_PMF_Objects;
4067 -- ------------------------------------------------------------------------------------
4068
4069 h_resp_cond := BSC_APPS.Get_New_Big_In_Cond_Number(1, 'r.responsibility_id');
4070 FOR h_i IN 1 .. g_num_src_resps LOOP
4071 BSC_APPS.Add_Value_Big_In_Cond(1, g_src_resps(h_i));
4072 END LOOP;
4073
4074 h_tab_cond := BSC_APPS.Get_New_Big_In_Cond_Number(2, 'rt.tab_id');
4075 FOR h_i IN 1 .. g_num_tabs_filter LOOP
4076 BSC_APPS.Add_Value_Big_In_Cond(2, g_tabs_filter(h_i));
4077 END LOOP;
4078
4079 h_kpi_cond := BSC_APPS.Get_New_Big_In_Cond_Number(3, 'rk.indicator');
4080 FOR h_i IN 1 .. g_num_kpis_filter LOOP
4081 BSC_APPS.Add_Value_Big_In_Cond(3, g_kpis_filter(h_i));
4082 END LOOP;
4083
4084 h_filter_condition := '('||h_resp_cond||')';
4085 IF g_num_tabs_filter > 0 THEN
4086 h_filter_condition := h_filter_condition||' AND ('||h_tab_cond||')';
4087 END IF;
4088 IF g_num_kpis_filter > 0 THEN
4089 h_filter_condition := h_filter_condition||' AND ('||h_kpi_cond||')';
4090 END IF;
4091
4092 -- Initialize migration objects arrays: g_mig_tabs, g_mig_kpis and g_mig_tables
4093 -- EDW Note: No EDW Kpis con be migratred
4094 h_sql := 'SELECT rt.tab_id, rk.indicator'||
4095 ' FROM bsc_responsibility_vl@'||g_db_link||' r,'||
4096 ' bsc_user_tab_access@'||g_db_link||' rt,'||
4097 ' bsc_user_kpi_access@'||g_db_link||' rk,'||
4098 ' bsc_tab_indicators@'||g_db_link||' tk,'||
4099 ' bsc_kpis_b@'||g_db_link||' k'||
4100 ' WHERE r.responsibility_id = rt.responsibility_id AND'||
4101 ' r.responsibility_id = rk.responsibility_id AND'||
4102 ' rt.tab_id = tk.tab_id AND'||
4103 ' rk.indicator = tk.indicator AND'||
4104 ' tk.indicator = k.indicator AND'||
4105 ' NVL(k.edw_flag, 0) = 0 AND '||h_filter_condition;
4106 OPEN h_cursor FOR h_sql;
4107
4108 g_num_mig_tabs := 0;
4109 g_num_mig_kpis := 0;
4110 g_num_mig_tables := 0;
4111 g_num_no_mig_kpis := 0;
4112
4113 LOOP
4114 FETCH h_cursor INTO h_tab_id, h_kpi_id;
4115 EXIT WHEN h_cursor%NOTFOUND;
4116
4117 IF NOT Item_Belong_To_Array_Number(h_tab_id, g_mig_tabs, g_num_mig_tabs) THEN
4118 g_num_mig_tabs := g_num_mig_tabs + 1;
4119 g_mig_tabs(g_num_mig_tabs) := h_tab_id;
4120 END IF;
4121
4122 IF NOT Item_Belong_To_Array_Number(h_kpi_id, g_mig_kpis, g_num_mig_kpis) THEN
4123 -- Verify that the indicator is not in the array of invalid Kpis
4124 -- Those Kpis are using PMF objects that do no exists in the target
4125 IF NOT Item_Belong_To_Array_Number(h_kpi_id, g_invalid_kpis, g_num_invalid_kpis) THEN
4126 g_num_mig_kpis := g_num_mig_kpis + 1;
4127 g_mig_kpis(g_num_mig_kpis) := h_kpi_id;
4128 ELSE
4129 -- This is the array of Kpis that cannot be migrated because are using PMF
4130 -- objects that do not exist in the target environment
4131 g_num_no_mig_kpis := g_num_no_mig_kpis + 1;
4132 g_no_mig_kpis(g_num_no_mig_kpis) := h_kpi_id;
4133 END IF;
4134 END IF;
4135
4136 END LOOP;
4137 CLOSE h_cursor;
4138
4139 -- Now we need to add the tabs that do not have kpis associated to them.
4140 -- This is done oly if the filter is not by indicator
4141 IF g_num_kpis_filter = 0 THEN
4142 -- The filter is not by indicator
4143 -- h_filter_condition already is set.
4144
4145 h_sql := 'SELECT rt.tab_id'||
4146 ' FROM bsc_responsibility_vl@'||g_db_link||' r,'||
4147 ' bsc_user_tab_access@'||g_db_link||' rt'||
4148 ' WHERE r.responsibility_id = rt.responsibility_id AND '||h_filter_condition;
4149 OPEN h_cursor FOR h_sql;
4150
4151 LOOP
4152 FETCH h_cursor INTO h_tab_id;
4153 EXIT WHEN h_cursor%NOTFOUND;
4154
4155 IF NOT Item_Belong_To_Array_Number(h_tab_id, g_mig_tabs, g_num_mig_tabs) THEN
4156 g_num_mig_tabs := g_num_mig_tabs + 1;
4157 g_mig_tabs(g_num_mig_tabs) := h_tab_id;
4158 END IF;
4159 END LOOP;
4160 CLOSE h_cursor;
4161
4162 END IF;
4163
4164 -- Initialize the array of tables that are used by those KPIs
4165 IF g_num_mig_kpis > 0 THEN
4166 h_kpi_cond := BSC_APPS.Get_New_Big_In_Cond_Number(4, 'indicator');
4167 FOR h_i IN 1 .. g_num_mig_kpis LOOP
4168 BSC_APPS.Add_Value_Big_In_Cond(4, g_mig_kpis(h_i));
4169 END LOOP;
4170
4171 h_sql := 'SELECT DISTINCT table_name'||
4172 ' FROM bsc_kpi_data_tables_v@'||g_db_link||
4173 ' WHERE ('||h_kpi_cond||') AND'||
4174 ' table_name IS NOT NULL';
4175 OPEN h_cursor FOR h_sql;
4176 LOOP
4177 FETCH h_cursor INTO h_table;
4178 EXIT WHEN h_cursor%NOTFOUND;
4179
4180 g_num_mig_tables := g_num_mig_tables + 1;
4181 g_mig_tables(g_num_mig_tables) := h_table;
4182
4183 h_num_tables := h_num_tables + 1;
4184 h_tables(h_num_tables) := h_table;
4185
4186 END LOOP;
4187 CLOSE h_cursor;
4188
4189 -- Add the parent tables until the input tables
4190 Insert_Origin_Tables(h_tables, h_num_tables);
4191
4192 END IF;
4193
4194 RETURN TRUE;
4195
4196 EXCEPTION
4197 WHEN OTHERS THEN
4198 BSC_MESSAGE.Add (x_message => SQLERRM,
4199 x_source => 'BSC_MIGRATION.Init_Migration_Objects_Arrays');
4200 RETURN FALSE;
4201
4202 END Init_Migration_Objects_Arrays;
4203
4204
4205 /*===========================================================================+
4206 | FUNCTION Is_Input_Table
4207 +============================================================================*/
4208 FUNCTION Is_Input_Table(
4209 x_table_name IN VARCHAR2
4210 ) RETURN BOOLEAN IS
4211
4212 CURSOR c_table_type IS
4213 SELECT table_type
4214 FROM bsc_db_tables
4215 WHERE table_name = x_table_name;
4216
4217 h_table_type NUMBER;
4218
4219 BEGIN
4220
4221 OPEN c_table_type;
4222 FETCH c_table_type INTO h_table_type;
4223 IF c_table_type%NOTFOUND THEN
4224 h_table_type := 1;
4225 END IF;
4226 CLOSE c_table_type;
4227
4228 IF h_table_type = 0 THEN
4229 RETURN TRUE;
4230 ELSE
4231 RETURN FALSE;
4232 END IF;
4233
4234 END Is_Input_Table;
4235
4236
4237 /*===========================================================================+
4238 | FUNCTION Is_Base_Table
4239 +============================================================================*/
4240 FUNCTION Is_Base_Table(
4241 x_table_name IN VARCHAR2
4242 ) RETURN BOOLEAN IS
4243
4244 CURSOR c_table_type IS
4245 SELECT t.table_type
4246 FROM bsc_db_tables t, bsc_db_tables_rels r
4247 WHERE t.table_name = r.source_table_name and
4248 r.table_name = x_table_name;
4249
4250 h_table_type NUMBER;
4251
4252 BEGIN
4253
4254 OPEN c_table_type;
4255 FETCH c_table_type INTO h_table_type;
4256 IF c_table_type%NOTFOUND THEN
4257 h_table_type := 1;
4258 END IF;
4259 CLOSE c_table_type;
4260
4261 IF h_table_type = 0 THEN
4262 RETURN TRUE;
4263 ELSE
4264 RETURN FALSE;
4265 END IF;
4266
4267 END Is_Base_Table;
4268
4269
4270 /*===========================================================================+
4271 | PROCEDURE Insert_Origin_Tables
4272 +============================================================================*/
4273 PROCEDURE Insert_Origin_Tables(
4274 x_tables IN t_array_of_varchar2,
4275 x_num_tables IN NUMBER
4276 ) IS
4277
4278 h_sql VARCHAR2(32700);
4279 TYPE t_cursor IS REF CURSOR;
4280 h_cursor t_cursor;
4281
4282 h_table VARCHAR2(30);
4283 h_tables t_array_of_varchar2;
4284 h_num_tables NUMBER := 0;
4285
4286 h_table_cond VARCHAR2(32700);
4287
4288 BEGIN
4289 IF x_num_tables > 0 THEN
4290
4291 h_table_cond := BSC_APPS.Get_New_Big_In_Cond_Varchar2(1, 'table_name');
4292 FOR h_i IN 1 .. x_num_tables LOOP
4293 BSC_APPS.Add_Value_Big_In_Cond(1, x_tables(h_i));
4294 END LOOP;
4295
4296 h_sql := 'SELECT DISTINCT source_table_name'||
4297 ' FROM bsc_db_tables_rels@'||g_db_link||
4298 ' WHERE '||h_table_cond;
4299 OPEN h_cursor FOR h_sql;
4300
4301 LOOP
4302 FETCH h_cursor INTO h_table;
4303 EXIT WHEN h_cursor%NOTFOUND;
4304
4305 IF NOT Item_Belong_To_Array_Varchar2(h_table, g_mig_tables, g_num_mig_tables) THEN
4306 g_num_mig_tables := g_num_mig_tables + 1;
4307 g_mig_tables(g_num_mig_tables) := h_table;
4308 END IF;
4309
4310 h_num_tables := h_num_tables + 1;
4311 h_tables(h_num_tables) := h_table;
4312
4313 END LOOP;
4314 CLOSE h_cursor;
4315
4316 -- Add the parent tables until the input tables
4317 Insert_Origin_Tables(h_tables, h_num_tables);
4318
4319 END IF;
4320
4321 END Insert_Origin_Tables;
4322
4323
4324 /*===========================================================================+
4325 | FUNCTION Item_Belong_To_Array_Number
4326 +============================================================================*/
4327 FUNCTION Item_Belong_To_Array_Number(
4328 x_item IN NUMBER,
4329 x_array IN t_array_of_number,
4330 x_num_items IN NUMBER
4331 ) RETURN BOOLEAN IS
4332
4333 h_i NUMBER;
4334
4335 BEGIN
4336 FOR h_i IN 1 .. x_num_items LOOP
4337 IF x_array(h_i) = x_item THEN
4338 RETURN TRUE;
4339 END IF;
4340 END LOOP;
4341
4342 RETURN FALSE;
4343
4344 END Item_Belong_To_Array_Number;
4345
4346
4347 /*===========================================================================+
4348 | FUNCTION Item_Belong_To_Array_Varchar2
4349 +============================================================================*/
4350 FUNCTION Item_Belong_To_Array_Varchar2(
4351 x_item IN VARCHAR2,
4352 x_array IN t_array_of_varchar2,
4353 x_num_items IN NUMBER
4354 ) RETURN BOOLEAN IS
4355
4356 h_i NUMBER;
4357
4358 BEGIN
4359 FOR h_i IN 1 .. x_num_items LOOP
4360 IF UPPER(x_array(h_i)) = UPPER(x_item) THEN
4361 RETURN TRUE;
4362 END IF;
4363 END LOOP;
4364
4365 RETURN FALSE;
4366
4367 END Item_Belong_To_Array_Varchar2;
4368
4369
4370 /*===========================================================================+
4371 | FUNCTION Make_Lst_Cond_Number
4372 +============================================================================*/
4373 FUNCTION Make_Lst_Cond_Number(
4374 x_column IN VARCHAR2,
4375 x_values IN t_array_of_number,
4376 x_num_values IN NUMBER,
4377 x_separator IN VARCHAR2
4378 ) RETURN VARCHAR2 IS
4379
4380 h_i NUMBER;
4381 h_lst VARCHAR2(32700) := NULL;
4382
4383 BEGIN
4384 FOR h_i IN 1 .. x_num_values LOOP
4385 IF h_lst IS NULL THEN
4386 h_lst := x_column||' = '||x_values(h_i);
4387 ELSE
4388 h_lst := h_lst||' '||x_separator||' '||x_column||' = '||x_values(h_i);
4389 END IF;
4390 END LOOP;
4391
4392 RETURN h_lst;
4393
4394 END Make_Lst_Cond_Number;
4395
4396
4397 /*===========================================================================+
4398 | FUNCTION Make_Lst_Cond_Varchar2
4399 +============================================================================*/
4400 FUNCTION Make_Lst_Cond_Varchar2(
4401 x_column IN VARCHAR2,
4402 x_values IN t_array_of_varchar2,
4403 x_num_values IN NUMBER,
4404 x_separator IN VARCHAR2
4405 ) RETURN VARCHAR2 IS
4406
4407 h_i NUMBER;
4408 h_lst VARCHAR2(32700) := NULL;
4409
4410 BEGIN
4411 FOR h_i IN 1 .. x_num_values LOOP
4412 IF h_lst IS NULL THEN
4413 h_lst := 'UPPER('||x_column||') = '''||UPPER(x_values(h_i))||'''';
4414 ELSE
4415 h_lst := h_lst||' '||x_separator||' UPPER('||x_column||') = '''||UPPER(x_values(h_i))||'''';
4416 END IF;
4417 END LOOP;
4418
4419 RETURN h_lst;
4420
4421 END Make_Lst_Cond_Varchar2;
4422
4423
4424 /*===========================================================================+
4425 | FUNCTION Migrate_Dynamic_Tables_Data
4426 +============================================================================*/
4427 FUNCTION Migrate_Dynamic_Tables_Data RETURN BOOLEAN IS
4428
4429 e_unexpected_error EXCEPTION;
4430
4431 h_sql VARCHAR2(32700);
4432
4433 TYPE t_cursor IS REF CURSOR;
4434 h_cursor t_cursor;
4435
4436 h_table VARCHAR2(30);
4437
4438 h_base_message VARCHAR2(4000);
4439 h_message VARCHAR2(4000);
4440
4441 -- ENH_B_TABES_PERF: new variables
4442 h_proj_table_name VARCHAR2(30);
4443
4444 BEGIN
4445
4446 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_MIG_TABLES_DATA'), BSC_APPS.OUTPUT_FILE);
4447
4448 h_base_message := BSC_APPS.Get_Message('BSC_MIG_DATA');
4449
4450 -- Dimension tables
4451 h_sql := 'SELECT level_table_name'||
4452 ' FROM bsc_sys_dim_levels_b'||
4453 ' WHERE NVL(source, ''BSC'') = ''BSC''';
4454 OPEN h_cursor FOR h_sql;
4455 LOOP
4456 FETCH h_cursor INTO h_table;
4457 EXIT WHEN h_cursor%NOTFOUND;
4458
4459 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
4460 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
4461
4462 -- Fix bug#4430901 add append hint
4463 -- Fix performance bug#3860149: use parallel hint
4464 h_sql := 'INSERT /*+ append parallel('||h_table||') */ INTO '||h_table||
4465 ' SELECT /*+ parallel('||h_table||') */ * FROM '||h_table||'@'||g_db_link;
4466 BSC_APPS.Execute_Immediate(h_sql);
4467
4468 COMMIT;
4469 END LOOP;
4470 CLOSE h_cursor;
4471
4472 -- No need to copy input tables for dimensions.
4473
4474 -- MN Dimension tables
4475 h_sql := 'SELECT DISTINCT relation_col'||
4476 ' FROM bsc_sys_dim_level_rels'||
4477 ' WHERE relation_type = 2';
4478 OPEN h_cursor FOR h_sql;
4479 LOOP
4480 FETCH h_cursor INTO h_table;
4481 EXIT WHEN h_cursor%NOTFOUND;
4482
4483 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
4484 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
4485
4486 -- Fix bug#4430901 add append hint
4487 -- Fix performance bug#3860149: use parallel hint
4488 h_sql := 'INSERT /*+ append parallel('||h_table||') */ INTO '||h_table||
4489 ' SELECT /* parallel('||h_table||') */ * FROM '||h_table||'@'||g_db_link;
4490 BSC_APPS.Execute_Immediate(h_sql);
4491
4492 COMMIT;
4493 END LOOP;
4494 CLOSE h_cursor;
4495
4496 -- Data tables
4497 FOR h_i IN 1..g_num_mig_tables LOOP
4498 h_table := g_mig_tables(h_i);
4499
4500 --BSC-MV Note: Migrate only existing tables
4501 IF g_adv_sum_level IS NULL THEN
4502 -- BSC summary tables architecture. All summary tables exists
4503
4504 -- ENH_B_TABLES_PERF: for base table we need to check if it has a projection table.
4505 -- in this case the base table is in the new architecture (partitions and projection table)
4506 -- We need to fix the batch column in th esame time we are inserting rows inthe target
4507 -- since the number of partititons may be different from the source.
4508 IF Is_Base_Table(h_table) THEN
4509 h_proj_table_name := Get_Proj_Table_Name(h_table);
4510 IF h_proj_table_name IS NOT NULL THEN
4511 IF NOT Migrate_BTable_With_Partitions(h_table, h_proj_table_name) THEN
4512 RAISE e_unexpected_error;
4513 END IF;
4514 ELSE
4515 -- This is a normal B table
4516 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
4517 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
4518
4519 -- Fix bug#4430901 add append hint
4520 -- Fix performance bug#3860149: use parallel hint
4521 h_sql := 'INSERT /*+ append parallel('||h_table||') */ INTO '||h_table||
4522 ' SELECT /*+ parallel('||h_table||') */ * FROM '||h_table||'@'||g_db_link;
4523 BSC_APPS.Execute_Immediate(h_sql);
4524 commit;
4525 END IF;
4526 ELSE
4527 -- This is not a base table
4528 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
4529 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
4530
4531 -- Fix bug#4430901 add append hint
4532 -- Fix performance bug#3860149: use parallel hint
4533 h_sql := 'INSERT /*+ append parallel('||h_table||') */ INTO '||h_table||
4534 ' SELECT /*+ parallel('||h_table||') */ * FROM '||h_table||'@'||g_db_link;
4535 BSC_APPS.Execute_Immediate(h_sql);
4536 commit;
4537 END IF;
4538 ELSE
4539 -- BSC-MV architecture. Generation type = -1 means the table does not exists
4540 IF BSC_UPDATE_UTIL.Get_Table_Generation_Type(h_table) <> -1 THEN
4541 -- ENH_B_TABLES_PERF: for base table we need to check if it has a projection table.
4542 -- in this case the base table is in the new architecture (partitions and projection table)
4543 -- We need to fix the batch column in th esame time we are inserting rows inthe target
4544 -- since the number of partititons may be different from the source.
4545 IF Is_Base_Table(h_table) THEN
4546 h_proj_table_name := Get_Proj_Table_Name(h_table);
4547 IF h_proj_table_name IS NOT NULL THEN
4548 IF NOT Migrate_BTable_With_Partitions(h_table, h_proj_table_name) THEN
4549 RAISE e_unexpected_error;
4550 END IF;
4551 ELSE
4552 -- This is a normal B table
4553 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
4554 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
4555
4556 -- Fix bug#4430901 add append hint
4557 -- Fix performance bug#3860149: use parallel hint
4558 h_sql := 'INSERT /*+ append parallel('||h_table||') */ INTO '||h_table||
4559 ' SELECT /*+ parallel('||h_table||') */ * FROM '||h_table||'@'||g_db_link;
4560 BSC_APPS.Execute_Immediate(h_sql);
4561 commit;
4562 END IF;
4563 ELSE
4564 -- This is not a base table
4565 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
4566 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
4567
4568 -- Fix bug#4430901 add append hint
4569 -- Fix performance bug#3860149: use parallel hint
4570 h_sql := 'INSERT /*+ append parallel('||h_table||') */ INTO '||h_table||
4571 ' SELECT /*+ parallel('||h_table||') */ * FROM '||h_table||'@'||g_db_link;
4572 BSC_APPS.Execute_Immediate(h_sql);
4573 commit;
4574 END IF;
4575 END IF;
4576 END IF;
4577 END LOOP;
4578
4579 -- BSC-MV Note: Migrate data of projection tables
4580 IF g_adv_sum_level IS NOT NULL THEN
4581 h_sql := 'SELECT DISTINCT projection_data'||
4582 ' FROM bsc_kpi_data_tables'||
4583 ' WHERE projection_data IS NOT NULL';
4584 OPEN h_cursor FOR h_sql;
4585 LOOP
4586 FETCH h_cursor INTO h_table;
4587 EXIT WHEN h_cursor%NOTFOUND;
4588
4589 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
4590 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
4591
4592 IF Exist_Table_In_Src(h_table) THEN
4593 -- Fix bug#4430901 add append hint
4594 -- Fix performance bug#3860149: use parallel hint
4595 h_sql := 'INSERT /*+ append parallel('||h_table||') */ INTO '||h_table||
4596 ' SELECT /*+ parallel('||h_table||') */ * FROM '||h_table||'@'||g_db_link;
4597 BSC_APPS.Execute_Immediate(h_sql);
4598 commit;
4599 END IF;
4600 END LOOP;
4601 CLOSE h_cursor;
4602 END IF;
4603
4604 RETURN TRUE;
4605
4606 EXCEPTION
4607 WHEN e_unexpected_error THEN
4608 BSC_MESSAGE.Add (x_message => BSC_APPS.Get_Message('BSC_UNEXPECTED_ERROR'),
4609 x_source => 'BSC_MIGRATION.Migrate_Dynamic_Tables_Data');
4610 RETURN FALSE;
4611
4612 WHEN OTHERS THEN
4613 BSC_MESSAGE.Add (x_message => SQLERRM,
4614 x_source => 'BSC_MIGRATION.Migrate_Dynamic_Tables_Data');
4615 RETURN FALSE;
4616
4617 END Migrate_Dynamic_Tables_Data;
4618
4619
4620 /*===========================================================================+
4621 | FUNCTION Migrate_Metadata
4622 +============================================================================*/
4623 FUNCTION Migrate_Metadata RETURN BOOLEAN IS
4624
4625 e_unexpected_error EXCEPTION;
4626
4627 h_i NUMBER;
4628 h_j NUMBER;
4629 h_mig_condition VARCHAR2(32700) := NULL;
4630 h_cause_cond VARCHAR2(32700) := NULL;
4631 h_effect_cond VARCHAR2(32700) := NULL;
4632
4633 h_table_name VARCHAR2(30);
4634 h_level NUMBER;
4635 h_level_column VARCHAR2(30);
4636 h_level_condition VARCHAR2(200);
4637
4638 h_base_message VARCHAR2(4000);
4639 h_message VARCHAR2(4000);
4640
4641 TYPE t_cursor IS REF CURSOR;
4642 h_cursor t_cursor;
4643
4644 h_sql VARCHAR2(32700);
4645
4646 h_lst_table_columns VARCHAR2(32700) := NULL;
4647
4648 h_currval NUMBER;
4649 h_src_currval NUMBER;
4650 h_interval NUMBER;
4651
4652 BEGIN
4653
4654 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_MIG_METADATA'), BSC_APPS.OUTPUT_FILE);
4655
4656 h_base_message := BSC_APPS.Get_Message('BSC_MIG_DATA');
4657
4658 FOR h_i IN 1..g_num_metadata_tables LOOP
4659 IF g_metadata_tables(h_i).copy_flag THEN
4660 h_table_name := g_metadata_tables(h_i).table_name;
4661 h_level := g_metadata_tables(h_i).level;
4662 h_level_column := g_metadata_tables(h_i).level_column;
4663 h_level_condition := g_metadata_tables(h_i).level_condition;
4664
4665 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table_name);
4666 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
4667
4668 h_mig_condition := NULL;
4669
4670 IF h_level = 0 THEN
4671 -- System Level
4672 h_mig_condition := NULL;
4673
4674 ELSIF h_level = 1 THEN
4675 -- Tab level
4676 h_mig_condition := BSC_APPS.Get_New_Big_In_Cond_Number(1, h_level_column);
4677 FOR h_j IN 1 .. g_num_mig_tabs LOOP
4678 BSC_APPS.Add_Value_Big_In_Cond(1, g_mig_tabs(h_j));
4679 END LOOP;
4680
4681 ELSIF h_level = 2 THEN
4682 -- KPI Level
4683 h_mig_condition := BSC_APPS.Get_New_Big_In_Cond_Number(1, h_level_column);
4684 FOR h_j IN 1 .. g_num_mig_kpis LOOP
4685 BSC_APPS.Add_Value_Big_In_Cond(1, g_mig_kpis(h_j));
4686 END LOOP;
4687
4688 ELSIF h_level = 3 THEN
4689 -- Table level
4690 h_mig_condition := BSC_APPS.Get_New_Big_In_Cond_Varchar2(1, h_level_column);
4691 FOR h_j IN 1 .. g_num_mig_tables LOOP
4692 BSC_APPS.Add_Value_Big_In_Cond(1, g_mig_tables(h_j));
4693 END LOOP;
4694
4695 END IF;
4696
4697 IF h_level_condition IS NOT NULL THEN
4698 IF h_mig_condition IS NULL THEN
4699 h_mig_condition := h_level_condition;
4700 ELSE
4701 h_mig_condition := h_level_condition||' AND ('||h_mig_condition||')';
4702 END IF;
4703 END IF;
4704
4705 h_lst_table_columns := Get_Lst_Table_Columns(g_metadata_tables(h_i).table_name);
4706 -- Fix bug#4430901: add append hint
4707 -- Fix performance bug#3860149: use parallel hint
4708 h_sql := 'INSERT /*+ append parallel('||g_metadata_tables(h_i).table_name||') */'||
4709 ' INTO '||g_metadata_tables(h_i).table_name||' ('||h_lst_table_columns||')'||
4710 ' SELECT /*+ parallel('||g_metadata_tables(h_i).table_name||') */ '||h_lst_table_columns||
4711 ' FROM '||g_metadata_tables(h_i).table_name||'@'||g_db_link;
4712
4713 IF h_mig_condition IS NOT NULL THEN
4714 h_sql := h_sql||' WHERE '||h_mig_condition;
4715 END IF;
4716 BSC_APPS.Execute_Immediate(h_sql);
4717
4718 COMMIT;
4719 END IF;
4720 END LOOP;
4721
4722 -- Fix some problems
4723 -- 1. The table BSC_KPI_CAUSE_EFFECT_RELS only should have Kpis that are in g_mig_kpis
4724 -- in columns cause_indicator and effect_indicator
4725 h_cause_cond := BSC_APPS.Get_New_Big_In_Cond_Number(2, 'cause_indicator');
4726
4727 FOR h_j in 1 .. g_num_mig_kpis LOOP
4728 BSC_APPS.Add_Value_Big_In_Cond(2, g_mig_kpis(h_j));
4729 END LOOP;
4730
4731 h_effect_cond := BSC_APPS.Get_New_Big_In_Cond_Number(3, 'effect_indicator');
4732 FOR h_j in 1 .. g_num_mig_kpis LOOP
4733 BSC_APPS.Add_Value_Big_In_Cond(3, g_mig_kpis(h_j));
4734 END LOOP;
4735
4736 h_sql := 'DELETE FROM bsc_kpi_cause_effect_rels'||
4737 ' WHERE NOT ('||h_cause_cond||') OR'||
4738 ' NOT ('||h_effect_cond||')';
4739 BSC_APPS.Execute_Immediate(h_sql);
4740 COMMIT;
4741
4742 -- 2. Reset sequence BSC_SYS_IMAGE_ID_S to start with at least the same current value of the sequence
4743 -- in the source system.
4744 -- Bug resetting sequences: We cannot drop the sequence to reset the start value because the packages
4745 -- using the sequence will become invalid.
4746 -- We will use alter sequence and NEXTVAL to reset the start value is the current value
4747 -- in the source system is greater than the current value in the target system.
4748 h_sql := 'SELECT BSC_SYS_IMAGE_ID_S.NEXTVAL@'||g_db_link||' FROM DUAL';
4749 OPEN h_cursor FOR h_sql;
4750 FETCH h_cursor INTO h_src_currval;
4751 CLOSE h_cursor;
4752
4753 SELECT BSC_SYS_IMAGE_ID_S.NEXTVAL INTO h_currval FROM DUAL;
4754 IF h_src_currval > h_currval THEN
4755 h_interval := h_src_currval - h_currval;
4756
4757 h_sql := 'ALTER SEQUENCE BSC_SYS_IMAGE_ID_S INCREMENT BY '||h_interval;
4758 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_SYS_IMAGE_ID_S');
4759
4760 SELECT BSC_SYS_IMAGE_ID_S.NEXTVAL INTO h_currval FROM DUAL;
4761
4762 h_sql := 'ALTER SEQUENCE BSC_SYS_IMAGE_ID_S INCREMENT BY 1';
4763 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_SYS_IMAGE_ID_S');
4764 END IF;
4765
4766 -- 3. Reset sequence BSC_SYS_CALENDAR_ID_S to start with at least the same current value of the sequence
4767 -- in the source system.
4768 h_sql := 'SELECT BSC_SYS_CALENDAR_ID_S.NEXTVAL@'||g_db_link||' FROM DUAL';
4769 OPEN h_cursor FOR h_sql;
4770 FETCH h_cursor INTO h_src_currval;
4771 CLOSE h_cursor;
4772
4773 SELECT BSC_SYS_CALENDAR_ID_S.NEXTVAL INTO h_currval FROM DUAL;
4774 IF h_src_currval > h_currval THEN
4775 h_interval := h_src_currval - h_currval;
4776
4777 h_sql := 'ALTER SEQUENCE BSC_SYS_CALENDAR_ID_S INCREMENT BY '||h_interval;
4778 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_SYS_CALENDAR_ID_S');
4779
4780 SELECT BSC_SYS_CALENDAR_ID_S.NEXTVAL INTO h_currval FROM DUAL;
4781
4782 h_sql := 'ALTER SEQUENCE BSC_SYS_CALENDAR_ID_S INCREMENT BY 1';
4783 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_SYS_CALENDAR_ID_S');
4784 END IF;
4785
4786 -- 4. Reset sequence BSC_SYS_PERIODICITY_ID_S to start with at least the same current value of the sequence
4787 -- in the source system.
4788 h_sql := 'SELECT BSC_SYS_PERIODICITY_ID_S.NEXTVAL@'||g_db_link||' FROM DUAL';
4789 OPEN h_cursor FOR h_sql;
4790 FETCH h_cursor INTO h_src_currval;
4791 CLOSE h_cursor;
4792
4793 SELECT BSC_SYS_PERIODICITY_ID_S.NEXTVAL INTO h_currval FROM DUAL;
4794 IF h_src_currval > h_currval THEN
4795 h_interval := h_src_currval - h_currval;
4796
4797 h_sql := 'ALTER SEQUENCE BSC_SYS_PERIODICITY_ID_S INCREMENT BY '||h_interval;
4798 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_SYS_PERIODICITY_ID_S');
4799
4800 SELECT BSC_SYS_PERIODICITY_ID_S.NEXTVAL INTO h_currval FROM DUAL;
4801
4802 h_sql := 'ALTER SEQUENCE BSC_SYS_PERIODICITY_ID_S INCREMENT BY 1';
4803 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_SYS_PERIODICITY_ID_S');
4804 END IF;
4805
4806 -- 5. Migrate custom links
4807 IF BSC_APPS.APPS_ENV AND g_src_apps_flag THEN
4808 -- Source and target systems are in APPS
4809 IF NOT BSC_LAUNCH_PAD_PVT.Migrate_Custom_Links(g_db_link) THEN
4810 RAISE e_unexpected_error;
4811 END IF;
4812 ELSE
4813 -- Source or Target system is personal
4814 -- Update link_id to -1
4815 h_sql := 'UPDATE bsc_tab_view_labels_b
4816 SET link_id = -1
4817 WHERE label_type = 2';
4818 BSC_APPS.Execute_Immediate(h_sql);
4819 END IF;
4820
4821 -- 6. Fix CREATED_BY and LAST_UPDATED_BY columns of BSC_KPI_COMMENTS
4822 -- according to users in the target system.
4823 -- Update those columns in the target system with the USER_ID from FND_USER
4824 -- whose USER_NAME is the same in the source system.
4825 -- If a USER_ID do not have a corresponding USER_ID in the target system,
4826 -- it will be set to the USER_ID of the SYSADMIN user.
4827 IF BSC_APPS.APPS_ENV THEN
4828 -- Target system is APPS
4829 IF g_src_apps_flag THEN
4830 -- Source system is APPS
4831 h_sql := 'UPDATE bsc_kpi_comments c
4832 SET created_by = NVL((SELECT u.user_id
4833 FROM fnd_user u, fnd_user@'||g_db_link||' s
4834 WHERE u.user_name = s.user_name AND
4835 c.created_by = s.user_id), :1),
4836 last_updated_by = NVL((SELECT u.user_id
4837 FROM fnd_user u, fnd_user@'||g_db_link||' s
4838 WHERE u.user_name = s.user_name AND
4839 c.last_updated_by = s.user_id), :2)';
4840 execute immediate h_sql using g_sysadmin_user_id, g_sysadmin_user_id;
4841 ELSE
4842 -- Source system is Personal
4843 h_sql := 'UPDATE bsc_kpi_comments c
4844 SET created_by = :1,
4845 last_updated_by = :2';
4846 execute immediate h_sql using g_sysadmin_user_id, g_sysadmin_user_id;
4847 END IF;
4848 END IF;
4849
4850 -- 7. Reset sequence BSC_KPI_COMMENTS_ID_S to start with at least the same current value of the sequence
4851 -- in the source system.
4852 h_sql := 'SELECT BSC_KPI_COMMENTS_ID_S.NEXTVAL@'||g_db_link||' FROM DUAL';
4853 OPEN h_cursor FOR h_sql;
4854 FETCH h_cursor INTO h_src_currval;
4855 CLOSE h_cursor;
4856
4857 SELECT BSC_KPI_COMMENTS_ID_S.NEXTVAL INTO h_currval FROM DUAL;
4858 IF h_src_currval > h_currval THEN
4859 h_interval := h_src_currval - h_currval;
4860
4861 h_sql := 'ALTER SEQUENCE BSC_KPI_COMMENTS_ID_S INCREMENT BY '||h_interval;
4862 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_KPI_COMMENTS_ID_S');
4863
4864 SELECT BSC_KPI_COMMENTS_ID_S.NEXTVAL INTO h_currval FROM DUAL;
4865
4866 h_sql := 'ALTER SEQUENCE BSC_KPI_COMMENTS_ID_S INCREMENT BY 1';
4867 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_KPI_COMMENTS_ID_S');
4868 END IF;
4869
4870 -- 8. Add TAB_ID -1 in BSC_TAB_IND_GROUPS_B and BSC_TAB_IND_GROUPS_TL
4871 INSERT INTO BSC_TAB_IND_GROUPS_TL (TAB_ID,CSF_ID,IND_GROUP_ID,LANGUAGE,SOURCE_LANG,NAME,HELP)
4872 SELECT -1,CSF_ID,IND_GROUP_ID,LANGUAGE,MIN(SOURCE_LANG),MIN(NAME),MIN(HELP)
4873 FROM BSC_TAB_IND_GROUPS_TL
4874 GROUP BY -1,CSF_ID,IND_GROUP_ID,LANGUAGE;
4875
4876 INSERT INTO BSC_TAB_IND_GROUPS_B (TAB_ID,CSF_ID,IND_GROUP_ID,GROUP_TYPE,NAME_POSITION,
4877 NAME_JUSTIFICATION,LEFT_POSITION,TOP_POSITION,WIDTH,HEIGHT,SHORT_NAME)
4878 SELECT -1,CSF_ID,IND_GROUP_ID,MIN(GROUP_TYPE),MIN(NAME_POSITION),
4879 MIN(NAME_JUSTIFICATION),MIN(LEFT_POSITION),MIN(TOP_POSITION),MIN(WIDTH),MIN(HEIGHT),SHORT_NAME
4880 FROM BSC_TAB_IND_GROUPS_B
4881 GROUP BY -1,CSF_ID,IND_GROUP_ID,SHORT_NAME;
4882
4883 -- 9. Fix OWNER_ID in BSC_TABS_B according to users in the target system.
4884 -- Update this column in the target system with the USER_ID from FND_USER
4885 -- whose USER_NAME is the same in the source system.
4886 -- If a USER_ID do not have a corresponding USER_ID in the target system,
4887 -- it will be set to the USER_ID of the SYSADMIN user.
4888 IF BSC_APPS.APPS_ENV THEN
4889 -- Target system is APPS
4890 IF g_src_apps_flag THEN
4891 -- Source system is APPS
4892 h_sql := 'UPDATE bsc_tabs_b c
4893 SET owner_id = NVL((SELECT u.user_id
4894 FROM fnd_user u, fnd_user@'||g_db_link||' s
4895 WHERE u.user_name = s.user_name AND
4896 c.owner_id = s.user_id), :1)';
4897 execute immediate h_sql using g_sysadmin_user_id;
4898 ELSE
4899 -- Source system is Personal
4900 h_sql := 'UPDATE bsc_tabs_b
4901 SET owner_id = :1';
4902 execute immediate h_sql using g_sysadmin_user_id;
4903 END IF;
4904 END IF;
4905
4906 -- 10. Set PARENT_TAB_ID to NULL in BSC_TABS_B for tabs whose parent was not migrated.
4907 UPDATE bsc_tabs_b
4908 SET parent_tab_id = NULL
4909 WHERE
4910 parent_tab_id NOT IN (
4911 SELECT tab_id
4912 FROM bsc_tabs_b
4913 );
4914
4915 -- 11. Reset sequence BSC_INTERNAL_COLUMN_S to start with at least the same current value of the sequence
4916 -- in the source system.
4917 h_sql := 'SELECT BSC_INTERNAL_COLUMN_S.NEXTVAL@'||g_db_link||' FROM DUAL';
4918 OPEN h_cursor FOR h_sql;
4919 FETCH h_cursor INTO h_src_currval;
4920 CLOSE h_cursor;
4921
4922 SELECT BSC_INTERNAL_COLUMN_S.NEXTVAL INTO h_currval FROM DUAL;
4923 IF h_src_currval > h_currval THEN
4924 h_interval := h_src_currval - h_currval;
4925
4926 h_sql := 'ALTER SEQUENCE BSC_INTERNAL_COLUMN_S INCREMENT BY '||h_interval;
4927 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_INTERNAL_COLUMN_S');
4928
4929 SELECT BSC_INTERNAL_COLUMN_S.NEXTVAL INTO h_currval FROM DUAL;
4930
4931 h_sql := 'ALTER SEQUENCE BSC_INTERNAL_COLUMN_S INCREMENT BY 1';
4932 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_INTERNAL_COLUMN_S');
4933 END IF;
4934
4935 -- 12. Reset sequence BSC_SYS_DIM_LEVEL_ID_S to start with at least the same current value of the sequence
4936 -- in the source system.
4937 h_sql := 'SELECT BSC_SYS_DIM_LEVEL_ID_S.NEXTVAL@'||g_db_link||' FROM DUAL';
4938 OPEN h_cursor FOR h_sql;
4939 FETCH h_cursor INTO h_src_currval;
4940 CLOSE h_cursor;
4941
4942 SELECT BSC_SYS_DIM_LEVEL_ID_S.NEXTVAL INTO h_currval FROM DUAL;
4943 IF h_src_currval > h_currval THEN
4944 h_interval := h_src_currval - h_currval;
4945
4946 h_sql := 'ALTER SEQUENCE BSC_SYS_DIM_LEVEL_ID_S INCREMENT BY '||h_interval;
4947 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_SYS_DIM_LEVEL_ID_S');
4948
4949 SELECT BSC_SYS_DIM_LEVEL_ID_S.NEXTVAL INTO h_currval FROM DUAL;
4950
4951 h_sql := 'ALTER SEQUENCE BSC_SYS_DIM_LEVEL_ID_S INCREMENT BY 1';
4952 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_SYS_DIM_LEVEL_ID_S');
4953 END IF;
4954
4955 -- 13. Reset sequence BSC_SYS_DIM_GROUP_ID_S to start with at least the same current value of the sequence
4956 -- in the source system.
4957 h_sql := 'SELECT BSC_SYS_DIM_GROUP_ID_S.NEXTVAL@'||g_db_link||' FROM DUAL';
4958 OPEN h_cursor FOR h_sql;
4959 FETCH h_cursor INTO h_src_currval;
4960 CLOSE h_cursor;
4961
4962 SELECT BSC_SYS_DIM_GROUP_ID_S.NEXTVAL INTO h_currval FROM DUAL;
4963 IF h_src_currval > h_currval THEN
4964 h_interval := h_src_currval - h_currval;
4965
4966 h_sql := 'ALTER SEQUENCE BSC_SYS_DIM_GROUP_ID_S INCREMENT BY '||h_interval;
4967 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_SYS_DIM_GROUP_ID_S');
4968
4969 SELECT BSC_SYS_DIM_GROUP_ID_S.NEXTVAL INTO h_currval FROM DUAL;
4970
4971 h_sql := 'ALTER SEQUENCE BSC_SYS_DIM_GROUP_ID_S INCREMENT BY 1';
4972 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_SYS_DIM_GROUP_ID_S');
4973 END IF;
4974
4975 -- 14. Reset sequence BSC_SYS_DATASET_ID_S to start with at least the same current value of the sequence
4976 -- in the source system.
4977 h_sql := 'SELECT BSC_SYS_DATASET_ID_S.NEXTVAL@'||g_db_link||' FROM DUAL';
4978 OPEN h_cursor FOR h_sql;
4979 FETCH h_cursor INTO h_src_currval;
4980 CLOSE h_cursor;
4981
4982 SELECT BSC_SYS_DATASET_ID_S.NEXTVAL INTO h_currval FROM DUAL;
4983 IF h_src_currval > h_currval THEN
4984 h_interval := h_src_currval - h_currval;
4985
4986 h_sql := 'ALTER SEQUENCE BSC_SYS_DATASET_ID_S INCREMENT BY '||h_interval;
4987 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_SYS_DATASET_ID_S');
4988
4989 SELECT BSC_SYS_DATASET_ID_S.NEXTVAL INTO h_currval FROM DUAL;
4990
4991 h_sql := 'ALTER SEQUENCE BSC_SYS_DATASET_ID_S INCREMENT BY 1';
4992 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_SYS_DATASET_ID_S');
4993 END IF;
4994
4995 -- 15. Reset sequence BSC_SYS_MEASURE_ID_S to start with at least the same current value of the sequence
4996 -- in the source system.
4997 h_sql := 'SELECT BSC_SYS_MEASURE_ID_S.NEXTVAL@'||g_db_link||' FROM DUAL';
4998 OPEN h_cursor FOR h_sql;
4999 FETCH h_cursor INTO h_src_currval;
5000 CLOSE h_cursor;
5001
5002 SELECT BSC_SYS_MEASURE_ID_S.NEXTVAL INTO h_currval FROM DUAL;
5003 IF h_src_currval > h_currval THEN
5004 h_interval := h_src_currval - h_currval;
5005
5006 h_sql := 'ALTER SEQUENCE BSC_SYS_MEASURE_ID_S INCREMENT BY '||h_interval;
5007 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_SYS_MEASURE_ID_S');
5008
5009 SELECT BSC_SYS_MEASURE_ID_S.NEXTVAL INTO h_currval FROM DUAL;
5010
5011 h_sql := 'ALTER SEQUENCE BSC_SYS_MEASURE_ID_S INCREMENT BY 1';
5012 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_SYS_MEASURE_ID_S');
5013 END IF;
5014
5015 -- 16. Reset sequence BSC_DB_MEASURE_GROUPS_S to start with at least the same current value of the sequence
5016 -- in the source system.
5017 h_sql := 'SELECT BSC_DB_MEASURE_GROUPS_S.NEXTVAL@'||g_db_link||' FROM DUAL';
5018 OPEN h_cursor FOR h_sql;
5019 FETCH h_cursor INTO h_src_currval;
5020 CLOSE h_cursor;
5021
5022 SELECT BSC_DB_MEASURE_GROUPS_S.NEXTVAL INTO h_currval FROM DUAL;
5023 IF h_src_currval > h_currval THEN
5024 h_interval := h_src_currval - h_currval;
5025
5026 h_sql := 'ALTER SEQUENCE BSC_DB_MEASURE_GROUPS_S INCREMENT BY '||h_interval;
5027 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_DB_MEASURE_GROUPS_S');
5028
5029 SELECT BSC_DB_MEASURE_GROUPS_S.NEXTVAL INTO h_currval FROM DUAL;
5030
5031 h_sql := 'ALTER SEQUENCE BSC_DB_MEASURE_GROUPS_S INCREMENT BY 1';
5032 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_DB_MEASURE_GROUPS_S');
5033 END IF;
5034
5035 -- 17. Reset sequence BSC_INDICATOR_ID_S to start with at least the same current value of the sequence
5036 -- in the source system.
5037 h_sql := 'SELECT BSC_INDICATOR_ID_S.NEXTVAL@'||g_db_link||' FROM DUAL';
5038 OPEN h_cursor FOR h_sql;
5039 FETCH h_cursor INTO h_src_currval;
5040 CLOSE h_cursor;
5041
5042 SELECT BSC_INDICATOR_ID_S.NEXTVAL INTO h_currval FROM DUAL;
5043 IF h_src_currval > h_currval THEN
5044 h_interval := h_src_currval - h_currval;
5045
5046 h_sql := 'ALTER SEQUENCE BSC_INDICATOR_ID_S INCREMENT BY '||h_interval;
5047 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_INDICATOR_ID_S');
5048
5049 SELECT BSC_INDICATOR_ID_S.NEXTVAL INTO h_currval FROM DUAL;
5050
5051 h_sql := 'ALTER SEQUENCE BSC_INDICATOR_ID_S INCREMENT BY 1';
5052 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_INDICATOR_ID_S');
5053 END IF;
5054
5055 -- 18. Reset sequence BSC_KPI_MEASURE_S to start with at least the same current value of the sequence
5056 -- in the source system.
5057 h_sql := 'SELECT BSC_KPI_MEASURE_S.NEXTVAL@'||g_db_link||' FROM DUAL';
5058 OPEN h_cursor FOR h_sql;
5059 FETCH h_cursor INTO h_src_currval;
5060 CLOSE h_cursor;
5061
5062 SELECT BSC_KPI_MEASURE_S.NEXTVAL INTO h_currval FROM DUAL;
5063 IF h_src_currval > h_currval THEN
5064 h_interval := h_src_currval - h_currval;
5065
5066 h_sql := 'ALTER SEQUENCE BSC_KPI_MEASURE_S INCREMENT BY '||h_interval;
5067 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_KPI_MEASURE_S');
5068
5069 SELECT BSC_KPI_MEASURE_S.NEXTVAL INTO h_currval FROM DUAL;
5070
5071 h_sql := 'ALTER SEQUENCE BSC_KPI_MEASURE_S INCREMENT BY 1';
5072 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_KPI_MEASURE_S');
5073 END IF;
5074
5075 -- 18. Reset sequence BSC_COLOR_RANGE_ID_S to start with at least the same current value of the sequence
5076 -- in the source system.
5077 h_sql := 'SELECT BSC_COLOR_RANGE_ID_S.NEXTVAL@'||g_db_link||' FROM DUAL';
5078 OPEN h_cursor FOR h_sql;
5079 FETCH h_cursor INTO h_src_currval;
5080 CLOSE h_cursor;
5081
5082 SELECT BSC_COLOR_RANGE_ID_S.NEXTVAL INTO h_currval FROM DUAL;
5083 IF h_src_currval > h_currval THEN
5084 h_interval := h_src_currval - h_currval;
5085
5086 h_sql := 'ALTER SEQUENCE BSC_COLOR_RANGE_ID_S INCREMENT BY '||h_interval;
5087 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_COLOR_RANGE_ID_S');
5088
5089 SELECT BSC_COLOR_RANGE_ID_S.NEXTVAL INTO h_currval FROM DUAL;
5090
5091 h_sql := 'ALTER SEQUENCE BSC_COLOR_RANGE_ID_S INCREMENT BY 1';
5092 BSC_APPS.Do_DDL(h_sql, AD_DDL.ALTER_SEQUENCE, 'BSC_COLOR_RANGE_ID_S');
5093 END IF;
5094
5095 RETURN TRUE;
5096
5097 EXCEPTION
5098 WHEN e_unexpected_error THEN
5099 BSC_MESSAGE.Add (x_message => BSC_APPS.Get_Message('BSC_MIG_FAIL_EXEC'),
5100 x_source => 'BSC_MIGRATION.Migrate_Metadata');
5101 RETURN FALSE;
5102
5103 WHEN OTHERS THEN
5104 BSC_MESSAGE.Add (x_message => SQLERRM,
5105 x_source => 'BSC_MIGRATION.Migrate_Metadata');
5106 RETURN FALSE;
5107 END Migrate_Metadata;
5108
5109 /*===========================================================================+
5110 | FUNCTION get_previous_migration_status
5111 +============================================================================*/
5112 FUNCTION get_previous_migration_status RETURN boolean IS
5113 CURSOR cTable IS
5114 SELECT property_value FROM
5115 bsc_sys_init WHERE property_code = 'TARGET_STATUS';
5116
5117 l_value VARCHAR2(400);
5118 BEGIN
5119 OPEN cTable;
5120 FETCH cTable into l_value;
5121 CLOSE cTable;
5122 IF (l_value <> 'UNAPPLIED') THEN -- unapplied indicates error or process failure
5123 return true;
5124 ELSE
5125 return false;
5126 END IF;
5127
5128 END;
5129
5130
5131 /*===========================================================================+
5132 | FUNCTION table_exists
5133 +============================================================================*/
5134 FUNCTION table_exists(pTableName IN VARCHAR2, pSchema IN VARCHAR2) return boolean IS
5135 CURSOR cTable IS
5136 SELECT COUNT(1) FROM
5137 ALL_TABLES WHERE TABLE_NAME = pTableName
5138 AND OWNER = pSchema;
5139 l_count NUMBER := 0;
5140 BEGIN
5141 OPEN cTable;
5142 FETCH cTable into l_Count;
5143 CLOSE cTable;
5144 IF (l_count = 0) THEN
5145 return false;
5146 ELSE
5147 return true;
5148 END IF;
5149
5150 END;
5151
5152 PROCEDURE create_comment_backup_table IS
5153 l_stmt VARCHAR2(4000) := 'CREATE TABLE '||c_comments_bak||' AS
5154 SELECT
5155 CMT.INDICATOR,
5156 CMT.YEAR,
5157 CMT.PERIODICITY_ID,
5158 CMT.PERIOD_ID,
5159 CMT.TREND_FLAG,
5160 CMT.COMMENT_TEXT,
5161 CMT.COMMENT_TYPE,
5162 CMT.CREATED_BY,
5163 CMT.CREATION_DATE,
5164 CMT.LAST_UPDATED_BY,
5165 CMT.LAST_UPDATE_DATE,
5166 CMT.LAST_UPDATE_LOGIN,
5167 CMT.COMMENT_SUBJECT,
5168 CMT.COMMENT_ID,
5169 ''N'' PRESERVE_FLAG,
5170 1000000 CONC_REQUEST_ID,
5171 sysdate MIGRATION_DATE
5172 FROM
5173 BSC_KPI_COMMENTS CMT,
5174 BSC_KPIS_B TGT
5175 WHERE
5176 CMT.INDICATOR = TGT.INDICATOR';
5177 e_unexpected_error EXCEPTION;
5178 BEGIN
5179
5180 BSC_APPS.Do_DDL(l_stmt, AD_DDL.CREATE_TABLE, c_comments_bak);
5181 EXCEPTION
5182 WHEN OTHERS THEN
5183 BSC_MESSAGE.Add (x_message => SQLERRM,
5184 x_source => 'BSC_MIGRATION.create_comment_backup_table');
5185 RAISE e_unexpected_error;
5186
5187 END;
5188
5189 PROCEDURE update_comment_backup_table IS
5190 l_stmt VARCHAR2(4000) ;
5191 e_unexpected_error EXCEPTION;
5192 BEGIN
5193
5194 l_stmt := 'UPDATE '||c_comments_bak||' set preserve_flag = :1 where indicator in
5195 (SELECT TGT.INDICATOR FROM
5196 BSC_KPIS_B TGT,
5197 BSC_KPIS_B@'||g_db_link||' SRC
5198 WHERE
5199 TGT.INDICATOR = SRC.INDICATOR
5200 AND TGT.CREATION_DATE = SRC.CREATION_DATE)';
5201 execute immediate l_stmt using 'Y';
5202
5203 -- new req. : need conc program id and migration_date
5204 -- note that this cannot be a part of the creation as the migration could have failed
5205 -- after table creation : the next migration will NOT create the backup table but will reuse it
5206 -- hence we need to update the conc_request_id to the current request id
5207
5208 l_stmt := 'UPDATE '||c_comments_bak||' set CONC_REQUEST_ID = :1, migration_date = :2';
5209 execute immediate l_stmt USING fnd_global.CONC_REQUEST_ID, sysdate;
5210
5211 EXCEPTION
5212 WHEN OTHERS THEN
5213 BSC_MESSAGE.Add (x_message => SQLERRM,
5214 x_source => 'BSC_MIGRATION.update_comment_backup_table');
5215 RAISE e_unexpected_error;
5216
5217 END;
5218
5219
5220 /*===========================================================================+
5221 | FUNCTION Backup_Comments
5222 +============================================================================*/
5223 FUNCTION Backup_Comments return boolean IS
5224 e_unexpected_error EXCEPTION;
5225 BEGIN
5226
5227 -- for testing comments APIs
5228 IF (BSC_APPS.bsc_apps_schema IS NULL) THEN
5229 BSC_APPS.Init_BSC_APPS;
5230 END IF;
5231
5232 IF (get_previous_migration_status) THEN
5233 IF table_exists(c_comments_bak, BSC_APPS.bsc_apps_schema) THEN
5234 BSC_APPS.Do_DDL('DROP TABLE '||c_comments_bak, AD_DDL.DROP_TABLE, c_comments_bak);
5235 END IF;
5236 create_comment_backup_table;
5237 ELSE
5238 IF NOT table_exists(c_comments_bak, BSC_APPS.bsc_apps_schema) THEN
5239 create_comment_backup_table;
5240 END IF;
5241 END IF;
5242
5243 update_comment_backup_table ;
5244
5245 return true;
5246 EXCEPTION
5247 WHEN OTHERS THEN
5248 BSC_MESSAGE.Add (x_message => SQLERRM,
5249 x_source => 'BSC_MIGRATION.Backup_Comments');
5250 raise;
5251 RAISE e_unexpected_error;
5252 END;
5253
5254 /*===========================================================================+
5255 | FUNCTION Restore_Comments
5256 +============================================================================*/
5257 FUNCTION Restore_Comments return boolean IS
5258 l_stmt VARCHAR2(4000);
5259 l_preserve_flag VARCHAR2(10);
5260 e_unexpected_error EXCEPTION;
5261
5262 BEGIN
5263 l_preserve_flag := g_adv_mig_features;
5264
5265 IF (l_preserve_flag IS NULL) THEN
5266 -- User want to remove comments from the target after migration
5267 l_stmt := 'delete bsc_kpi_comments ';
5268 EXECUTE IMMEDIATE l_stmt;
5269 RETURN true;
5270 END IF;
5271
5272 IF (l_preserve_flag = 'N') THEN
5273 --User wants to migrate comments from the source. bsc_kpi_comments was already migrated.
5274 RETURN true;
5275 END IF;
5276
5277 -- User wants to preserve the comments already existing in the target
5278
5279 --l_stmt := 'delete bsc_kpi_comments where indicator in
5280 -- (select distinct indicator from bsc_kpi_comments_bak where preserve_flag = :1)';
5281 --EXECUTE IMMEDIATE l_stmt USING 'Y';
5282
5283 l_stmt := 'delete bsc_kpi_comments '; -- preserve target or source fully. no mix and match.
5284 EXECUTE IMMEDIATE l_stmt;
5285
5286
5287 l_stmt := 'INSERT INTO BSC_KPI_COMMENTS
5288 (INDICATOR,
5289 YEAR,
5290 PERIODICITY_ID,
5291 PERIOD_ID,
5292 TREND_FLAG,
5293 COMMENT_TEXT,
5294 COMMENT_TYPE,
5295 CREATED_BY,
5296 CREATION_DATE,
5297 LAST_UPDATED_BY,
5298 LAST_UPDATE_DATE,
5299 LAST_UPDATE_LOGIN,
5300 COMMENT_SUBJECT,
5301 COMMENT_ID)
5302 SELECT
5303 CMT.INDICATOR,
5304 CMT.YEAR,
5305 CMT.PERIODICITY_ID,
5306 CMT.PERIOD_ID,
5307 CMT.TREND_FLAG,
5308 CMT.COMMENT_TEXT,
5309 CMT.COMMENT_TYPE,
5310 CMT.CREATED_BY,
5311 CMT.CREATION_DATE,
5312 CMT.LAST_UPDATED_BY,
5313 CMT.LAST_UPDATE_DATE,
5314 CMT.LAST_UPDATE_LOGIN,
5315 CMT.COMMENT_SUBJECT,
5316 CMT.COMMENT_ID
5317 FROM
5318 BSC_KPI_COMMENTS_BAK CMT,
5319 BSC_KPIS_B KPIS
5320 WHERE PRESERVE_FLAG = :1
5321 AND CMT.indicator = kpis.indicator';
5322
5323 EXECUTE IMMEDIATE l_stmt USING 'Y';
5324 return true;
5325
5326 EXCEPTION
5327 WHEN OTHERS THEN
5328 BSC_MESSAGE.Add (x_message => SQLERRM,
5329 x_source => 'BSC_MIGRATION.Restore_Comments');
5330 RAISE e_unexpected_error;
5331 return false;
5332 END;
5333
5334
5335 /*===========================================================================+
5336 | PROCEDURE Migrate_System
5337 +============================================================================*/
5338 PROCEDURE Migrate_System(
5339 x_src_responsibilities IN VARCHAR2,
5340 x_trg_responsibilities IN VARCHAR2,
5341 x_tab_filter IN VARCHAR2 := NULL,
5342 x_kpi_filter IN VARCHAR2 := NULL,
5343 x_overwrite IN VARCHAR2 := 'N'
5344 ) IS
5345
5346 e_unexpected_error EXCEPTION;
5347 e_creating_dbi_dim_tables EXCEPTION;
5348 e_warning_raised EXCEPTION; --BUG FIX 6004972
5349 e_load_rpt_cal EXCEPTION;
5350 h_src_responsibilities VARCHAR2(32000) := NULL;
5351 h_trg_responsibilities VARCHAR2(32000) := NULL;
5352 h_tab_filter VARCHAR2(32000) := NULL;
5353 h_kpi_filter VARCHAR2(32000) := NULL;
5354 h_overwrite VARCHAR2(32000) := NULL;
5355 h_adv_mig_features VARCHAR2(32000) := NULL;
5356
5357 h_log_file_name VARCHAR2(200);
5358
5359 h_b BOOLEAN;
5360 h_error_msg VARCHAR2(4000);
5361 h_validation_error VARCHAR2(4000);
5362
5363 h_sql VARCHAR2(32000);
5364 TYPE t_cursor IS REF CURSOR;
5365 h_cursor t_cursor;
5366
5367 h_object VARCHAR2(30);
5368 h_src_bsc_schema VARCHAR2(30);
5369 h_sysadmin_user_id NUMBER;
5370
5371 h_application_name VARCHAR2(240);
5372 h_indicator NUMBER;
5373 h_name VARCHAR2(200);
5374 h_short_name VARCHAR2(200);
5375
5376 h_i NUMBER;
5377 h_condition VARCHAR2(32000);
5378
5379 --BSC-MV Note: New variables
5380 h_error_implement_mv VARCHAR2(2000) := NULL;
5381 e_error_implement_mv EXCEPTION;
5382 h_table VARCHAR2(30);
5383 h_base_tables BSC_UPDATE_UTIL.t_array_of_varchar2;
5384 h_num_base_tables NUMBER;
5385 h_base_message_v VARCHAR2(4000);
5386 h_message VARCHAR2(4000);
5387
5388 CURSOR c_indic_sum_level (pIndicator NUMBER, pPropertyCode VARCHAR2) IS
5389 SELECT property_value
5390 FROM bsc_kpi_properties
5391 WHERE indicator = pIndicator
5392 AND property_code = pPropertyCode;
5393
5394 h_sum_level_prop_code VARCHAR2(20) := 'ADV_SUM_LEVEL';
5395 h_kpi_sum_level NUMBER;
5396 h_prototype_flag NUMBER;
5397
5398 h_dbi_table_name VARCHAR2(30);
5399 h_dbi_short_name VARCHAR2(30);
5400
5401 --AW_INTEGRATION: new variables
5402 h_dim_level_list dbms_sql.varchar2_table;
5403 h_kpi_list dbms_sql.varchar2_table;
5404 h_calendar_id NUMBER;
5405 h_level_table_name VARCHAR2(50);
5406 h_dim_tables BSC_UPDATE_UTIL.t_array_of_varchar2;
5407 h_num_dim_tables NUMBER;
5408
5409 h_report_type VARCHAR2(2000);
5410
5411 h_lst_columns VARCHAR2(32700);
5412 BEGIN
5413
5414 -- Initializes global variables
5415
5416 -- Init g_warnings
5417 g_warnings := FALSE;
5418
5419 -- Initialize BSC/APPS global variables
5420 BSC_APPS.Init_Bsc_Apps;
5421
5422 -- Initializes the error message stack
5423 BSC_MESSAGE.Init(g_debug_flag);
5424
5425 -- Initialize the temporal table used for big 'in' conditions
5426 BSC_APPS.Init_Big_In_Cond_Table;
5427
5428 -- Initiliaze log file
5429 h_log_file_name := 'bscmig40.log';
5430 IF NOT BSC_APPS.Init_Log_File(h_log_file_name, h_error_msg) THEN
5431 BSC_MESSAGE.Add(x_message => h_error_msg,
5432 x_source => 'BSC_MIGRATION.Migrate_System');
5433 RAISE e_unexpected_error;
5434 END IF;
5435
5436 /*
5437 -- TRACE ----------------------------------------------------------------
5438 -- Set sql trace
5439 execute immediate 'alter session set MAX_DUMP_FILE_SIZE=UNLIMITED';
5440 execute immediate 'alter session set tracefile_identifier=''BSCMIG''';
5441 execute immediate 'alter session set sql_trace=true';
5442 --execute immediate 'alter session set events= ''10046 trace name context forever, level 8''';
5443 -- ----------------------------------------------------------------------------------
5444 */
5445
5446 -- Fix performance bug#3860149
5447 h_sql := 'alter session set hash_area_size=50000000';
5448 BSC_APPS.Execute_Immediate(h_sql);
5449 h_sql := 'alter session set sort_area_size=50000000';
5450 BSC_APPS.Execute_Immediate(h_sql);
5451 commit;
5452 h_sql := 'alter session enable parallel dml';
5453 BSC_APPS.Execute_Immediate(h_sql);
5454 commit;
5455
5456
5457 -- Alter session set global_names = false to disable the enforcement
5458 -- of database link name must be equals to remote database name.
5459 h_sql := 'ALTER SESSION SET GLOBAL_NAMES = FALSE';
5460 BSC_APPS.Execute_Immediate(h_sql);
5461
5462
5463 -- Get parameters from BSC_DB_LOADER_CONTROL
5464 Get_Migration_Parameters(
5465 p_process_id => x_src_responsibilities,
5466 x_src_responsibilities => h_src_responsibilities,
5467 x_trg_responsibilities => h_trg_responsibilities,
5468 x_tab_filter => h_tab_filter,
5469 x_kpi_filter => h_kpi_filter,
5470 x_overwrite => h_overwrite,
5471 x_adv_mig_features => h_adv_mig_features,
5472 x_db_link => g_db_link
5473 );
5474 g_adv_mig_features := h_adv_mig_features;
5475
5476
5477 IF NOT (Backup_Comments) THEN
5478 RAISE e_unexpected_error;
5479 END IF;
5480
5481 -- create temp table to hold CODE COLUMN TYPE
5482 --Bug 3919106
5483 --check if the temp table for col datatype has already been created
5484 --if false drop the table and create it again
5485 if(BSC_OLAP_MAIN.b_table_col_type_created=false)then
5486 BSC_OLAP_MAIN.drop_tmp_col_type_table;
5487 if(BSC_OLAP_MAIN.create_tmp_col_type_table(h_error_msg)) then
5488 BSC_OLAP_MAIN.b_table_col_type_created := true;
5489 else
5490 --Raise exception;
5491 BSC_MESSAGE.Add(x_message => h_error_msg,
5492 x_source => 'BSC_MIGRATION.Migrate_System');
5493 RAISE e_unexpected_error;
5494 end if;
5495 end if;
5496
5497 -- Validations
5498
5499 -- Validate x_overwrite is 'Y'
5500 IF h_overwrite <> 'Y' THEN
5501 h_validation_error := BSC_APPS.Get_Message('BSC_MIG_CONFIRM_OVERW');
5502 BSC_APPS.Write_Line_Log(h_validation_error, BSC_APPS.OUTPUT_FILE);
5503 BSC_MESSAGE.Add(x_message => h_validation_error,
5504 x_source => 'BSC_MIGRATION.Migrate_System');
5505 RAISE e_unexpected_error;
5506 END IF;
5507
5508 -- Validate that the source and target system are same version
5509 IF NOT Validate_System_Versions(h_validation_error) THEN
5510 BSC_APPS.Write_Line_Log(h_validation_error, BSC_APPS.OUTPUT_FILE);
5511 BSC_MESSAGE.Add(x_message => h_validation_error,
5512 x_source => 'BSC_MIGRATION.Migrate_System');
5513 RAISE e_unexpected_error;
5514 END IF;
5515
5516 -- Validate the given source and target responsibilities
5517 -- By the way initialize the array g_src_resps and g_trg_resps
5518 IF NOT Validate_Responsibilities(h_src_responsibilities,
5519 h_trg_responsibilities,
5520 h_validation_error) THEN
5521 BSC_APPS.Write_Line_Log(h_validation_error, BSC_APPS.OUTPUT_FILE);
5522 BSC_MESSAGE.Add(x_message => h_validation_error,
5523 x_source => 'BSC_MIGRATION.Migrate_System');
5524 RAISE e_unexpected_error;
5525 END IF;
5526
5527 -- Validate the given tab and kpi filters
5528 -- By the way initialize the array g_tabs_filter and g_kpis_filter
5529 IF NOT Validate_Filters(h_tab_filter,
5530 h_kpi_filter,
5531 h_validation_error) THEN
5532 BSC_APPS.Write_Line_Log(h_validation_error, BSC_APPS.OUTPUT_FILE);
5533 BSC_MESSAGE.Add(x_message => h_validation_error,
5534 x_source => 'BSC_MIGRATION.Migrate_System');
5535 RAISE e_unexpected_error;
5536 END IF;
5537
5538 --BSC-MV Note: Moved this code here
5539 -- Know if the source system is in apps or not
5540 h_sql := 'SELECT object_name FROM user_objects@'||g_db_link||
5541 ' WHERE object_name = :1';
5542 OPEN h_cursor FOR h_sql USING 'FND_USER';
5543 FETCH h_cursor INTO h_object;
5544 IF h_cursor%NOTFOUND THEN
5545 g_src_apps_flag := FALSE;
5546 ELSE
5547 g_src_apps_flag := TRUE;
5548 END IF;
5549 CLOSE h_cursor;
5550
5551 --BSC-MV Note: Get the advanced summarization level of the source.
5552 --The profile in the target system will be overwritten with the value
5553 --in the source.
5554 IF g_src_apps_flag THEN
5555 -- Read sum level from bsc_sys_init
5556 h_sql := 'SELECT property_value'||
5557 ' FROM bsc_sys_init@'||g_db_link||
5558 ' WHERE property_code = :1';
5559 OPEN h_cursor FOR h_sql USING h_sum_level_prop_code;
5560 FETCH h_cursor INTO g_adv_sum_level;
5561 IF h_cursor%NOTFOUND THEN
5562 g_adv_sum_level := NULL;
5563 END IF;
5564 CLOSE h_cursor;
5565 ELSE
5566 g_adv_sum_level := NULL;
5567 END IF;
5568
5569 -- Get BSC schema name in the source system
5570 IF g_src_apps_flag THEN
5571 h_sql := 'SELECT table_owner FROM user_synonyms@'||g_db_link||
5572 ' WHERE table_name = :1';
5573 OPEN h_cursor FOR h_sql USING 'BSC_SYS_INIT';
5574 FETCH h_cursor INTO h_src_bsc_schema;
5575 IF h_cursor%NOTFOUND THEN
5576 g_src_bsc_schema := NULL;
5577 ELSE
5578 g_src_bsc_schema := h_src_bsc_schema;
5579 END IF;
5580 CLOSE h_cursor;
5581 END IF;
5582
5583 --initialize g_sync flag bug fix 6004972
5584 g_syncup_done := FALSE;
5585
5586 -- Enh#4697749 Need to remove custom non-pre-seeded measures (BSC and PMF) from pmf repository
5587 IF NOT Remove_Custom_Measures_In_PMF THEN
5588 RAISE e_unexpected_error;
5589 END IF;
5590
5591 -- Enh#4697749 Need to remove custom non-pre-seeded dim objects (BSC and PMF) from pmf repository
5592 IF NOT Remove_Custom_Dim_Objs_In_PMF THEN
5593 RAISE e_unexpected_error;
5594 END IF;
5595
5596 -- Enh#4697749 Need to remove custom non-pre-seeded dimensions (BSC and PMF) from pmf repository
5597 IF NOT Remove_Custom_Dims_In_PMF THEN
5598 RAISE e_unexpected_error;
5599 END IF;
5600
5601 -- Init the arrays of tabs, kpis and tables that need to be considered
5602 -- in the source system to be migrated based on the source responsibilities
5603 -- and tab and kpi filters.
5604 IF NOT Init_Migration_Objects_Arrays THEN
5605 RAISE e_unexpected_error;
5606 END IF;
5607
5608 IF g_num_mig_kpis = 0 THEN
5609 --Fix bug#4220506 Write invalid PMF objects into the log file
5610 Write_Log_Invalid_PMF_Objects;
5611 --Fix bug 6004972, if there is any objective that could not be migrated
5612 -- non custom PMF data
5613 -- then we should not be throwing error that there are no objectives according to
5614 -- filters, in this case migration should finish with warning.
5615 IF g_num_no_mig_kpis = 0 THEN
5616 h_validation_error := BSC_APPS.Get_Message('BSC_MIG_NO_INDICATORS');
5617 BSC_APPS.Write_Line_Log(h_validation_error, BSC_APPS.OUTPUT_FILE);
5618 BSC_MESSAGE.Add(x_message => h_validation_error,
5619 x_source => 'BSC_MIGRATION.Migrate_System');
5620 RAISE e_unexpected_error;
5621 ELSE
5622 RAISE e_warning_raised;
5623 END IF;
5624 END IF;
5625
5626 -- Init array of metadata tables
5627 Init_Metadata_Tables_Array;
5628
5629 -- Bug#3854109: We are going to add a new validation to check that all the tables
5630 -- that are going to be migrated actually exists in the source system.
5631 -- If this happens we list in the log file those tables and the afferect kpis
5632 IF NOT Validate_Tables THEN
5633 -- log file already has the list of un-existing tavbles and affected indicators
5634 RAISE e_unexpected_error;
5635 END IF;
5636
5637 -- At this point, the system is inconsistent until everything have been migrated
5638 -- So, we flag the system like if it is not in the latest version.
5639 UPDATE bsc_sys_init
5640 SET property_value = 'UNAPPLIED',
5641 last_updated_by = BSC_APPS.fnd_global_user_id,
5642 last_update_date = SYSDATE
5643 WHERE property_code = 'TARGET_STATUS';
5644 COMMIT;
5645
5646 -- Drop all current dynamic tables in the target system (target system)
5647 IF Not Drop_Dynamic_Objects THEN
5648 RAISE e_unexpected_error;
5649 END IF;
5650
5651 -- Delete all records from Metadata tables (target system)
5652 IF NOT Delete_Metadata_Tables THEN
5653 RAISE e_unexpected_error;
5654 END IF;
5655
5656 -- Get the user_id of the SYSADMIN user in the target system
5657 IF BSC_APPS.APPS_ENV THEN
5658 -- The target system is APPS
5659 h_sql := 'SELECT user_id FROM fnd_user WHERE user_name = ''SYSADMIN''';
5660 OPEN h_cursor FOR h_sql;
5661 FETCH h_cursor INTO h_sysadmin_user_id;
5662 IF h_cursor%NOTFOUND THEN
5663 g_sysadmin_user_id := 0;
5664 ELSE
5665 g_sysadmin_user_id := h_sysadmin_user_id;
5666 END IF;
5667 CLOSE h_cursor;
5668 ELSE
5669 g_sysadmin_user_id := 0;
5670 END IF;
5671
5672 -- Migrate metadata
5673 IF NOT Migrate_Metadata THEN
5674 RAISE e_unexpected_error;
5675 END IF;
5676
5677 -- Delete metadata for invalid PMF objects: Measures, dimensions and dimension levels
5678 -- that do not exist in the target.
5679 -- The following arrays already has this information: g_invalid_measures,
5680 -- g_invalid_dimenisions and g_invalid_dim_levels
5681 Clean_Metadata_Invalid_PMF;
5682
5683
5684 -- we need to sync up dataset_ids between bis_indicators and bsc_sys_datasets_b
5685 -- because there can be many datasets pointing to same measure as measure_id1
5686 -- sync up is not able to handle this issue.
5687 -- bug 5990096
5688 syncup_dataset_id_in_target;
5689
5690 --for bug 5680620 handling of bsdc_sys_init table
5691 -- DELETE THE DATA FROM TABLE EXCEPT PATCH_NUMBER
5692 DELETE BSC_SYS_INIT where PROPERTY_CODE <> 'PATCH_NUMBER';
5693 --added commit for bug fix 6470015
5694 COMMIT;
5695
5696 -- COPY ROWS FROM TARGET TO THIS TABLE.
5697 h_lst_columns := Get_Lst_Table_Columns('BSC_SYS_INIT');
5698 h_sql := 'INSERT /*+ append parallel(BSC_SYS_INIT)*/'||
5699 ' INTO BSC_SYS_INIT ('||h_lst_columns||')'||
5700 ' SELECT /*+ parallel(BSC_SYS_INIT)*/ '||h_lst_columns||
5701 ' FROM BSC_SYS_INIT'||'@'||g_db_link ||
5702 ' WHERE PROPERTY_CODE <> ''PATCH_NUMBER'' AND PROPERTY_CODE <>''EDW_INSTALLED'' ';
5703 BSC_APPS.Execute_Immediate(h_sql);
5704 COMMIT;
5705
5706 -- At this point, the system is inconsistent until everything have been migrated
5707 -- So, we flag the system like if it is not in the latest version.
5708 -- I do it again because the records in BSC_SYS_INIT have been migrated from the source.
5709 UPDATE bsc_sys_init
5710 SET property_value = 'UNAPPLIED',
5711 last_updated_by = BSC_APPS.fnd_global_user_id,
5712 last_update_date = SYSDATE
5713 WHERE property_code = 'TARGET_STATUS';
5714 COMMIT;
5715
5716 -- Enh#4697749: Migrate AK Metadata and Form Functions of the Reports
5717 FOR h_i IN 1..g_num_mig_kpis LOOP
5718 h_sql := 'SELECT short_name'||
5719 ' FROM bsc_kpis_b'||
5720 ' WHERE indicator = :1';
5721 OPEN h_cursor FOR h_sql USING g_mig_kpis(h_i);
5722 FETCH h_cursor INTO h_short_name;
5723 CLOSE h_cursor;
5724 IF h_short_name IS NOT NULL THEN
5725 -- By design there is a form function and ak region called as the short name
5726 BSC_APPS.Write_Line_Log('Migrating report '||h_short_name, BSC_APPS.OUTPUT_FILE);
5727 IF NOT Migrate_AK_Region(h_short_name, h_error_msg) THEN
5728 BSC_APPS.Write_Line_Log('Error migrating AK Region '||h_short_name||': '||h_error_msg,
5729 BSC_APPS.OUTPUT_FILE);
5730 END IF;
5731 IF NOT Migrate_Form_Function(h_short_name, h_error_msg) THEN
5732 BSC_APPS.Write_Line_Log('Error migrating Form Function '||h_short_name||': '||h_error_msg,
5733 BSC_APPS.OUTPUT_FILE);
5734 END IF;
5735 END IF;
5736 END LOOP;
5737
5738 -- ----------------------------------------------------------------------------
5739 -- Create dynamic objects
5740 IF NOT Create_Dynamic_Objects THEN
5741 RAISE e_unexpected_error;
5742 END IF;
5743
5744 -- Migrate dynamic tables
5745 IF NOT Migrate_Dynamic_Tables_Data THEN
5746 RAISE e_unexpected_error;
5747 END IF;
5748
5749 -- Create indexes on dynamic tables
5750 -- Fix performance bug#3860149: indexes are going to be created in parallel
5751 -- for that reason we need the following commands
5752 commit;
5753 h_sql := 'alter session force parallel query';
5754 BSC_APPS.Execute_Immediate(h_sql);
5755 commit;
5756 h_sql := 'alter session enable parallel dml';
5757 BSC_APPS.Execute_Immediate(h_sql);
5758 commit;
5759
5760 IF NOT Create_Indexes_Dynamic_Tables THEN
5761 RAISE e_unexpected_error;
5762 END IF;
5763
5764 commit;
5765 h_sql := 'alter session disable parallel dml';
5766 BSC_APPS.Execute_Immediate(h_sql);
5767 commit;
5768 h_sql := 'alter session disable parallel query';
5769 BSC_APPS.Execute_Immediate(h_sql);
5770 commit;
5771 h_sql := 'alter session enable parallel dml';
5772 BSC_APPS.Execute_Immediate(h_sql);
5773 commit;
5774
5775 -- Fix performance bug#3860149: analyze base and dimension tables
5776 IF NOT Analyze_Base_And_Dim_Tables THEN
5777 RAISE e_unexpected_error;
5778 END IF;
5779
5780 -- ---------------------------------------------------------------------
5781
5782 -- Fix _TL tables according to supported languages in target system
5783 IF NOT Check_Languages_TL_Tables THEN
5784 RAISE e_unexpected_error;
5785 END IF;
5786
5787 -- Assign target responsibilities
5788 IF NOT Assign_Target_Responsibilities THEN
5789 RAISE e_unexpected_error;
5790 END IF;
5791
5792 COMMIT;
5793
5794 -- changes for bug fix 6004972
5795 -- --------------------------------------------------------------------
5796 -- Synchronize Dimensions and Measures between BSC-PMF
5797 -- --------------------------------------------------------------------
5798 sync_bis_bsc_metadata(h_error_msg);
5799 g_syncup_done := TRUE;
5800 -- ---------------------------------------------------------------------
5801
5802 -- Bug#3138718 Description of the dimensions is not migrated
5803 -- Description is stored only in BIS_DIMENSIONS
5804 -- We need to update the description ONLY FOR BSC DIMENSIONS
5805 -- with the value from the source system
5806 IF NOT Update_BSC_Dimensions_In_PMF THEN
5807 RAISE e_unexpected_error;
5808 END IF;
5809
5810 -- BSC-MV Note: Need to create MVs for migrated Kpis and refresh them.
5811 -- AW_INTEGRATION: Need to create cubes for migrated Kpis and refresh them.
5812 h_base_message_v := BSC_APPS.Get_Message('BSC_CREATING_VIEW');
5813 IF g_adv_sum_level IS NOT NULL THEN
5814 -- Create MVs for migrated Kpis that has prototype flag 0, 6 or 7
5815 FOR h_i IN 1..g_num_mig_kpis LOOP
5816 -- Get prototype flag and report type
5817 h_sql := 'SELECT prototype_flag, BSC_DBGEN_UTILS.get_Objective_Type(short_name)'||
5818 ' FROM bsc_kpis_b@'||g_db_link||
5819 ' WHERE indicator = :1';
5820 OPEN h_cursor FOR h_sql USING g_mig_kpis(h_i);
5821 FETCH h_cursor INTO h_prototype_flag, h_report_type;
5822 CLOSE h_cursor;
5823
5824 -- We need to create MVs or AW Cubes only for indicators with report_type OBJECTIVE or BSCREPORT
5825 IF (h_prototype_flag = 0 OR h_prototype_flag = 6 OR h_prototype_flag = 7) AND
5826 (h_report_type = 'OBJECTIVE' OR h_report_type = 'BSCREPORT' OR h_report_type = 'SIMULATION') THEN
5827 -- Create the MV with the same summarization level they was created
5828 OPEN c_indic_sum_level (g_mig_kpis(h_i), h_sum_level_prop_code);
5829 FETCH c_indic_sum_level INTO h_kpi_sum_level;
5830 IF c_indic_sum_level%NOTFOUND THEN
5831 h_kpi_sum_level := g_adv_sum_level;
5832 ELSE
5833 IF h_kpi_sum_level IS NULL THEN
5834 h_kpi_sum_level := g_adv_sum_level;
5835 END IF;
5836 END IF;
5837 CLOSE c_indic_sum_level;
5838
5839 --AW_INTEGRATION: see if the indicator is implemented in AW
5840 IF BSC_UPDATE_UTIL.Get_Kpi_Impl_Type(g_mig_kpis(h_i)) = 2 THEN
5841 --AW implementation
5842 h_message := 'Creating AW cubes: '||g_mig_kpis(h_i);
5843 BSC_APPS.Write_Line_Log(h_message, BSC_UPDATE_LOG.OUTPUT);
5844 h_kpi_list.delete;
5845 h_kpi_list(1) := g_mig_kpis(h_i);
5846 bsc_aw_adapter.implement_kpi_aw(h_kpi_list,
5847 'DEBUG LOG,RECREATE KPI,SUMMARIZATION LEVEL='||h_kpi_sum_level);
5848 ELSE
5849 --MV implementation
5850 h_message := BSC_APPS.Replace_Token(h_base_message_v, 'VIEW', TO_CHAR(g_mig_kpis(h_i)));
5851 BSC_APPS.Write_Line_Log(h_message, BSC_UPDATE_LOG.OUTPUT);
5852
5853 IF NOT BSC_BIA_WRAPPER.Implement_Bsc_MV(g_mig_kpis(h_i),
5854 h_kpi_sum_level,
5855 FALSE,
5856 h_error_implement_mv) THEN
5857 RAISE e_error_implement_mv;
5858 END IF;
5859 END IF;
5860 END IF;
5861 END LOOP;
5862
5863 -- Refresh BIS Dimension tables. The BIS dimension tables that are materialized in BSC
5864 -- will be refreshed.
5865 -- AW_INTEGRATION: The BIS dimensions used in AW indicators will be loaded to AW
5866 IF NOT BSC_UPDATE_DIM.Create_Dbi_Dim_Temp_Tables THEN
5867 RAISE e_unexpected_error;
5868 END IF;
5869 -- AW_INTEGRATION: Create temporary tables needed for AW dimension processing
5870 IF NOT BSC_UPDATE_DIM.Create_AW_Dim_Temp_Tables THEN
5871 RAISE e_unexpected_error;
5872 END IF;
5873 -- Fix bug#4457823: Need to create the DBI dimension tables where we materialize
5874 IF NOT BSC_UPDATE_DIM.Create_Dbi_Dim_Tables(h_error_msg) THEN
5875 RAISE e_creating_dbi_dim_tables;
5876 END IF;
5877
5878 h_sql := 'select distinct short_name'||
5879 ' from bsc_sys_dim_levels_b'||
5880 ' where source = :1';
5881 OPEN h_cursor FOR h_sql USING 'PMF';
5882 LOOP
5883 FETCH h_cursor INTO h_dbi_short_name;
5884 EXIT WHEN h_cursor%NOTFOUND;
5885 IF NOT BSC_UPDATE_DIM.Refresh_Dbi_Dimension_Table(h_dbi_short_name) THEN
5886 -- fix bug#4682494: if for any reason the dbi dimension cannot be refreshed
5887 -- then we write this to the log file an continue
5888 g_warnings := TRUE;
5889 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_WARNING')||' '||
5890 BSC_APPS.Get_Message('BSC_RETR_DIMTABLE_FAILED')||' '||h_dbi_short_name,
5891 BSC_UPDATE_LOG.OUTPUT);
5892 END IF;
5893 END LOOP;
5894 CLOSE h_cursor;
5895
5896
5897 --AW_INTEGRATION: Load TYPE dimension into AW
5898 IF BSC_UPDATE_UTIL.Exists_AW_Kpi THEN
5899 h_dim_level_list.delete;
5900 h_dim_level_list(1) := 'TYPE';
5901 bsc_aw_load.load_dim(
5902 p_dim_level_list => h_dim_level_list,
5903 p_options => 'DEBUG_LOG'
5904 );
5905 END IF;
5906
5907 --AW_INTEGRATION: Load all the BSC dimensions used in AW indicators into AW
5908 h_sql := 'select distinct level_table_name'||
5909 ' from bsc_kpi_dim_levels_vl kd, bsc_kpi_properties kp, bsc_kpis_b k'||
5910 ' where kd.indicator = kp.indicator and'||
5911 ' kd.indicator = k.indicator and'||
5912 ' k.prototype_flag IN (0,6,7) and'||
5913 ' kp.property_code = :1 and kp.property_value = :2 and'||
5914 ' kd.status = :3 and kd.level_source = :4';
5915 h_num_dim_tables := 0;
5916 OPEN h_cursor FOR h_sql USING 'IMPLEMENTATION_TYPE', 2, 2, 'BSC';
5917 LOOP
5918 FETCH h_cursor INTO h_level_table_name;
5919 EXIT WHEN h_cursor%NOTFOUND;
5920
5921 h_num_dim_tables := h_num_dim_tables + 1;
5922 h_dim_tables(h_num_dim_tables) := h_level_table_name;
5923 END LOOP;
5924 CLOSE h_cursor;
5925 IF NOT BSC_UPDATE.Load_Dims_Into_AW(h_dim_tables, h_num_dim_tables) THEN
5926 RAISE e_unexpected_error;
5927 END IF;
5928
5929 --Fix bug#4873669: Populate bsc_reporting_calendar fro all the calendars
5930 h_sql := 'select calendar_id'||
5931 ' from bsc_sys_calendars_b';
5932 OPEN h_cursor FOR h_sql;
5933 LOOP
5934 FETCH h_cursor INTO h_calendar_id;
5935 EXIT WHEN h_cursor%NOTFOUND;
5936
5937 IF NOT BSC_BIA_WRAPPER.Load_Reporting_Calendar(h_calendar_id, h_error_msg) THEN
5938 RAISE e_load_rpt_cal;
5939 END IF;
5940 END LOOP;
5941 CLOSE h_cursor;
5942
5943 --AW_INTEGRATION: Load calendars used by AW indicators into AW
5944 h_sql := 'select distinct calendar_id'||
5945 ' from bsc_kpis_b k, bsc_kpi_properties kp'||
5946 ' where k.indicator = kp.indicator and'||
5947 ' k.prototype_flag IN (0,6,7) and'||
5948 ' kp.property_code = :1 and kp.property_value = :2';
5949 OPEN h_cursor FOR h_sql USING 'IMPLEMENTATION_TYPE', 2;
5950 LOOP
5951 FETCH h_cursor INTO h_calendar_id;
5952 EXIT WHEN h_cursor%NOTFOUND;
5953
5954 bsc_aw_calendar.create_calendar(
5955 p_calendar => h_calendar_id,
5956 p_options => 'DEBUG LOG, RECREATE'
5957 );
5958 bsc_aw_calendar.load_calendar(
5959 p_calendar => h_calendar_id,
5960 p_options => 'DEBUG LOG'
5961 );
5962 END LOOP;
5963 CLOSE h_cursor;
5964
5965 -- Refresh all MV in the system
5966 -- Get all the base tables
5967 --AW_INTEGRATION: We need to get only the base tables used by MV indicators
5968 h_num_base_tables := 0;
5969 h_sql := 'SELECT table_name FROM bsc_db_tables_rels'||
5970 ' WHERE source_table_name IN ('||
5971 ' SELECT table_name FROM bsc_db_tables'||
5972 ' WHERE table_type = :1)';
5973 OPEN h_cursor FOR h_sql USING 0;
5974 LOOP
5975 FETCH h_cursor INTO h_table;
5976 EXIT WHEN h_cursor%NOTFOUND;
5977
5978 IF NOT BSC_UPDATE_UTIL.Is_Table_For_AW_Kpi(h_table) THEN
5979 -- The base table is for a MV indicator
5980 h_num_base_tables := h_num_base_tables + 1;
5981 h_base_tables(h_num_base_tables) := h_table;
5982 END IF;
5983 END LOOP;
5984 CLOSE h_cursor;
5985
5986 -- Refresh all MVs in the system affected by base tables
5987 IF NOT BSC_UPDATE.Refresh_System_MVs_Mig(h_base_tables, h_num_base_tables) THEN
5988 RAISE e_unexpected_error;
5989 END IF;
5990
5991 --AW_INTEGRATION: Now refresh the AW indicators
5992 h_sql := 'select k.indicator'||
5993 ' from bsc_kpis_b k, bsc_kpi_properties kp'||
5994 ' where k.indicator = kp.indicator and'||
5995 ' k.prototype_flag IN (0,6,7) and'||
5996 ' kp.property_code = :1 and kp.property_value = :2';
5997 OPEN h_cursor FOR h_sql USING 'IMPLEMENTATION_TYPE', 2;
5998 LOOP
5999 FETCH h_cursor INTO h_indicator;
6000 EXIT WHEN h_cursor%NOTFOUND;
6001
6002 h_kpi_list.delete;
6003 h_kpi_list(1) := h_indicator;
6004 bsc_aw_load.load_kpi(
6005 p_kpi_list => h_kpi_list,
6006 p_options => 'DEBUG LOG'
6007 );
6008 END LOOP;
6009 CLOSE h_cursor;
6010 END IF;
6011
6012 COMMIT;
6013
6014 --BSC-MV Note: Overwrite profile BSC_ADVANCED_SUMMARIZATION_LEVEL with the value from source
6015 IF BSC_APPS.APPS_ENV THEN
6016 IF NOT FND_PROFILE.SAVE('BSC_ADVANCED_SUMMARIZATION_LEVEL', TO_CHAR(g_adv_sum_level), 'SITE') THEN
6017 RAISE e_unexpected_error;
6018 END IF;
6019
6020 COMMIT;
6021 END IF;
6022
6023 -- Restore the comments on the target...
6024 IF NOT (Restore_Comments) THEN
6025 RAISE e_unexpected_error;
6026 END IF;
6027
6028 -- At this point, the system is consistent
6029 UPDATE bsc_sys_init
6030 SET property_value = 'APPLIED',
6031 last_updated_by = BSC_APPS.fnd_global_user_id,
6032 last_update_date = SYSDATE
6033 WHERE property_code = 'TARGET_STATUS';
6034 COMMIT;
6035
6036 -- Write Program completed to log file
6037 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'TIME')||
6038 BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'SYMBOL_COLON')||
6039 ' '||TO_CHAR(SYSDATE, c_fto_long_date_time), BSC_APPS.OUTPUT_FILE);
6040 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_PROGRAM_COMPLETED'), BSC_APPS.OUTPUT_FILE);
6041
6042 -- Write in the log file the PMF objects that are not valid
6043 --Fix bug#4220506
6044 Write_Log_Invalid_PMF_Objects;
6045
6046 -- Delete records in the temporal table used for big 'in' conditions
6047 BSC_APPS.Init_Big_In_Cond_Table;
6048
6049 --Bug 3919106
6050 if(BSC_OLAP_MAIN.b_table_col_type_created) then
6051 BSC_OLAP_MAIN.drop_tmp_col_type_table;
6052 end if;
6053
6054 EXCEPTION
6055 WHEN e_load_rpt_cal THEN
6056 -- error message is in h_error_msg
6057 ROLLBACK;
6058
6059 -- Delete records in the temporal table used for big 'in' conditions
6060 BSC_APPS.Init_Big_In_Cond_Table;
6061
6062 BSC_MESSAGE.flush;
6063 BSC_MESSAGE.Add(x_message => 'Error in BSC_BIA_WRAPPER.Load_Reporting_Calendar: '||h_calendar_id||' '||h_error_msg,
6064 x_source => 'BSC_MIGRATION.Migrate_System',
6065 x_mode => 'I');
6066 COMMIT;
6067
6068 BSC_APPS.Write_Errors_To_Log;
6069
6070 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'TIME')||
6071 BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'SYMBOL_COLON')||
6072 ' '||TO_CHAR(SYSDATE, c_fto_long_date_time), BSC_APPS.OUTPUT_FILE);
6073 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_PROGRAM_COMPLETED'), BSC_APPS.OUTPUT_FILE);
6074
6075 WHEN e_creating_dbi_dim_tables THEN
6076 -- error message is in h_error_msg
6077 ROLLBACK;
6078
6079 -- Delete records in the temporal table used for big 'in' conditions
6080 BSC_APPS.Init_Big_In_Cond_Table;
6081
6082 BSC_MESSAGE.flush;
6083 BSC_MESSAGE.Add(x_message => 'Error in BSC_UPDATE_DIM.Create_Dbi_Dim_Tables: '||h_error_msg,
6084 x_source => 'BSC_MIGRATION.Migrate_System',
6085 x_mode => 'I');
6086 COMMIT;
6087
6088 BSC_APPS.Write_Errors_To_Log;
6089
6090 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'TIME')||
6091 BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'SYMBOL_COLON')||
6092 ' '||TO_CHAR(SYSDATE, c_fto_long_date_time), BSC_APPS.OUTPUT_FILE);
6093 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_PROGRAM_COMPLETED'), BSC_APPS.OUTPUT_FILE);
6094
6095 WHEN g_error_synch_bsc_pmf THEN
6096 -- error message is in h_error_msg
6097 ROLLBACK;
6098
6099 -- Delete records in the temporal table used for big 'in' conditions
6100 BSC_APPS.Init_Big_In_Cond_Table;
6101
6102 BSC_MESSAGE.flush;
6103 BSC_MESSAGE.Add(x_message => h_error_msg,
6104 x_source => 'BSC_MIGRATION.Migrate_System',
6105 x_mode => 'I');
6106 COMMIT;
6107
6108 BSC_APPS.Write_Errors_To_Log;
6109
6110 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'TIME')||
6111 BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'SYMBOL_COLON')||
6112 ' '||TO_CHAR(SYSDATE, c_fto_long_date_time), BSC_APPS.OUTPUT_FILE);
6113 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_PROGRAM_COMPLETED'), BSC_APPS.OUTPUT_FILE);
6114
6115 WHEN e_error_implement_mv THEN
6116 ROLLBACK;
6117
6118 -- Delete records in the temporal table used for big 'in' conditions
6119 BSC_APPS.Init_Big_In_Cond_Table;
6120
6121 BSC_MESSAGE.flush;
6122 BSC_MESSAGE.Add(x_message => 'BSC_BIA_WRAPPER.Implement_Bsc_MV '||g_mig_kpis(h_i)||' '||h_error_implement_mv,
6123 x_source => 'BSC_MIGRATION.Migrate_System',
6124 x_mode => 'I');
6125 COMMIT;
6126
6127 BSC_APPS.Write_Errors_To_Log;
6128
6129 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'TIME')||
6130 BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'SYMBOL_COLON')||
6131 ' '||TO_CHAR(SYSDATE, c_fto_long_date_time), BSC_APPS.OUTPUT_FILE);
6132 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_PROGRAM_COMPLETED'), BSC_APPS.OUTPUT_FILE);
6133
6134 WHEN e_unexpected_error THEN
6135 ROLLBACK;
6136
6137 -- Delete records in the temporal table used for big 'in' conditions
6138 BSC_APPS.Init_Big_In_Cond_Table;
6139
6140 BSC_MESSAGE.flush;
6141 BSC_MESSAGE.Add(x_message => BSC_APPS.Get_Message('BSC_MIG_FAIL_EXEC'),
6142 x_source => 'BSC_MIGRATION.Migrate_System',
6143 x_mode => 'I');
6144 COMMIT;
6145
6146 BSC_APPS.Write_Errors_To_Log;
6147
6148 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'TIME')||
6149 BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'SYMBOL_COLON')||
6150 ' '||TO_CHAR(SYSDATE, c_fto_long_date_time), BSC_APPS.OUTPUT_FILE);
6151 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_PROGRAM_COMPLETED'), BSC_APPS.OUTPUT_FILE);
6152
6153 WHEN e_warning_raised THEN
6154 ROLLBACK;
6155 -- Delete records in the temporal table used for big 'in' conditions
6156 BSC_APPS.Init_Big_In_Cond_Table;
6157
6158 BSC_MESSAGE.flush;
6159
6160 COMMIT ;
6161
6162 WHEN OTHERS THEN
6163 ROLLBACK;
6164
6165 -- Delete records in the temporal table used for big 'in' conditions
6166 BSC_APPS.Init_Big_In_Cond_Table;
6167
6168 BSC_MESSAGE.flush;
6169 BSC_MESSAGE.Add(x_message => SQLERRM,
6170 x_source => 'BSC_MIGRATION.Migrate_System',
6171 x_mode => 'I');
6172 COMMIT;
6173
6174 BSC_APPS.Write_Errors_To_Log;
6175
6176 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'TIME')||
6177 BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'SYMBOL_COLON')||
6178 ' '||TO_CHAR(SYSDATE, c_fto_long_date_time), BSC_APPS.OUTPUT_FILE);
6179 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_PROGRAM_COMPLETED'), BSC_APPS.OUTPUT_FILE);
6180
6181 END Migrate_System;
6182
6183
6184 --LOCKING: new procedure
6185 /*===========================================================================+
6186 | PROCEDURE Migrate_System_AT
6187 +============================================================================*/
6188 PROCEDURE Migrate_System_AT(
6189 x_src_responsibilities IN VARCHAR2,
6190 x_trg_responsibilities IN VARCHAR2,
6191 x_tab_filter IN VARCHAR2 := NULL,
6192 x_kpi_filter IN VARCHAR2 := NULL,
6193 x_overwrite IN VARCHAR2 := 'N'
6194 ) IS
6195 PRAGMA AUTONOMOUS_TRANSACTION;
6196 BEGIN
6197 Migrate_System(x_src_responsibilities,
6198 x_trg_responsibilities,
6199 x_tab_filter,
6200 x_kpi_filter,
6201 x_overwrite);
6202 commit; -- all autonomous transaction needs to commit
6203 END Migrate_System_AT;
6204
6205
6206 -- Enh#4697749
6207 /*===========================================================================+
6208 | FUNCTION Remove_Custom_Dim_Objs_In_PMF
6209 +============================================================================*/
6210 FUNCTION Remove_Custom_Dim_Objs_In_PMF RETURN BOOLEAN IS
6211 --bug 5099776
6212 CURSOR c_dim_objects (p1 NUMBER, p2 NUMBER, p3 NUMBER, p4 NUMBER) IS
6213 SELECT DISTINCT spmf_dl.level_id
6214 FROM bsc_sys_dim_levels_b sbsc_dl,
6215 bis_levels spmf_dl
6216 WHERE sbsc_dl.short_name = spmf_dl.short_name AND
6217 spmf_dl.created_by NOT IN (p1, p2,p3,p4);
6218
6219 h_level_id NUMBER;
6220 h_bis_dim_level_rec BIS_DIMENSION_LEVEL_PUB.Dimension_Level_Rec_Type;
6221 h_error_tbl BIS_UTILITIES_PUB.Error_Tbl_Type;
6222 h_return_status VARCHAR2(1);
6223 h_msg_count NUMBER;
6224 h_msg_data VARCHAR2(2000);
6225
6226 h_arr_ids t_array_of_number;
6227 h_num_ids NUMBER :=0;
6228 i NUMBER;
6229
6230 BEGIN
6231
6232 -- Delete custom dim objects from PMF repository.
6233
6234 OPEN c_dim_objects(1,2,120,121);
6235 LOOP
6236 FETCH c_dim_objects INTO h_level_id;
6237 EXIT WHEN c_dim_objects%NOTFOUND;
6238
6239 h_num_ids := h_num_ids + 1;
6240 h_arr_ids(h_num_ids) := h_level_id;
6241 END LOOP;
6242 CLOSE c_dim_objects;
6243
6244 FOR i IN 1..h_num_ids LOOP
6245 h_bis_dim_level_rec.dimension_level_id := h_arr_ids(i);
6246
6247 BIS_DIMENSION_LEVEL_PUB.Delete_Dimension_Level (
6248 p_commit => FND_API.G_FALSE
6249 ,p_validation_level => FND_API.G_VALID_LEVEL_FULL
6250 ,p_Dimension_Level_Rec => h_bis_dim_level_rec
6251 ,x_return_status => h_return_status
6252 ,x_error_Tbl => h_error_tbl
6253 );
6254 END LOOP;
6255
6256 COMMIT;
6257
6258 RETURN TRUE;
6259
6260 EXCEPTION
6261 WHEN OTHERS THEN
6262 ROLLBACK;
6263 FND_MSG_PUB.Count_And_Get(p_count => h_msg_count
6264 ,p_data => h_msg_data);
6265 IF (h_msg_data is null) THEN
6266 h_msg_data := SQLERRM;
6267 END IF;
6268
6269 BSC_MESSAGE.Add(x_message => h_msg_data,
6270 x_source => 'BSC_MIGRATION.Remove_Custom_Dim_Objs_In_PMF');
6271 RETURN FALSE;
6272
6273 END Remove_Custom_Dim_Objs_In_PMF;
6274
6275
6276 -- Enh#4697749
6277 /*===========================================================================+
6278 | FUNCTION Remove_Custom_Dims_In_PMF
6279 +============================================================================*/
6280 FUNCTION Remove_Custom_Dims_In_PMF RETURN BOOLEAN IS
6281 --bug 5099776
6282 CURSOR c_dimensions (p1 NUMBER, p2 NUMBER,p3 NUMBER,p4 NUMBER) IS
6283 SELECT DISTINCT spmf_d.dimension_id
6284 FROM bsc_sys_dim_groups_vl sbsc_d,
6285 bis_dimensions spmf_d
6286 WHERE sbsc_d.short_name = spmf_d.short_name AND
6287 spmf_d.created_by NOT IN (p1, p2,p3,p4);
6288
6289 h_dimension_id NUMBER;
6290 h_bis_dimension_rec BIS_DIMENSION_PUB.Dimension_Rec_Type;
6291 h_error_tbl BIS_UTILITIES_PUB.Error_Tbl_Type;
6292 h_return_status VARCHAR2(1);
6293 h_msg_count NUMBER;
6294 h_msg_data VARCHAR2(2000);
6295
6296 h_arr_ids t_array_of_number;
6297 h_num_ids NUMBER :=0;
6298 i NUMBER;
6299
6300 BEGIN
6301
6302 -- Delete custom dimensions (dimension groups) from PMF repository.
6303
6304 OPEN c_dimensions(1 ,2,120,121);
6305 LOOP
6306 FETCH c_dimensions INTO h_dimension_id;
6307 EXIT WHEN c_dimensions%NOTFOUND;
6308
6309 h_num_ids := h_num_ids + 1;
6310 h_arr_ids(h_num_ids) := h_dimension_id;
6311 END LOOP;
6312 CLOSE c_dimensions;
6313
6314 FOR i IN 1..h_num_ids LOOP
6315 h_bis_dimension_rec.dimension_id := h_arr_ids(i);
6316
6317 BIS_DIMENSION_PUB.Delete_Dimension(
6318 p_commit => FND_API.G_FALSE
6319 ,p_validation_level => FND_API.G_VALID_LEVEL_FULL
6320 ,p_Dimension_Rec => h_bis_dimension_rec
6321 ,x_return_status => h_return_status
6322 ,x_error_Tbl => h_error_tbl
6323 );
6324 END LOOP;
6325
6326 COMMIT;
6327
6328 -- Update DIM_GRP_ID to NULL in BIS_DIMENSIONS so the new dimension group id can be populated
6329 -- during synchronization
6330 UPDATE bis_dimensions
6331 SET dim_grp_id = NULL;
6332
6333 COMMIT;
6334
6335 RETURN TRUE;
6336
6337 EXCEPTION
6338 WHEN OTHERS THEN
6339 ROLLBACK;
6340 FND_MSG_PUB.Count_And_Get(p_count => h_msg_count
6341 ,p_data => h_msg_data);
6342 IF (h_msg_data is null) THEN
6343 h_msg_data := SQLERRM;
6344 END IF;
6345
6346 BSC_MESSAGE.Add(x_message => h_msg_data,
6347 x_source => 'BSC_MIGRATION.Remove_Custom_Dims_In_PMF');
6348 RETURN FALSE;
6349
6350 END Remove_Custom_Dims_In_PMF;
6351
6352
6353 -- Enh#4697749
6354 /*===========================================================================+
6355 | FUNCTION Remove_Custom_Measures_In_PMF
6356 +============================================================================*/
6357 FUNCTION Remove_Custom_Measures_In_PMF RETURN BOOLEAN IS
6358 -- bug 5099776 modified cursor correct join is with dataset_ids
6359 CURSOR c_measures (p1 NUMBER, p2 NUMBER, p3 NUMBER, p4 NUMBER) IS
6360 SELECT DISTINCT si.indicator_id
6361 FROM bis_indicators si,
6362 bsc_sys_datasets_b sd
6363 WHERE sd.dataset_id = si.dataset_id AND
6364 si.created_by NOT IN (p1, p2, p3,p4);
6365
6366 h_indicator_id NUMBER;
6367 h_measure_rec BIS_MEASURE_PUB.Measure_Rec_Type;
6368 h_error_tbl BIS_UTILITIES_PUB.Error_Tbl_Type;
6369 h_return_status VARCHAR2(1);
6370 h_msg_count NUMBER;
6371 h_msg_data VARCHAR2(2000);
6372
6373 h_arr_ids t_array_of_number;
6374 h_num_ids NUMBER :=0;
6375 i NUMBER;
6376
6377 BEGIN
6378
6379 -- Delete custom measures from PMF repository.
6380
6381 OPEN c_measures(1, 2,120,121);
6382 LOOP
6383 FETCH c_measures INTO h_indicator_id;
6384 EXIT WHEN c_measures%NOTFOUND;
6385
6386 h_num_ids := h_num_ids + 1;
6387 h_arr_ids(h_num_ids) := h_indicator_id;
6388 END LOOP;
6389 CLOSE c_measures;
6390
6391 FOR i IN 1..h_num_ids LOOP
6392 h_measure_rec.measure_id := h_arr_ids(i);
6393
6394 BIS_MEASURE_PUB.Delete_Measure(
6395 p_api_version => 1.0
6396 ,p_commit => FND_API.G_FALSE
6397 ,p_Measure_Rec => h_measure_rec
6398 ,x_return_status => h_return_status
6399 ,x_error_Tbl => h_error_tbl);
6400 END LOOP;
6401
6402 -- Update dataset_id to NULL in BIS_INDICATORS so the new dataset id can be populated
6403 -- during synchronization
6404 UPDATE bis_indicators
6405 SET dataset_id = NULL;
6406
6407 COMMIT;
6408
6409 RETURN TRUE;
6410
6411 EXCEPTION
6412 WHEN OTHERS THEN
6413 ROLLBACK;
6414 FND_MSG_PUB.Count_And_Get(p_count => h_msg_count
6415 ,p_data => h_msg_data);
6416 IF (h_msg_data is null) THEN
6417 h_msg_data := SQLERRM;
6418 END IF;
6419
6420 BSC_MESSAGE.Add(x_message => h_msg_data,
6421 x_source => 'BSC_MIGRATION.Remove_Custom_Measures_In_PMF');
6422 RETURN FALSE;
6423
6424 END Remove_Custom_Measures_In_PMF;
6425
6426
6427 /*===========================================================================+
6428 | FUNCTION Update_BSC_Dimensions_In_PMF
6429 +============================================================================*/
6430 FUNCTION Update_BSC_Dimensions_In_PMF RETURN BOOLEAN IS
6431
6432 TYPE t_cursor IS REF CURSOR;
6433 h_cursor t_cursor;
6434
6435 h_base_language VARCHAR2(4);
6436 h_lang_code VARCHAR2(4);
6437
6438 h_sql VARCHAR2(32000);
6439 h_source_bsc VARCHAR2(3) := 'BSC';
6440 h_i NUMBER;
6441
6442 BEGIN
6443
6444 -- Update description of the BSC dimensions in BIS_DIMENSIONS_TL with the value
6445 -- from the source system
6446 h_sql := 'UPDATE bis_dimensions_tl tdtl'||
6447 ' SET description = ('||
6448 ' SELECT sdtl.description'||
6449 ' FROM bis_dimensions@'||g_db_link||' sd,'||
6450 ' bis_dimensions_tl@'||g_db_link||' sdtl,'||
6451 ' bis_dimensions td'||
6452 ' WHERE tdtl.dimension_id = td.dimension_id AND'||
6453 ' td.short_name = sd.short_name AND'||
6454 ' sd.dimension_id = sdtl.dimension_id AND'||
6455 ' tdtl.language = sdtl.language'||
6456 ' )'||
6457 ' WHERE tdtl.dimension_id IN ('||
6458 ' SELECT DISTINCT pmf_d.dimension_id'||
6459 ' FROM bis_levels pmf_do, bsc_sys_dim_levels_vl bsc_do,'||
6460 ' bis_dimensions pmf_d, bsc_sys_dim_groups_tl bsc_d,'||
6461 ' bsc_sys_dim_levels_by_group bsc_dlg'||
6462 ' WHERE pmf_do.short_name = bsc_do.short_name AND'||
6463 ' bsc_do.source = :1 AND bsc_do.dim_level_id = bsc_dlg.dim_level_id AND'||
6464 ' bsc_dlg.dim_group_id = bsc_d.dim_group_id AND'||
6465 ' bsc_d.short_name = pmf_d.short_name'||
6466 ' )';
6467 EXECUTE IMMEDIATE h_sql USING h_source_bsc;
6468
6469 -- The previous query updates to null the description for the languages existing in the target
6470 -- but not in the source. The following logic will update the description for those languages
6471 -- with the description of the base language of the target system.
6472
6473 -- Get the base language of the target system
6474 SELECT language_code INTO h_base_language
6475 FROM fnd_languages
6476 WHERE installed_flag = 'B';
6477
6478 -- Get supported languages in target that are not supported in source
6479 h_sql := 'SELECT DISTINCT language_code'||
6480 ' FROM fnd_languages'||
6481 ' WHERE installed_flag IN (:1, :2) AND'||
6482 ' language_code NOT IN ('||
6483 ' SELECT language_code'||
6484 ' FROM fnd_languages@'||g_db_link||
6485 ' WHERE installed_flag IN (:3, :4)'||
6486 ' )';
6487 OPEN h_cursor FOR h_sql USING 'B', 'I', 'B', 'I';
6488 LOOP
6489 FETCH h_cursor INTO h_lang_code;
6490 EXIT WHEN h_cursor%NOTFOUND;
6491
6492 IF h_lang_code <> h_base_language THEN
6493 h_sql := 'UPDATE bis_dimensions_tl d1'||
6494 ' SET description = ('||
6495 ' SELECT description'||
6496 ' FROM bis_dimensions_tl d2'||
6497 ' WHERE d2.dimension_id = d1.dimension_id AND'||
6498 ' d2.language = :1'||
6499 ' ),'||
6500 ' source_lang = :2'||
6501 ' WHERE d1.language = :3 AND'||
6502 ' d1.dimension_id IN ('||
6503 ' SELECT DISTINCT pmf_d.dimension_id'||
6504 ' FROM bis_levels pmf_do, bsc_sys_dim_levels_vl bsc_do,'||
6505 ' bis_dimensions pmf_d, bsc_sys_dim_groups_tl bsc_d,'||
6506 ' bsc_sys_dim_levels_by_group bsc_dlg'||
6507 ' WHERE pmf_do.short_name = bsc_do.short_name AND'||
6508 ' bsc_do.source = :4 AND bsc_do.dim_level_id = bsc_dlg.dim_level_id AND'||
6509 ' bsc_dlg.dim_group_id = bsc_d.dim_group_id AND'||
6510 ' bsc_d.short_name = pmf_d.short_name'||
6511 ' )';
6512 EXECUTE IMMEDIATE h_sql USING h_base_language, h_base_language, h_lang_code, h_source_bsc;
6513 END IF;
6514 END LOOP;
6515 CLOSE h_cursor;
6516
6517 RETURN TRUE;
6518
6519 EXCEPTION
6520 WHEN OTHERS THEN
6521 ROLLBACK;
6522
6523 BSC_MESSAGE.Add(x_message => SQLERRM,
6524 x_source => 'BSC_MIGRATION.Update_BSC_Dimensions_In_PMF');
6525 RETURN FALSE;
6526
6527 END Update_BSC_Dimensions_In_PMF;
6528
6529
6530 /*===========================================================================+
6531 | PROCEDURE Validate_Filters
6532 +============================================================================*/
6533 FUNCTION Validate_Filters(
6534 x_tab_filter IN VARCHAR2,
6535 x_kpi_filter IN VARCHAR2,
6536 x_validation_error OUT NOCOPY VARCHAR2
6537 ) RETURN BOOLEAN IS
6538
6539 e_invalid_tab_filter EXCEPTION;
6540 e_invalid_kpi_filter EXCEPTION;
6541
6542 e_no_tab_access EXCEPTION;
6543 e_no_kpi_access EXCEPTION;
6544
6545 h_sql VARCHAR2(32000);
6546 TYPE t_cursor IS REF CURSOR;
6547 h_cursor t_cursor;
6548
6549 h_i NUMBER;
6550
6551 h_access_item NUMBER;
6552
6553 h_condition VARCHAR2(32700);
6554
6555 BEGIN
6556 -- Validate x_tab_filter
6557 g_num_tabs_filter := Decompose_Numeric_List(x_tab_filter, g_tabs_filter, ',');
6558 IF g_num_tabs_filter = -1 THEN
6559 RAISE e_invalid_tab_filter;
6560 END IF;
6561
6562 -- Validate x_kpi_filter
6563 g_num_kpis_filter := Decompose_Numeric_List(x_kpi_filter, g_kpis_filter, ',');
6564 IF g_num_kpis_filter = -1 THEN
6565 RAISE e_invalid_kpi_filter;
6566 END IF;
6567
6568 -- All the provided tabs must be accessible by any of the source responsibilities.
6569 h_condition := BSC_APPS.Get_New_Big_In_Cond_Number(1, 'responsibility_id');
6570 FOR h_i IN 1..g_num_src_resps LOOP
6571 BSC_APPS.Add_Value_Big_In_Cond(1, g_src_resps(h_i));
6572 END LOOP;
6573
6574 FOR h_i IN 1..g_num_tabs_filter LOOP
6575 h_sql := 'SELECT tab_id'||
6576 ' FROM bsc_user_tab_access@'||g_db_link||
6577 ' WHERE tab_id = :1 AND ('||h_condition||')';
6578 OPEN h_cursor FOR h_sql USING g_tabs_filter(h_i);
6579 FETCH h_cursor INTO h_access_item;
6580 IF h_cursor%NOTFOUND THEN
6581 CLOSE h_cursor;
6582 h_access_item := g_tabs_filter(h_i);
6583 RAISE e_no_tab_access;
6584 END IF;
6585 CLOSE h_cursor;
6586 END LOOP;
6587
6588 -- All the provided kpis must be accessible by any of the source responsibilities.
6589 FOR h_i IN 1..g_num_kpis_filter LOOP
6590 h_sql := 'SELECT indicator'||
6591 ' FROM bsc_user_kpi_access@'||g_db_link||
6592 ' WHERE indicator = :1 AND ('||h_condition||')';
6593 OPEN h_cursor FOR h_sql USING g_kpis_filter(h_i);
6594 FETCH h_cursor INTO h_access_item;
6595 IF h_cursor%NOTFOUND THEN
6596 CLOSE h_cursor;
6597 h_access_item := g_kpis_filter(h_i);
6598 RAISE e_no_kpi_access;
6599 END IF;
6600 CLOSE h_cursor;
6601 END LOOP;
6602
6603 RETURN TRUE;
6604
6605 EXCEPTION
6606 WHEN e_invalid_tab_filter THEN
6607 x_validation_error := BSC_APPS.Get_Message('BSC_MIG_INV_TAB_FILTER');
6608 RETURN FALSE;
6609
6610 WHEN e_invalid_kpi_filter THEN
6611 x_validation_error := BSC_APPS.Get_Message('BSC_MIG_INV_KPI_FILTER');
6612 RETURN FALSE;
6613
6614 WHEN e_no_tab_access THEN
6615 x_validation_error := BSC_APPS.Get_Message('BSC_MIG_NO_TAB_ACCESS');
6616 x_validation_error := BSC_APPS.Replace_Token(x_validation_error, 'TAB_ID', TO_CHAR(h_access_item));
6617 RETURN FALSE;
6618
6619 WHEN e_no_kpi_access THEN
6620 x_validation_error := BSC_APPS.Get_Message('BSC_MIG_NO_KPI_ACCESS');
6621 x_validation_error := BSC_APPS.Replace_Token(x_validation_error, 'INDICATOR', TO_CHAR(h_access_item));
6622 RETURN FALSE;
6623
6624 WHEN OTHERS THEN
6625 x_validation_error := SQLERRM;
6626 RETURN FALSE;
6627
6628 END Validate_Filters;
6629
6630
6631 /*===========================================================================+
6632 | PROCEDURE Validate_Responsibilities
6633 +============================================================================*/
6634 FUNCTION Validate_Responsibilities(
6635 x_src_responsibilities IN VARCHAR2,
6636 x_trg_responsibilities IN VARCHAR2,
6637 x_validation_error OUT NOCOPY VARCHAR2
6638 ) RETURN BOOLEAN IS
6639
6640 e_invalid_src_resps EXCEPTION;
6641 e_invalid_trg_resps EXCEPTION;
6642
6643 e_null_src_resps EXCEPTION;
6644 e_null_trg_resps EXCEPTION;
6645 e_no_match_resps EXCEPTION;
6646
6647 e_no_src_resp EXCEPTION;
6648 e_no_trg_resp EXCEPTION;
6649
6650 h_sql VARCHAR2(32000);
6651 TYPE t_cursor IS REF CURSOR;
6652 h_cursor t_cursor;
6653
6654 h_resp NUMBER;
6655
6656 h_i NUMBER;
6657
6658 BEGIN
6659 -- Validate x_src_responsibilities
6660 g_num_src_resps := Decompose_Numeric_List(x_src_responsibilities, g_src_resps, ',');
6661 IF g_num_src_resps = -1 THEN
6662 RAISE e_invalid_src_resps;
6663 END IF;
6664
6665 -- Validate x_trg_responsibilities
6666 g_num_trg_resps := Decompose_Numeric_List(x_trg_responsibilities, g_trg_resps, ',');
6667 IF g_num_trg_resps = -1 THEN
6668 RAISE e_invalid_trg_resps;
6669 END IF;
6670
6671 -- The user must to provide at least one source responsibility
6672 IF g_num_src_resps = 0 THEN
6673 RAISE e_null_src_resps;
6674 END IF;
6675
6676 -- The user must to provide at least one target responsibility
6677 IF g_num_trg_resps = 0 THEN
6678 RAISE e_null_trg_resps;
6679 END IF;
6680
6681 -- The user must provide the same number of source and target responsibilities
6682 IF g_num_src_resps <> g_num_trg_resps THEN
6683 RAISE e_no_match_resps;
6684 END IF;
6685
6686 -- All the provided source responsibilities must exists in the source system.
6687 FOR h_i IN 1..g_num_src_resps LOOP
6688 h_sql := 'SELECT responsibility_id'||
6689 ' FROM bsc_responsibility_vl@'||g_db_link||
6690 ' WHERE responsibility_id = :1';
6691 OPEN h_cursor FOR h_sql USING g_src_resps(h_i);
6692 FETCH h_cursor INTO h_resp;
6693 IF h_cursor%NOTFOUND THEN
6694 CLOSE h_cursor;
6695 h_resp := g_src_resps(h_i);
6696 RAISE e_no_src_resp;
6697 END IF;
6698 CLOSE h_cursor;
6699 END LOOP;
6700
6701 -- All the provided target responsibilities must exists in the target system.
6702 FOR h_i IN 1..g_num_trg_resps LOOP
6703 h_sql := 'SELECT responsibility_id'||
6704 ' FROM bsc_responsibility_vl'||
6705 ' WHERE responsibility_id = :1';
6706 OPEN h_cursor FOR h_sql USING g_trg_resps(h_i);
6707 FETCH h_cursor INTO h_resp;
6708 IF h_cursor%NOTFOUND THEN
6709 CLOSE h_cursor;
6710 h_resp := g_trg_resps(h_i);
6711 RAISE e_no_trg_resp;
6712 END IF;
6713 CLOSE h_cursor;
6714 END LOOP;
6715
6716 RETURN TRUE;
6717
6718 EXCEPTION
6719 WHEN e_invalid_src_resps THEN
6720 x_validation_error := BSC_APPS.Get_Message('BSC_MIG_INV_SRC_RESPS');
6721 RETURN FALSE;
6722
6723 WHEN e_invalid_trg_resps THEN
6724 x_validation_error := BSC_APPS.Get_Message('BSC_MIG_INV_TRG_RESPS');
6725 RETURN FALSE;
6726
6727 WHEN e_null_src_resps THEN
6728 x_validation_error := BSC_APPS.Get_Message('BSC_MIG_SRC_RESPS_EMPTY');
6729 RETURN FALSE;
6730
6731 WHEN e_null_trg_resps THEN
6732 x_validation_error := BSC_APPS.Get_Message('BSC_MIG_TRG_RESPS_EMPTY');
6733 RETURN FALSE;
6734
6735 WHEN e_no_match_resps THEN
6736 x_validation_error := BSC_APPS.Get_Message('BSC_MIG_NOMATCH_RESPS');
6737 RETURN FALSE;
6738
6739 WHEN e_no_src_resp THEN
6740 x_validation_error := BSC_APPS.Get_Message('BSC_MIG_SRC_RESP_NOEXIST');
6741 x_validation_error := BSC_APPS.Replace_Token(x_validation_error, 'RESP_ID', TO_CHAR(h_resp));
6742 RETURN FALSE;
6743
6744 WHEN e_no_trg_resp THEN
6745 x_validation_error := BSC_APPS.Get_Message('BSC_MIG_TRG_RESP_NOEXIST');
6746 x_validation_error := BSC_APPS.Replace_Token(x_validation_error, 'RESP_ID', TO_CHAR(h_resp));
6747 RETURN FALSE;
6748
6749 WHEN OTHERS THEN
6750 x_validation_error := SQLERRM;
6751 RETURN FALSE;
6752
6753 END Validate_Responsibilities;
6754
6755
6756 /*===========================================================================+
6757 | PROCEDURE Validate_System_Versions
6758 +============================================================================*/
6759 FUNCTION Validate_System_Versions(
6760 x_validation_error OUT NOCOPY VARCHAR2
6761 ) RETURN BOOLEAN IS
6762
6763 e_src_invalid_version EXCEPTION;
6764 e_trg_invalid_version EXCEPTION;
6765
6766 h_sql VARCHAR2(32000);
6767 TYPE t_cursor IS REF CURSOR;
6768 h_cursor t_cursor;
6769
6770 h_src_version VARCHAR2(30);
6771 h_trg_version VARCHAR2(30);
6772 h_status VARCHAR2(30);
6773
6774 BEGIN
6775 --- for bug 5583119
6776 -- we will compare version of both source and target against each other
6777 -- rather than comparing against a constant hard coded value
6778 -- if both source and target are on same version than migration can proceed
6779
6780 -- We will get the target system's version first,
6781 -- so as to use it later for log messages
6782
6783 -- get the version of the target system
6784 h_sql := 'SELECT property_value'||
6785 ' FROM bsc_sys_init'||
6786 ' WHERE UPPER(property_code) = :1';
6787 OPEN h_cursor FOR h_sql USING 'PATCH_NUMBER';
6788 FETCH h_cursor INTO h_trg_version;
6789 IF h_cursor%NOTFOUND THEN
6790 CLOSE h_cursor;
6791 RAISE e_trg_invalid_version;
6792 END IF;
6793 CLOSE h_cursor;
6794
6795 -- get the version of the source system
6796 h_sql := 'SELECT property_value'||
6797 ' FROM bsc_sys_init@'||g_db_link||
6798 ' WHERE UPPER(property_code) = :1';
6799 OPEN h_cursor FOR h_sql USING 'PATCH_NUMBER';
6800 FETCH h_cursor INTO h_src_version;
6801 IF h_cursor%NOTFOUND THEN
6802 CLOSE h_cursor;
6803 RAISE e_src_invalid_version;
6804 ELSE --compare source and target system BSC versions
6805 IF h_trg_version <> h_src_version THEN
6806 CLOSE h_cursor;
6807 RAISE e_src_invalid_version;
6808 END IF;
6809 END IF;
6810 CLOSE h_cursor;
6811
6812 h_sql := 'SELECT property_value'||
6813 ' FROM bsc_sys_init@'||g_db_link||
6814 ' WHERE UPPER(property_code) = :1';
6815 OPEN h_cursor FOR h_sql USING 'PATCH_STATUS';
6816 FETCH h_cursor INTO h_status;
6817 IF h_cursor%NOTFOUND THEN
6818 CLOSE h_cursor;
6819 RAISE e_src_invalid_version;
6820 END IF;
6821 CLOSE h_cursor;
6822
6823 IF h_status <> 'APPLIED' THEN
6824 RAISE e_src_invalid_version;
6825 END IF;
6826
6827 h_sql := 'SELECT property_value'||
6828 ' FROM bsc_sys_init'||
6829 ' WHERE UPPER(property_code) = :1';
6830 OPEN h_cursor FOR h_sql USING 'PATCH_STATUS';
6831 FETCH h_cursor INTO h_status;
6832 IF h_cursor%FOUND THEN
6833 IF h_status <> 'APPLIED' THEN
6834 CLOSE h_cursor;
6835 RAISE e_trg_invalid_version;
6836 END IF;
6837 END IF;
6838 CLOSE h_cursor;
6839
6840 RETURN TRUE;
6841 EXCEPTION
6842 WHEN e_src_invalid_version THEN
6843 x_validation_error := BSC_APPS.Get_Message('BSC_MIG_INV_SRC_VERSION');
6844 x_validation_error := BSC_APPS.Replace_Token(x_validation_error, 'VERSION_NUMBER', h_trg_version);
6845 RETURN FALSE;
6846
6847 WHEN e_trg_invalid_version THEN
6848 x_validation_error := BSC_APPS.Get_Message('BSC_MIG_INV_TRG_VERSION');
6849 x_validation_error := BSC_APPS.Replace_Token(x_validation_error, 'VERSION_NUMBER', h_trg_version);
6850 RETURN FALSE;
6851
6852 WHEN OTHERS THEN
6853 x_validation_error := BSC_APPS.Get_Message('BSC_MIG_NO_SOURCE_SYSTEM');
6854 RETURN FALSE;
6855
6856 END Validate_System_Versions;
6857
6858
6859 /*===========================================================================+
6860 | PROCEDURE Validate_Tables
6861 +============================================================================*/
6862 FUNCTION Validate_Tables RETURN BOOLEAN IS
6863 h_sql VARCHAR2(32700);
6864
6865 TYPE t_cursor IS REF CURSOR;
6866 h_cursor t_cursor;
6867
6868 h_table VARCHAR2(30);
6869 h_i NUMBER;
6870
6871 h_invalid_tables t_array_of_varchar2;
6872 h_num_invalid_tables NUMBER;
6873
6874 h_invalid_dim_tables t_array_of_varchar2;
6875 h_num_invalid_dim_tables NUMBER;
6876
6877 h_invalid_dim_objs t_array_of_varchar2;
6878 h_num_invalid_dim_objs NUMBER;
6879
6880 h_invalid_kpis_code t_array_of_number;
6881 h_invalid_kpis_name t_array_of_varchar2;
6882 h_num_invalid_kpis NUMBER;
6883
6884 h_kpi_code NUMBER;
6885 h_kpi_name VARCHAR2(200);
6886 h_dim_table VARCHAR2(30);
6887 h_dim_obj VARCHAR2(300);
6888 h_dim_obj1 VARCHAR2(300);
6889
6890 BEGIN
6891
6892 -- Get invalid dimension tables
6893 h_num_invalid_dim_tables := 0;
6894 h_num_invalid_dim_objs := 0;
6895
6896 --Fix bug#4206368: Fix bug#4206368 the dimension table name may be in lowercase!
6897 h_sql := 'SELECT level_table_name, name'||
6898 ' FROM bsc_sys_dim_levels_vl@'||g_db_link||
6899 ' WHERE NVL(source, ''BSC'') = ''BSC'' AND '||
6900 ' UPPER(level_table_name) NOT IN ('||
6901 ' SELECT table_name'||
6902 ' FROM all_tables@'||g_db_link||
6903 ' WHERE owner = :1)';
6904 OPEN h_cursor FOR h_sql USING g_src_bsc_schema;
6905 LOOP
6906 FETCH h_cursor INTO h_dim_table, h_dim_obj;
6907 EXIT WHEN h_cursor%NOTFOUND;
6908
6909 h_num_invalid_dim_tables := h_num_invalid_dim_tables + 1;
6910 h_invalid_dim_tables(h_num_invalid_dim_tables) := h_dim_table;
6911
6912 h_num_invalid_dim_objs := h_num_invalid_dim_objs + 1;
6913 h_invalid_dim_objs(h_num_invalid_dim_objs) := h_dim_obj;
6914 END LOOP;
6915 CLOSE h_cursor;
6916
6917 -- Get invalid mn dimension tables
6918 --Fix bug#4206368: Fix bug#4206368 the dimension table name may be in lowercase!
6919 h_sql := 'SELECT DISTINCT r.relation_col, c.name, p.name'||
6920 ' FROM bsc_sys_dim_level_rels@'||g_db_link||' r,'||
6921 ' bsc_sys_dim_levels_vl@'||g_db_link||' c, '||
6922 ' bsc_sys_dim_levels_vl@'||g_db_link||' p'||
6923 ' WHERE r.relation_type = 2 AND r.dim_level_id = c.dim_level_id (+)'||
6924 ' AND r.parent_dim_level_id = p.dim_level_id (+)'||
6925 ' AND UPPER(r.relation_col) NOT IN ('||
6926 ' SELECT table_name'||
6927 ' FROM all_tables@'||g_db_link||
6928 ' WHERE owner = :1)';
6929 OPEN h_cursor FOR h_sql USING g_src_bsc_schema;
6930 LOOP
6931 FETCH h_cursor INTO h_dim_table, h_dim_obj, h_dim_obj1;
6932 EXIT WHEN h_cursor%NOTFOUND;
6933
6934 IF NOT Item_Belong_To_Array_Varchar2(h_dim_table, h_invalid_dim_tables, h_num_invalid_dim_tables) THEN
6935 h_num_invalid_dim_tables := h_num_invalid_dim_tables + 1;
6936 h_invalid_dim_tables(h_num_invalid_dim_tables) := h_dim_table;
6937 END IF;
6938
6939 IF h_dim_obj IS NOT NULL THEN
6940 IF NOT Item_Belong_To_Array_Varchar2(h_dim_obj, h_invalid_dim_objs, h_num_invalid_dim_objs) THEN
6941 h_num_invalid_dim_objs := h_num_invalid_dim_objs + 1;
6942 h_invalid_dim_objs(h_num_invalid_dim_objs) := h_dim_obj;
6943 END IF;
6944 END IF;
6945
6946 IF h_dim_obj1 IS NOT NULL THEN
6947 IF NOT Item_Belong_To_Array_Varchar2(h_dim_obj1, h_invalid_dim_objs, h_num_invalid_dim_objs) THEN
6948 h_num_invalid_dim_objs := h_num_invalid_dim_objs + 1;
6949 h_invalid_dim_objs(h_num_invalid_dim_objs) := h_dim_obj1;
6950 END IF;
6951 END IF;
6952 END LOOP;
6953 CLOSE h_cursor;
6954
6955 -- Get invalid summary, base and input tables
6956 h_num_invalid_tables := 0;
6957
6958 FOR h_i IN 1..g_num_mig_tables LOOP
6959 h_table := g_mig_tables(h_i);
6960
6961 IF g_adv_sum_level IS NULL THEN
6962 -- BSC summary tables architecture. All summary tables should exists
6963 IF NOT Exist_Table_In_Src(h_table) THEN
6964 h_num_invalid_tables := h_num_invalid_tables + 1;
6965 h_invalid_tables(h_num_invalid_tables) := h_table;
6966 END IF;
6967 ELSE
6968 -- BSC-MV architecture. Generation type = -1 means the table does not exists
6969 IF Get_Table_Generation_Type_Src(h_table) <> -1 THEN
6970 IF NOT Exist_Table_In_Src(h_table) THEN
6971 h_num_invalid_tables := h_num_invalid_tables + 1;
6972 h_invalid_tables(h_num_invalid_tables) := h_table;
6973 END IF;
6974 END IF;
6975 END IF;
6976 END LOOP;
6977
6978 IF (h_num_invalid_tables = 0) AND (h_num_invalid_dim_tables = 0) THEN
6979 RETURN TRUE;
6980 END IF;
6981
6982 -- Write to the log file the invalid tables and kpis
6983 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_MIG_FOUND_INVALID_TABLES'), BSC_APPS.OUTPUT_FILE);
6984 BSC_APPS.Write_Line_Log(' ', BSC_APPS.OUTPUT_FILE);
6985 BSC_APPS.Write_Line_Log(RPAD(BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'TABLE'),32)||
6986 BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'TYPE'),
6987 BSC_APPS.OUTPUT_FILE);
6988 BSC_APPS.Write_Line_Log(RPAD('-', 30, '-')||' '||RPAD('-', 30, '-'), BSC_APPS.OUTPUT_FILE);
6989
6990 h_num_invalid_kpis := 0;
6991 FOR h_i IN 1..h_num_invalid_tables LOOP
6992 BSC_APPS.Write_Line_Log(RPAD(h_invalid_tables(h_i),32)||
6993 BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'EDW_FACT_TABLE'),
6994 BSC_APPS.OUTPUT_FILE);
6995
6996 -- Add to the array of invalid kpis the affected indicators
6997 h_sql := 'select distinct k.indicator, k.name'||
6998 ' from bsc_kpi_data_tables@'||g_db_link||' t, bsc_kpis_vl@'||g_db_link||' k'||
6999 ' where t.indicator = k.indicator and'||
7000 ' (t.table_name = :1 or'||
7001 ' t.table_name in ('||
7002 ' select distinct table_name'||
7003 ' from bsc_db_tables_rels@'||g_db_link||
7004 ' start with source_table_name = :2'||
7005 ' connect by source_table_name = prior table_name))';
7006 OPEN h_cursor FOR h_sql USING h_invalid_tables(h_i), h_invalid_tables(h_i);
7007 LOOP
7008 FETCH h_cursor INTO h_kpi_code, h_kpi_name;
7009 EXIT WHEN h_cursor%NOTFOUND;
7010
7011 IF NOT Item_Belong_To_Array_Number(h_kpi_code, h_invalid_kpis_code, h_num_invalid_kpis) THEN
7012 h_num_invalid_kpis := h_num_invalid_kpis + 1;
7013 h_invalid_kpis_code(h_num_invalid_kpis) := h_kpi_code;
7014 h_invalid_kpis_name(h_num_invalid_kpis) := h_kpi_name;
7015 END IF;
7016 END LOOP;
7017 CLOSE h_cursor;
7018 END LOOP;
7019 FOR h_i IN 1..h_num_invalid_dim_tables LOOP
7020 BSC_APPS.Write_Line_Log(RPAD(h_invalid_dim_tables(h_i),32)||
7021 BSC_APPS.Get_Lookup_Value('BSC_UI_BUILDER', 'DIMENTION_TABLE'),
7022 BSC_APPS.OUTPUT_FILE);
7023 END LOOP;
7024 BSC_APPS.Write_Line_Log(' ', BSC_APPS.OUTPUT_FILE);
7025
7026 -- Now write the affected indicators
7027 IF h_num_invalid_kpis > 0 THEN
7028 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'RELATED_OBJECTIVES'), BSC_APPS.OUTPUT_FILE);
7029 BSC_APPS.Write_Line_Log(RPAD('-', 50, '-'), BSC_APPS.OUTPUT_FILE);
7030 FOR h_i IN 1..h_num_invalid_kpis LOOP
7031 BSC_APPS.Write_Line_Log(RPAD(h_invalid_kpis_code(h_i), 12)||h_invalid_kpis_name(h_i), BSC_APPS.OUTPUT_FILE);
7032 END LOOP;
7033 BSC_APPS.Write_Line_Log(' ', BSC_APPS.OUTPUT_FILE);
7034 END IF;
7035
7036 -- Now write invalid dimension objects
7037 IF h_num_invalid_dim_objs > 0 THEN
7038 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIMENSION_OBJECTS'), BSC_APPS.OUTPUT_FILE);
7039 BSC_APPS.Write_Line_Log(RPAD('-', 50, '-'), BSC_APPS.OUTPUT_FILE);
7040 FOR h_i IN 1..h_num_invalid_dim_objs LOOP
7041 BSC_APPS.Write_Line_Log(h_invalid_dim_objs(h_i), BSC_APPS.OUTPUT_FILE);
7042 END LOOP;
7043 BSC_APPS.Write_Line_Log(' ', BSC_APPS.OUTPUT_FILE);
7044 END IF;
7045
7046 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_MIG_ACTION_INVALID_TABLES'), BSC_APPS.OUTPUT_FILE);
7047 BSC_APPS.Write_Line_Log(' ', BSC_APPS.OUTPUT_FILE);
7048 IF h_num_invalid_tables > 0 THEN
7049 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_MIG_ACTION1_INVALID_TABLES'), BSC_APPS.OUTPUT_FILE);
7050 BSC_APPS.Write_Line_Log(' ', BSC_APPS.OUTPUT_FILE);
7051 END IF;
7052 IF h_num_invalid_dim_tables > 0 THEN
7053 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_MIG_ACTION2_INVALID_TABLES'), BSC_APPS.OUTPUT_FILE);
7054 BSC_APPS.Write_Line_Log(' ', BSC_APPS.OUTPUT_FILE);
7055 END IF;
7056
7057 RETURN FALSE;
7058
7059 EXCEPTION
7060 WHEN OTHERS THEN
7061 BSC_MESSAGE.Add (x_message => SQLERRM,
7062 x_source => 'BSC_MIGRATION.Validate_Tables');
7063 RETURN FALSE;
7064 END Validate_Tables;
7065
7066
7067 /*===========================================================================+
7068 | FUNCTION Exist_Table_In_Src
7069 +============================================================================*/
7070 FUNCTION Exist_Table_In_Src(
7071 x_table_name IN VARCHAR2
7072 ) RETURN BOOLEAN IS
7073 h_sql VARCHAR2(32700);
7074
7075 TYPE t_cursor IS REF CURSOR;
7076 h_cursor t_cursor;
7077
7078 h_count NUMBER;
7079
7080 BEGIN
7081 h_sql := 'select count(*)'||
7082 ' from all_tables@'||g_db_link||
7083 ' where owner = :1 and table_name = :2';
7084 OPEN h_cursor FOR h_sql USING g_src_bsc_schema, x_table_name;
7085 FETCH h_cursor INTO h_count;
7086 CLOSE h_cursor;
7087
7088 IF h_count > 0 THEN
7089 RETURN TRUE;
7090 ELSE
7091 RETURN FALSE;
7092 END IF;
7093 END Exist_Table_In_Src;
7094
7095
7096 /*===========================================================================+
7097 | FUNCTION Get_Table_Generation_Type_Src
7098 +============================================================================*/
7099 FUNCTION Get_Table_Generation_Type_Src(
7100 x_table_name IN VARCHAR2
7101 ) RETURN NUMBER IS
7102
7103 h_table_generation_type NUMBER;
7104 h_sql VARCHAR2(32700);
7105
7106 TYPE t_cursor IS REF CURSOR;
7107 h_cursor t_cursor;
7108
7109 BEGIN
7110 h_table_generation_type := NULL;
7111
7112 h_sql := 'SELECT generation_type'||
7113 ' FROM bsc_db_tables@'||g_db_link||
7114 ' WHERE table_name = :1';
7115 OPEN h_cursor FOR h_sql USING x_table_name;
7116 FETCH h_cursor INTO h_table_generation_type;
7117 IF h_cursor%NOTFOUND THEN
7118 h_table_generation_type := NULL;
7119 END IF;
7120 CLOSE h_cursor;
7121
7122 RETURN h_table_generation_type;
7123
7124 END Get_Table_Generation_Type_Src;
7125
7126
7127 --Fix bug#4220506
7128 /*===========================================================================+
7129 | PROCEDURE Write_Log_Invalid_PMF_Objects
7130 +============================================================================*/
7131 PROCEDURE Write_Log_Invalid_PMF_Objects IS
7132
7133 h_i NUMBER;
7134 h_condition VARCHAR2(32000);
7135 h_sql VARCHAR2(32000);
7136 TYPE t_cursor IS REF CURSOR;
7137 h_cursor t_cursor;
7138 h_application_name VARCHAR2(240);
7139 h_indicator NUMBER;
7140 h_name VARCHAR2(200);
7141 h_short_name VARCHAR2(200);
7142
7143 BEGIN
7144 IF (g_num_invalid_pmf_measures > 0) OR (g_num_invalid_pmf_dimensions > 0) OR
7145 (g_num_invalid_pmf_dim_levels > 0) OR (g_num_no_mig_kpis > 0) THEN
7146
7147 g_warnings := TRUE;
7148
7149 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_UPG_PMF_ERROR'), BSC_APPS.OUTPUT_FILE);
7150 BSC_APPS.Write_Line_Log(BSC_APPS.Get_Message('BSC_MIG_INSTALL_PROD_PATCH'), BSC_APPS.OUTPUT_FILE);
7151
7152 IF g_num_no_mig_kpis > 0 THEN
7153 BSC_APPS.Write_Line_Log(' ', BSC_APPS.OUTPUT_FILE);
7154 BSC_APPS.Write_Line_Log(RPAD(BSC_APPS.Get_Lookup_Value('BSC_UI_BACKEND', 'KPI_CODE'), 15)||
7155 RPAD(BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'KPI_NAME'), 50),
7156 BSC_UPDATE_LOG.OUTPUT);
7157
7158 h_condition := BSC_APPS.Get_New_Big_In_Cond_Number(1, 'indicator');
7159 FOR h_i IN 1 .. g_num_no_mig_kpis LOOP
7160 BSC_APPS.Add_Value_Big_In_Cond(1, g_no_mig_kpis(h_i));
7161 END LOOP;
7162
7163 h_sql := 'SELECT indicator, name'||
7164 ' FROM bsc_kpis_vl@'||g_db_link||
7165 ' WHERE '||h_condition;
7166 OPEN h_cursor FOR h_sql;
7167 LOOP
7168 FETCH h_cursor INTO h_indicator, h_name;
7169 EXIT WHEN h_cursor%NOTFOUND;
7170
7171 BSC_APPS.Write_Line_Log(RPAD(h_indicator, 15)||h_name,
7172 BSC_UPDATE_LOG.OUTPUT);
7173
7174 END LOOP;
7175 CLOSE h_cursor;
7176 END IF;
7177
7178 IF g_num_invalid_pmf_measures > 0 THEN
7179 BSC_APPS.Write_Line_Log(' ', BSC_APPS.OUTPUT_FILE);
7180 BSC_APPS.Write_Line_Log(RPAD(BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'EDW_MEASURE'), 40)||
7181 RPAD(BSC_APPS.Get_Lookup_Value('BSC_UI_SETUP', 'SHORT_NAME'), 35)||
7182 RPAD(BSC_APPS.Get_Lookup_Value('BSC_UI_SETUP', 'APPLICATION_NAME'), 40),
7183 BSC_UPDATE_LOG.OUTPUT);
7184
7185 h_condition := BSC_APPS.Get_New_Big_In_Cond_Varchar2(1, 'i.short_name');
7186 FOR h_i IN 1 .. g_num_invalid_pmf_measures LOOP
7187 BSC_APPS.Add_Value_Big_In_Cond(1, g_invalid_pmf_measures(h_i));
7188 END LOOP;
7189
7190 -- perf bug#4583017: remove distinct
7191 h_sql := 'SELECT itl.name, i.short_name, f.application_name'||
7192 ' FROM bis_indicators@'||g_db_link||' i,'||
7193 ' bis_indicators_tl@'||g_db_link||' itl,'||
7194 ' bis_application_measures@'||g_db_link||' am,'||
7195 ' fnd_application_vl@'||g_db_link||' f'||
7196 ' WHERE i.indicator_id = itl.indicator_id AND'||
7197 ' itl.language = USERENV(''LANG'') AND'||
7198 ' i.indicator_id = am.indicator_id AND'||
7199 ' am.application_id = f.application_id(+) AND '||h_condition;
7200 OPEN h_cursor FOR h_sql;
7201 LOOP
7202 FETCH h_cursor INTO h_name, h_short_name, h_application_name;
7203 EXIT WHEN h_cursor%NOTFOUND;
7204
7205 BSC_APPS.Write_Line_Log(RPAD(h_name, 40)||
7206 RPAD(h_short_name, 35)||
7207 h_application_name,
7208 BSC_UPDATE_LOG.OUTPUT);
7209 END LOOP;
7210 CLOSE h_cursor;
7211 END IF;
7212
7213 IF g_num_invalid_pmf_dimensions > 0 THEN
7214 BSC_APPS.Write_Line_Log(' ', BSC_APPS.OUTPUT_FILE);
7215 BSC_APPS.Write_Line_Log(RPAD(BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'EDW_DIMENSION'), 40)||
7216 RPAD(BSC_APPS.Get_Lookup_Value('BSC_UI_SETUP', 'SHORT_NAME'), 35)||
7217 RPAD(BSC_APPS.Get_Lookup_Value('BSC_UI_SETUP', 'APPLICATION_NAME'), 40),
7218 BSC_UPDATE_LOG.OUTPUT);
7219
7220 h_condition := BSC_APPS.Get_New_Big_In_Cond_Varchar2(1, 'd.short_name');
7221 FOR h_i IN 1 .. g_num_invalid_pmf_dimensions LOOP
7222 BSC_APPS.Add_Value_Big_In_Cond(1, g_invalid_pmf_dimensions(h_i));
7223 END LOOP;
7224
7225 h_sql := 'SELECT DISTINCT dtl.name, d.short_name, f.application_name'||
7226 ' FROM bis_dimensions@'||g_db_link||' d,'||
7227 ' bis_dimensions_tl@'||g_db_link||' dtl,'||
7228 ' fnd_application_vl@'||g_db_link||' f'||
7229 ' WHERE d.dimension_id = dtl.dimension_id AND'||
7230 ' dtl.language = USERENV(''LANG'') AND'||
7231 ' d.application_id = f.application_id (+) AND '||h_condition;
7232 OPEN h_cursor FOR h_sql;
7233 LOOP
7234 FETCH h_cursor INTO h_name, h_short_name, h_application_name;
7235 EXIT WHEN h_cursor%NOTFOUND;
7236
7237 BSC_APPS.Write_Line_Log(RPAD(h_name, 40)||
7238 RPAD(h_short_name, 35)||
7239 h_application_name,
7240 BSC_UPDATE_LOG.OUTPUT);
7241 END LOOP;
7242 CLOSE h_cursor;
7243 END IF;
7244
7245 IF g_num_invalid_pmf_dim_levels > 0 THEN
7246 BSC_APPS.Write_Line_Log(' ', BSC_APPS.OUTPUT_FILE);
7247 BSC_APPS.Write_Line_Log(RPAD(BSC_APPS.Get_Lookup_Value('BSC_UI_COMMON', 'DIMENSION_OBJECT'), 40)||
7248 RPAD(BSC_APPS.Get_Lookup_Value('BSC_UI_SETUP', 'SHORT_NAME'), 35)||
7249 RPAD(BSC_APPS.Get_Lookup_Value('BSC_UI_SETUP', 'APPLICATION_NAME'), 40),
7250 BSC_UPDATE_LOG.OUTPUT);
7251
7252 h_condition := BSC_APPS.Get_New_Big_In_Cond_Varchar2(1, 'l.short_name');
7253 FOR h_i IN 1 .. g_num_invalid_pmf_dim_levels LOOP
7254 BSC_APPS.Add_Value_Big_In_Cond(1, g_invalid_pmf_dim_levels(h_i));
7255 END LOOP;
7256
7257 h_sql := 'SELECT DISTINCT ltl.name, l.short_name, f.application_name'||
7258 ' FROM bis_levels@'||g_db_link||' l,'||
7259 ' bis_levels_tl@'||g_db_link||' ltl,'||
7260 ' fnd_application_vl@'||g_db_link||' f'||
7261 ' WHERE l.level_id = ltl.level_id AND'||
7262 ' ltl.language = USERENV(''LANG'') AND'||
7263 ' l.application_id = f.application_id (+) AND '||h_condition;
7264 OPEN h_cursor FOR h_sql;
7265 LOOP
7266 FETCH h_cursor INTO h_name, h_short_name, h_application_name;
7267 EXIT WHEN h_cursor%NOTFOUND;
7268
7269 BSC_APPS.Write_Line_Log(RPAD(h_name, 40)||
7270 RPAD(h_short_name, 35)||
7271 h_application_name,
7272 BSC_UPDATE_LOG.OUTPUT);
7273 END LOOP;
7274 CLOSE h_cursor;
7275 END IF;
7276 END IF;
7277 END Write_Log_Invalid_PMF_Objects;
7278
7279
7280 /*===========================================================================+
7281 | PROCEDURE Migrate_Custom_PMF_Dimensions
7282 +============================================================================*/
7283 PROCEDURE Migrate_Custom_PMF_Dimensions IS
7284
7285 TYPE t_cursor IS REF CURSOR;
7286 h_cursor t_cursor;
7287 h_sql VARCHAR2(20000);
7288
7289 h_pmf VARCHAR2(3) := 'PMF';
7290 h_count NUMBER;
7291
7292 h_dimension_rec BIS_DIMENSION_PUB.Dimension_Rec_Type;
7293 h_dimension_short_name VARCHAR2(2000);
7294 h_dimension_name VARCHAR2(2000);
7295 h_description VARCHAR2(2000);
7296 h_hide VARCHAR2(10);
7297 h_application_id NUMBER;
7298 h_return_status VARCHAR2(2000);
7299 h_error_msg VARCHAR2(2000);
7300 h_error_tbl BIS_UTILITIES_PUB.Error_Tbl_Type;
7301
7302
7303 BEGIN
7304 -- Enh#4697749
7305 --Query to get non-pre-seeded BSC/PMF dimensions from the source
7306 --We will need to create/update those dimensions in the target
7307 -- seed data owner r12 bug 5099776
7308 h_sql := 'SELECT DISTINCT sbsc_d.short_name'||
7309 ' FROM bsc_sys_dim_groups_vl@'||g_db_link||' sbsc_d,'||
7310 ' bis_dimensions@'||g_db_link||' spmf_d'||
7311 ' WHERE sbsc_d.short_name = spmf_d.short_name AND'||
7312 ' spmf_d.created_by NOT IN (:1, :2, :3, :4)';
7313 OPEN h_cursor FOR h_sql USING 1, 2,120,121;
7314 LOOP
7315 FETCH h_cursor INTO h_dimension_short_name;
7316 EXIT WHEN h_cursor%NOTFOUND;
7317
7318 -- Retrieve the dimension from the source system
7319 BSC_APPS.Write_Line_Log('Migrating existing source dimension '||h_dimension_short_name, BSC_APPS.OUTPUT_FILE);
7320
7321 h_sql := 'BEGIN BSC_MIGRATION.Retrieve_Dimension@'||g_db_link||'('||
7322 ' p_dimension_short_name => :1'||
7323 ', x_dimension_name => :2'||
7324 ', x_description => :3'||
7325 ', x_application_id => :4'||
7326 ', x_return_status => :5'||
7327 ', x_error_msg => :6'||
7328 ', x_hide => :7'||
7329 '); END;';
7330 execute immediate h_sql
7331 using h_dimension_short_name, OUT h_dimension_name,
7332 OUT h_description, OUT h_application_id,
7333 OUT h_return_status, OUT h_error_msg, OUT h_hide;
7334
7335 IF h_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7336 BSC_APPS.Write_Line_Log('Error retrieving dimension: '||h_error_msg, BSC_APPS.OUTPUT_FILE);
7337 ELSE
7338 h_dimension_rec.Dimension_Short_Name := h_dimension_short_name;
7339 h_dimension_rec.Dimension_Name := h_dimension_name;
7340 h_dimension_rec.Description := h_description;
7341 h_dimension_rec.Application_ID := h_application_id;
7342 h_dimension_rec.Hide := h_hide;
7343
7344 --check if the dimension exists in the target
7345 h_count := 0;
7346 select count(short_name)
7347 into h_count
7348 from bis_dimensions
7349 where short_name = h_dimension_short_name;
7350
7351 IF h_count = 0 THEN
7352 -- Dimension does not exists, create it
7353 BIS_DIMENSION_PUB.Create_Dimension(
7354 p_api_version => 1.0
7355 , p_commit => FND_API.G_FALSE
7356 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
7357 , p_Dimension_Rec => h_dimension_rec
7358 , x_return_status => h_return_status
7359 , x_error_Tbl => h_error_tbl
7360 );
7361 commit;
7362
7363 IF h_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7364 BSC_APPS.Write_Line_Log('Error creating dimension: '||h_error_tbl(1).Error_Description, BSC_APPS.OUTPUT_FILE);
7365 END IF;
7366 ELSE
7367 -- Dimension exists, update it
7368 BIS_DIMENSION_PUB.Update_Dimension(
7369 p_api_version => 1.0
7370 , p_commit => FND_API.G_FALSE
7371 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
7372 , p_Dimension_Rec => h_dimension_rec
7373 , x_return_status => h_return_status
7374 , x_error_Tbl => h_error_tbl
7375 );
7376 commit;
7377
7378 IF h_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7379 BSC_APPS.Write_Line_Log('Error updating dimension: '||h_error_tbl(1).Error_Description, BSC_APPS.OUTPUT_FILE);
7380 END IF;
7381 END IF;
7382 END IF;
7383 END LOOP;
7384 CLOSE h_cursor;
7385
7386 END Migrate_Custom_PMF_Dimensions;
7387
7388
7389 /*===========================================================================+
7390 | PROCEDURE Migrate_Custom_PMF_Dim_Levels
7391 +============================================================================*/
7392 PROCEDURE Migrate_Custom_PMF_Dim_Levels IS
7393
7394 TYPE t_cursor IS REF CURSOR;
7395 h_cursor t_cursor;
7396 h_cursor2 t_cursor;
7397 h_sql VARCHAR2(20000);
7398
7399 h_pmf VARCHAR2(3) := 'PMF';
7400 h_count NUMBER;
7401
7402 h_dimension_level_rec BIS_DIMENSION_LEVEL_PUB.Dimension_Level_Rec_Type;
7403
7404 h_dimension_level_short_name VARCHAR2(2000);
7405 h_dimension_short_name VARCHAR2(2000);
7406 h_dimension_name VARCHAR2(2000);
7407 h_dimension_level_name VARCHAR2(2000);
7408 h_description VARCHAR2(2000);
7409 h_hide VARCHAR2(10);
7410 h_level_values_view_name VARCHAR2(2000);
7411 h_where_clause VARCHAR2(2000);
7412 h_source VARCHAR2(2000);
7413 h_comparison_label_code VARCHAR2(2000);
7414 h_attribute_code VARCHAR2(2000);
7415 h_application_id NUMBER;
7416 h_default_search VARCHAR2(2000);
7417 h_long_lov VARCHAR2(2000);
7418 h_master_level VARCHAR2(2000);
7419 h_view_object_name VARCHAR2(2000);
7420 h_default_values_api VARCHAR2(2000);
7421 h_enabled VARCHAR2(2000);
7422 h_drill_to_form_function VARCHAR2(2000);
7423 h_primary_dim VARCHAR2(2000);
7424
7425 h_return_status VARCHAR2(2000);
7426 h_error_msg VARCHAR2(2000);
7427 h_error_tbl BIS_UTILITIES_PUB.Error_Tbl_Type;
7428
7429 h_level_source VARCHAR2(2000);
7430 h_create_level BOOLEAN;
7431
7432 BEGIN
7433 -- Enh#4697749
7434 --Query to get non-pre-seeded BSC/PMF dimension levels from the source
7435 --We will need to create/update those dimension levels in the target
7436 -- bug 5099776
7437 h_sql := 'SELECT DISTINCT sbsc_dl.short_name, sbsc_dl.source'||
7438 ' FROM bsc_sys_dim_levels_b@'||g_db_link||' sbsc_dl,'||
7439 ' bis_levels@'||g_db_link||' spmf_dl'||
7440 ' WHERE sbsc_dl.short_name = spmf_dl.short_name AND'||
7441 ' spmf_dl.created_by NOT IN (:1, :2, :3, :4)';
7442 OPEN h_cursor FOR h_sql USING 1, 2,120,121;
7443 LOOP
7444 FETCH h_cursor INTO h_dimension_level_short_name, h_level_source;
7445 EXIT WHEN h_cursor%NOTFOUND;
7446
7447 -- Retrieve the dimension level from the source system
7448 BSC_APPS.Write_Line_Log('Migrating existing source dimension object '||h_dimension_level_short_name, BSC_APPS.OUTPUT_FILE);
7449
7450 h_sql := 'BEGIN BSC_MIGRATION.Retrieve_Dimension_Level@'||g_db_link||'('||
7451 ' p_dimension_level_short_name => :1'||
7452 ', x_dimension_short_name => :2'||
7453 ', x_dimension_name => :3'||
7454 ', x_dimension_level_name => :4'||
7455 ', x_description => :5'||
7456 ', x_level_values_view_name => :6'||
7457 ', x_where_clause => :7'||
7458 ', x_source => :8'||
7459 ', x_comparison_label_code => :9'||
7460 ', x_attribute_code => :10'||
7461 ', x_application_id => :11'||
7462 ', x_default_search => :12'||
7463 ', x_long_lov => :13'||
7464 ', x_master_level => :14'||
7465 ', x_view_object_name => :15'||
7466 ', x_default_values_api => :16'||
7467 ', x_enabled => :17'||
7468 ', x_drill_to_form_function => :18'||
7469 ', x_primary_dim => :19'||
7470 ', x_return_status => :20'||
7471 ', x_error_msg => :21'||
7472 ', x_hide => :22'||
7473 '); END;';
7474 execute immediate h_sql
7475 using h_dimension_level_short_name, OUT h_dimension_short_name,
7476 OUT h_dimension_name, OUT h_dimension_level_name, OUT h_description,
7477 OUT h_level_values_view_name, OUT h_where_clause, OUT h_source,
7478 OUT h_comparison_label_code, OUT h_attribute_code, OUT h_application_id,
7479 OUT h_default_search, OUT h_long_lov, OUT h_master_level,
7480 OUT h_view_object_name, OUT h_default_values_api, OUT h_enabled,
7481 OUT h_drill_to_form_function, OUT h_primary_dim,
7482 OUT h_return_status, OUT h_error_msg, OUT h_hide;
7483
7484 IF h_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7485 BSC_APPS.Write_Line_Log('Error retrieving dimension object: '||h_error_msg, BSC_APPS.OUTPUT_FILE);
7486 ELSE
7487 h_dimension_level_rec.dimension_level_short_name := h_dimension_level_short_name;
7488 h_dimension_level_rec.dimension_short_name := h_dimension_short_name;
7489 h_dimension_level_rec.dimension_name := h_dimension_name;
7490 h_dimension_level_rec.dimension_level_name := h_dimension_level_name;
7491 h_dimension_level_rec.description := h_description;
7492 h_dimension_level_rec.level_values_view_name := h_level_values_view_name;
7493 h_dimension_level_rec.where_clause := h_where_clause;
7494 h_dimension_level_rec.source := h_source;
7495 h_dimension_level_rec.comparison_label_code := h_comparison_label_code;
7496 h_dimension_level_rec.attribute_code := h_attribute_code;
7497 h_dimension_level_rec.application_id := h_application_id;
7498 h_dimension_level_rec.default_search := h_default_search;
7499 h_dimension_level_rec.long_lov := h_long_lov;
7500 h_dimension_level_rec.master_level := h_master_level;
7501 h_dimension_level_rec.view_object_name := h_view_object_name;
7502 h_dimension_level_rec.default_values_api := h_default_values_api;
7503 h_dimension_level_rec.enabled := h_enabled;
7504 h_dimension_level_rec.drill_to_form_function := h_drill_to_form_function;
7505 h_dimension_level_rec.primary_dim := h_primary_dim;
7506 h_dimension_level_rec.hide := h_hide;
7507
7508 -- Fix bug#4932663: Migrate the level values view for PMF existing source dimensions levels
7509 -- Then check if the view has errors in the target system. If the view has errors
7510 -- then we do not migrate that dimension level
7511 h_create_level := TRUE;
7512 IF h_level_source = 'PMF' AND (h_level_values_view_name IS NOT NULL) THEN
7513 IF NOT Create_Copy_Of_View_Def(h_level_values_view_name,FALSE) THEN --bug 6004972 No Overwrite version
7514 BSC_APPS.Write_Line_Log('Could not migrate the level values view: '||h_level_values_view_name,
7515 BSC_APPS.OUTPUT_FILE);
7516 h_create_level := FALSE;
7517 ELSE
7518 -- Check if the view has not errors
7519 h_sql := 'select count(*) from '||h_level_values_view_name||' where rownum < :1';
7520 BEGIN
7521 OPEN h_cursor2 FOR h_sql USING 2;
7522 FETCH h_cursor2 INTO h_count;
7523 CLOSE h_cursor2;
7524 EXCEPTION
7525 WHEN OTHERS THEN
7526 CLOSE h_cursor2;
7527 BSC_APPS.Write_Line_Log('Level values view has errors: '||h_level_values_view_name,
7528 BSC_APPS.OUTPUT_FILE);
7529 h_create_level := FALSE;
7530 END;
7531 END IF;
7532 END IF;
7533
7534 IF h_create_level THEN
7535 --check if the dimension level exists in the target
7536 h_count := 0;
7537 select count(short_name)
7538 into h_count
7539 from bis_levels
7540 where short_name = h_dimension_level_short_name;
7541
7542 IF h_count = 0 THEN
7543 -- Dimension level does not exists, create it
7544 BIS_DIMENSION_LEVEL_PUB.Create_Dimension_Level(
7545 p_api_version => 1.0
7546 , p_commit => FND_API.G_FALSE
7547 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
7548 , p_Dimension_Level_Rec => h_dimension_level_rec
7549 , x_return_status => h_return_status
7550 , x_error_Tbl => h_error_tbl
7551 );
7552 commit;
7553
7554 IF h_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7555 BSC_APPS.Write_Line_Log('Error creating dimension object: '||h_error_tbl(1).Error_Description,
7556 BSC_APPS.OUTPUT_FILE);
7557 END IF;
7558 ELSE
7559 -- Dimension level exists, update it
7560 BIS_DIMENSION_LEVEL_PUB.Update_Dimension_Level(
7561 p_api_version => 1.0
7562 , p_commit => FND_API.G_FALSE
7563 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
7564 , p_Dimension_Level_Rec => h_dimension_level_rec
7565 , x_return_status => h_return_status
7566 , x_error_Tbl => h_error_tbl
7567 );
7568 commit;
7569
7570 IF h_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7571 BSC_APPS.Write_Line_Log('Error updating dimension level: '||h_error_tbl(1).Error_Description,
7572 BSC_APPS.OUTPUT_FILE);
7573 END IF;
7574 END IF;
7575 END IF;
7576 END IF;
7577 END LOOP;
7578 CLOSE h_cursor;
7579
7580 END Migrate_Custom_PMF_Dim_Levels;
7581
7582
7583 /*===========================================================================+
7584 | PROCEDURE Migrate_Custom_PMF_Measures
7585 +============================================================================*/
7586 PROCEDURE Migrate_Custom_PMF_Measures IS
7587
7588 TYPE t_cursor IS REF CURSOR;
7589 h_cursor t_cursor;
7590 h_sql VARCHAR2(20000);
7591
7592 h_pmf VARCHAR2(3) := 'PMF';
7593 h_count NUMBER;
7594
7595 h_measure_rec BIS_MEASURE_PUB.Measure_Rec_Type;
7596
7597 h_measure_short_name VARCHAR2(2000);
7598 h_measure_name VARCHAR2(2000);
7599 h_description VARCHAR2(2000);
7600 h_region_app_id NUMBER;
7601 h_source_column_app_id NUMBER;
7602 h_compare_column_app_id NUMBER;
7603 h_actual_data_source_type VARCHAR2(2000);
7604 h_actual_data_source VARCHAR2(2000);
7605 h_function_name VARCHAR2(2000);
7606 h_comparison_source VARCHAR2(2000);
7607 h_increase_in_measure VARCHAR2(2000);
7608 h_enable_link VARCHAR2(2000);
7609 h_enabled VARCHAR2(2000);
7610 h_obsolete VARCHAR2(2000);
7611 h_measure_type VARCHAR2(2000);
7612 h_dimension1_short_name VARCHAR2(2000);
7613 h_dimension1_name VARCHAR2(2000);
7614 h_dimension2_short_name VARCHAR2(2000);
7615 h_dimension2_name VARCHAR2(2000);
7616 h_dimension3_short_name VARCHAR2(2000);
7617 h_dimension3_name VARCHAR2(2000);
7618 h_dimension4_short_name VARCHAR2(2000);
7619 h_dimension4_name VARCHAR2(2000);
7620 h_dimension5_short_name VARCHAR2(2000);
7621 h_dimension5_name VARCHAR2(2000);
7622 h_dimension6_short_name VARCHAR2(2000);
7623 h_dimension6_name VARCHAR2(2000);
7624 h_dimension7_short_name VARCHAR2(2000);
7625 h_dimension7_name VARCHAR2(2000);
7626 h_unit_of_measure_class VARCHAR2(2000);
7627 h_application_id NUMBER;
7628 h_is_validate VARCHAR2(2000);
7629 h_func_area_short_name VARCHAR2(2000);
7630
7631 h_return_status VARCHAR2(2000);
7632 h_error_msg VARCHAR2(2000);
7633 h_error_tbl BIS_UTILITIES_PUB.Error_Tbl_Type;
7634
7635 -- Enh#4697749 new variables
7636 h_region_code VARCHAR2(200);
7637
7638
7639 BEGIN
7640 -- Following join changed to use dataset_id because there can be
7641 -- many datasets pointing to same measure. Bug 5990096
7642 -- be taken care by sync up apis
7643 -- Enh#4697749
7644 --Query to get non-pre-seeded BSC/PMF measures from the source
7645 --We will need to create/update those measures in the target
7646 -- bug 5099776
7647 h_sql := 'SELECT DISTINCT si.short_name'||
7648 ' FROM bis_indicators@'||g_db_link||' si,'||
7649 ' bsc_sys_datasets_b@'||g_db_link||' sd'||
7650 ' WHERE sd.dataset_id= si.dataset_id AND'||
7651 ' si.created_by NOT IN (:2, :3, :4, :5)';
7652 OPEN h_cursor FOR h_sql USING 1, 2,120,121;
7653 LOOP
7654 FETCH h_cursor INTO h_measure_short_name;
7655 EXIT WHEN h_cursor%NOTFOUND;
7656
7657 -- Retrieve the measure from the source system
7658 BSC_APPS.Write_Line_Log('Migrating existing source measure '||h_measure_short_name, BSC_APPS.OUTPUT_FILE);
7659
7660 h_sql := 'BEGIN BSC_MIGRATION.Retrieve_Measure@'||g_db_link||'('||
7661 ' p_measure_short_name => :1'||
7662 ', x_measure_name => :2'||
7663 ', x_description => :3'||
7664 ', x_region_app_id => :4'||
7665 ', x_source_column_app_id => :5'||
7666 ', x_compare_column_app_id => :6'||
7667 ', x_actual_data_source_type => :7'||
7668 ', x_actual_data_source => :8'||
7669 ', x_function_name => :9'||
7670 ', x_comparison_source => :10'||
7671 ', x_increase_in_measure => :11'||
7672 ', x_enable_link => :12'||
7673 ', x_enabled => :13'||
7674 ', x_obsolete => :14'||
7675 ', x_measure_type => :15'||
7676 ', x_dimension1_short_name => :16'||
7677 ', x_dimension1_name => :17'||
7678 ', x_dimension2_short_name => :18'||
7679 ', x_dimension2_name => :19'||
7680 ', x_dimension3_short_name => :20'||
7681 ', x_dimension3_name => :21'||
7682 ', x_dimension4_short_name => :22'||
7683 ', x_dimension4_name => :23'||
7684 ', x_dimension5_short_name => :24'||
7685 ', x_dimension5_name => :25'||
7686 ', x_dimension6_short_name => :26'||
7687 ', x_dimension6_name => :27'||
7688 ', x_dimension7_short_name => :28'||
7689 ', x_dimension7_name => :29'||
7690 ', x_unit_of_measure_class => :30'||
7691 ', x_application_id => :31'||
7692 ', x_is_validate => :32'||
7693 ', x_func_area_short_name => :33'||
7694 ', x_return_status => :34'||
7695 ', x_error_msg => :35'||
7696 '); END;';
7697 execute immediate h_sql
7698 using h_measure_short_name, OUT h_measure_name, OUT h_description, OUT h_region_app_id,
7699 OUT h_source_column_app_id, OUT h_compare_column_app_id, OUT h_actual_data_source_type,
7700 OUT h_actual_data_source, OUT h_function_name, OUT h_comparison_source,
7701 OUT h_increase_in_measure, OUT h_enable_link, OUT h_enabled, OUT h_obsolete,
7702 OUT h_measure_type, OUT h_dimension1_short_name, OUT h_dimension1_name,
7703 OUT h_dimension2_short_name, OUT h_dimension2_name, OUT h_dimension3_short_name,
7704 OUT h_dimension3_name, OUT h_dimension4_short_name, OUT h_dimension4_name,
7705 OUT h_dimension5_short_name, OUT h_dimension5_name, OUT h_dimension6_short_name,
7706 OUT h_dimension6_name, OUT h_dimension7_short_name, OUT h_dimension7_name,
7707 OUT h_unit_of_measure_class, OUT h_application_id, OUT h_is_validate,
7708 OUT h_func_area_short_name, OUT h_return_status, OUT h_error_msg;
7709
7710 IF h_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7711 BSC_APPS.Write_Line_Log('Error retrieving measure: '||h_error_msg, BSC_APPS.OUTPUT_FILE);
7712 ELSE
7713 h_measure_rec.measure_short_name := h_measure_short_name;
7714 h_measure_rec.measure_name := h_measure_name;
7715 h_measure_rec.description := h_description;
7716 h_measure_rec.region_app_id := h_region_app_id;
7717 h_measure_rec.source_column_app_id := h_source_column_app_id;
7718 h_measure_rec.compare_column_app_id := h_compare_column_app_id;
7719 h_measure_rec.actual_data_source_type := h_actual_data_source_type;
7720 h_measure_rec.actual_data_source := h_actual_data_source;
7721 h_measure_rec.function_name := h_function_name;
7722 h_measure_rec.comparison_source := h_comparison_source;
7723 h_measure_rec.increase_in_measure := h_increase_in_measure;
7724 h_measure_rec.enable_link := h_enable_link;
7725 h_measure_rec.enabled := h_enabled;
7726 h_measure_rec.obsolete := h_obsolete;
7727 h_measure_rec.measure_type := h_measure_type;
7728 h_measure_rec.dimension1_short_name := h_dimension1_short_name;
7729 h_measure_rec.dimension1_name := h_dimension1_name;
7730 h_measure_rec.dimension2_short_name := h_dimension2_short_name;
7731 h_measure_rec.dimension2_name := h_dimension2_name;
7732 h_measure_rec.dimension3_short_name := h_dimension3_short_name;
7733 h_measure_rec.dimension3_name := h_dimension3_name;
7734 h_measure_rec.dimension4_short_name := h_dimension4_short_name;
7735 h_measure_rec.dimension4_name := h_dimension4_name;
7736 h_measure_rec.dimension5_short_name := h_dimension5_short_name;
7737 h_measure_rec.dimension5_name := h_dimension5_name;
7738 h_measure_rec.dimension6_short_name := h_dimension6_short_name;
7739 h_measure_rec.dimension6_name := h_dimension6_name;
7740 h_measure_rec.dimension7_short_name := h_dimension7_short_name;
7741 h_measure_rec.dimension7_name := h_dimension7_name;
7742 h_measure_rec.unit_of_measure_class := h_unit_of_measure_class;
7743 h_measure_rec.application_id := h_application_id;
7744 h_measure_rec.is_validate := h_is_validate;
7745 h_measure_rec.func_area_short_name := h_func_area_short_name;
7746
7747 -- Enh#4697749 Migrate AK Region of the measure
7748 IF h_actual_data_source_type = 'AK' THEN
7749 h_region_code := SUBSTR(h_actual_data_source, 1, INSTR(h_actual_data_source, '.') - 1);
7750 IF h_region_code IS NOT NULL THEN
7751 IF NOT Migrate_AK_Region(h_region_code, h_error_msg) THEN
7752 BSC_APPS.Write_Line_Log('Error migrating AK Region '||h_region_code||': '||h_error_msg,
7753 BSC_APPS.OUTPUT_FILE);
7754 END IF;
7755 END IF;
7756 h_region_code := SUBSTR(h_comparison_source, 1, INSTR(h_comparison_source, '.') - 1);
7757 IF h_region_code IS NOT NULL THEN
7758 IF NOT Migrate_AK_Region(h_region_code, h_error_msg) THEN
7759 BSC_APPS.Write_Line_Log('Error migrating AK Region '||h_region_code||': '||h_error_msg,
7760 BSC_APPS.OUTPUT_FILE);
7761 END IF;
7762 END IF;
7763 END IF;
7764
7765 -- Enh#4697749 Migrate Form Function of the measure
7766 IF h_function_name IS NOT NULL THEN
7767 IF NOT Migrate_Form_Function(h_function_name, h_error_msg) THEN
7768 BSC_APPS.Write_Line_Log('Error migrating Form Function '||h_function_name||': '||h_error_msg,
7769 BSC_APPS.OUTPUT_FILE);
7770 END IF;
7771 END IF;
7772
7773 --check if the dimension level exists in the target
7774 h_count := 0;
7775 select count(short_name)
7776 into h_count
7777 from bis_indicators
7778 where short_name = h_measure_short_name;
7779
7780 IF h_count = 0 THEN
7781 -- Measure does not exists, create it
7782 BIS_MEASURE_PUB.Create_Measure(
7783 p_api_version => 1.0
7784 , p_commit => FND_API.G_FALSE
7785 , p_Measure_Rec => h_measure_rec
7786 , p_owner => BIS_UTILITIES_PUB.G_CUSTOM_OWNER
7787 , x_return_status => h_return_status
7788 , x_error_Tbl => h_error_tbl
7789 );
7790 commit;
7791
7792 IF h_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7793 BSC_APPS.Write_Line_Log('Error creating measure: '||h_error_tbl(1).Error_Description,
7794 BSC_APPS.OUTPUT_FILE);
7795 END IF;
7796 ELSE
7797 -- Measure exists, update it
7798 BIS_MEASURE_PUB.Update_Measure(
7799 p_api_version => 1.0
7800 , p_commit => FND_API.G_FALSE
7801 , p_Measure_Rec => h_measure_rec
7802 , p_owner => BIS_UTILITIES_PUB.G_CUSTOM_OWNER
7803 , x_return_status => h_return_status
7804 , x_error_Tbl => h_error_tbl
7805 );
7806 commit;
7807
7808 IF h_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7809 BSC_APPS.Write_Line_Log('Error updating measure: '||h_error_tbl(1).Error_Description,
7810 BSC_APPS.OUTPUT_FILE);
7811 END IF;
7812 END IF;
7813 END IF;
7814 END LOOP;
7815 CLOSE h_cursor;
7816
7817 END Migrate_Custom_PMF_Measures;
7818
7819
7820 /*===========================================================================+
7821 | PROCEDURE Retrieve_Dimension
7822 +============================================================================*/
7823 PROCEDURE Retrieve_Dimension
7824 ( p_dimension_short_name IN VARCHAR2
7825 , x_dimension_name OUT NOCOPY VARCHAR2
7826 , x_description OUT NOCOPY VARCHAR2
7827 , x_hide OUT NOCOPY VARCHAR2
7828 , x_application_id OUT NOCOPY NUMBER
7829 , x_return_status OUT NOCOPY VARCHAR2
7830 , x_error_msg OUT NOCOPY VARCHAR2
7831 ) IS
7832 e_error EXCEPTION;
7833 h_api_version NUMBER;
7834 h_dimension_rec_in BIS_DIMENSION_PUB.Dimension_Rec_Type;
7835 h_dimension_rec_out BIS_DIMENSION_PUB.Dimension_Rec_Type;
7836 h_error_tbl BIS_UTILITIES_PUB.Error_Tbl_Type;
7837 BEGIN
7838
7839 h_dimension_rec_in.dimension_short_name := p_dimension_short_name;
7840 h_api_version := 1.0;
7841
7842 BIS_DIMENSION_PUB.Retrieve_Dimension(
7843 p_api_version => h_api_version
7844 ,p_Dimension_Rec => h_dimension_rec_in
7845 ,x_Dimension_Rec => h_dimension_rec_out
7846 ,x_return_status => x_return_status
7847 ,x_error_Tbl => h_error_tbl
7848 );
7849
7850 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7851 RAISE e_error;
7852 END IF;
7853
7854 x_dimension_name := h_dimension_rec_out.dimension_name;
7855 x_description := h_dimension_rec_out.description;
7856 x_application_id := h_dimension_rec_out.application_id;
7857 x_hide := h_dimension_rec_out.hide;
7858
7859 EXCEPTION
7860 WHEN e_error THEN
7861 x_error_msg := h_error_tbl(1).Error_Description;
7862 WHEN others THEN
7863 x_error_msg := SQLERRM;
7864 x_return_status := FND_API.G_RET_STS_ERROR;
7865 END Retrieve_Dimension;
7866
7867
7868 /*===========================================================================+
7869 | PROCEDURE Retrieve_Dimension_Level
7870 +============================================================================*/
7871 PROCEDURE Retrieve_Dimension_Level
7872 ( p_dimension_level_short_name IN VARCHAR2
7873 , x_dimension_short_name OUT NOCOPY VARCHAR2
7874 , x_dimension_name OUT NOCOPY VARCHAR2
7875 , x_dimension_level_name OUT NOCOPY VARCHAR2
7876 , x_description OUT NOCOPY VARCHAR2
7877 , x_hide OUT NOCOPY VARCHAR2
7878 , x_level_values_view_name OUT NOCOPY VARCHAR2
7879 , x_where_clause OUT NOCOPY VARCHAR2
7880 , x_source OUT NOCOPY VARCHAR2
7881 , x_comparison_label_code OUT NOCOPY VARCHAR2
7882 , x_attribute_code OUT NOCOPY VARCHAR2
7883 , x_application_id OUT NOCOPY NUMBER
7884 , x_default_search OUT NOCOPY VARCHAR2
7885 , x_long_lov OUT NOCOPY VARCHAR2
7886 , x_master_level OUT NOCOPY VARCHAR2
7887 , x_view_object_name OUT NOCOPY VARCHAR2
7888 , x_default_values_api OUT NOCOPY VARCHAR2
7889 , x_enabled OUT NOCOPY VARCHAR2
7890 , x_drill_to_form_function OUT NOCOPY VARCHAR2
7891 , x_primary_dim OUT NOCOPY VARCHAR2
7892 , x_return_status OUT NOCOPY VARCHAR2
7893 , x_error_msg OUT NOCOPY VARCHAR2
7894 ) IS
7895 e_error EXCEPTION;
7896 h_api_version NUMBER;
7897 h_dimension_level_rec_in BIS_DIMENSION_LEVEL_PUB.Dimension_Level_Rec_Type;
7898 h_dimension_level_rec_out BIS_DIMENSION_LEVEL_PUB.Dimension_Level_Rec_Type;
7899 h_error_tbl BIS_UTILITIES_PUB.Error_Tbl_Type;
7900 BEGIN
7901
7902 h_dimension_level_rec_in.dimension_level_short_name := p_dimension_level_short_name;
7903 h_api_version := 1.0;
7904
7905 BIS_DIMENSION_LEVEL_PUB.Retrieve_Dimension_Level(
7906 p_api_version => h_api_version
7907 ,p_Dimension_Level_Rec => h_dimension_level_rec_in
7908 ,x_Dimension_Level_Rec => h_dimension_level_rec_out
7909 ,x_return_status => x_return_status
7910 ,x_error_Tbl => h_error_tbl
7911 );
7912
7913 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7914 RAISE e_error;
7915 END IF;
7916
7917 x_dimension_short_name := h_dimension_level_rec_out.dimension_short_name;
7918 x_dimension_name := h_dimension_level_rec_out.dimension_name;
7919 x_dimension_level_name := h_dimension_level_rec_out.dimension_level_name;
7920 x_description := h_dimension_level_rec_out.description;
7921 x_hide := h_dimension_level_rec_out.hide;
7922 x_level_values_view_name := h_dimension_level_rec_out.level_values_view_name;
7923 x_where_clause := h_dimension_level_rec_out.where_clause;
7924 x_source := h_dimension_level_rec_out.source;
7925 x_comparison_label_code := h_dimension_level_rec_out.comparison_label_code;
7926 x_attribute_code := h_dimension_level_rec_out.attribute_code;
7927 x_application_id := h_dimension_level_rec_out.application_id;
7928 x_default_search := h_dimension_level_rec_out.default_search;
7929 x_long_lov := h_dimension_level_rec_out.long_lov;
7930 x_master_level := h_dimension_level_rec_out.master_level;
7931 x_view_object_name := h_dimension_level_rec_out.view_object_name;
7932 x_default_values_api := h_dimension_level_rec_out.default_values_api;
7933 x_enabled := h_dimension_level_rec_out.enabled;
7934 x_drill_to_form_function := h_dimension_level_rec_out.drill_to_form_function;
7935 x_primary_dim := h_dimension_level_rec_out.primary_dim;
7936
7937 EXCEPTION
7938 WHEN e_error THEN
7939 x_error_msg := h_error_tbl(1).Error_Description;
7940 WHEN others THEN
7941 x_error_msg := SQLERRM;
7942 x_return_status := FND_API.G_RET_STS_ERROR;
7943 END Retrieve_Dimension_Level;
7944
7945
7946 /*===========================================================================+
7947 | PROCEDURE Retrieve_Measure
7948 +============================================================================*/
7949 PROCEDURE Retrieve_Measure
7950 ( p_measure_short_name IN VARCHAR2
7951 , x_measure_name OUT NOCOPY VARCHAR2
7952 , x_description OUT NOCOPY VARCHAR2
7953 , x_region_app_id OUT NOCOPY NUMBER
7954 , x_source_column_app_id OUT NOCOPY NUMBER
7955 , x_compare_column_app_id OUT NOCOPY NUMBER
7956 , x_actual_data_source_type OUT NOCOPY VARCHAR2
7957 , x_actual_data_source OUT NOCOPY VARCHAR2
7958 , x_function_name OUT NOCOPY VARCHAR2
7959 , x_comparison_source OUT NOCOPY VARCHAR2
7960 , x_increase_in_measure OUT NOCOPY VARCHAR2
7961 , x_enable_link OUT NOCOPY VARCHAR2
7962 , x_enabled OUT NOCOPY VARCHAR2
7963 , x_obsolete OUT NOCOPY VARCHAR2
7964 , x_measure_type OUT NOCOPY VARCHAR2
7965 , x_dimension1_short_name OUT NOCOPY VARCHAR2
7966 , x_dimension1_name OUT NOCOPY VARCHAR2
7967 , x_dimension2_short_name OUT NOCOPY VARCHAR2
7968 , x_dimension2_name OUT NOCOPY VARCHAR2
7969 , x_dimension3_short_name OUT NOCOPY VARCHAR2
7970 , x_dimension3_name OUT NOCOPY VARCHAR2
7971 , x_dimension4_short_name OUT NOCOPY VARCHAR2
7972 , x_dimension4_name OUT NOCOPY VARCHAR2
7973 , x_dimension5_short_name OUT NOCOPY VARCHAR2
7974 , x_dimension5_name OUT NOCOPY VARCHAR2
7975 , x_dimension6_short_name OUT NOCOPY VARCHAR2
7976 , x_dimension6_name OUT NOCOPY VARCHAR2
7977 , x_dimension7_short_name OUT NOCOPY VARCHAR2
7978 , x_dimension7_name OUT NOCOPY VARCHAR2
7979 , x_unit_of_measure_class OUT NOCOPY VARCHAR2
7980 , x_application_id OUT NOCOPY NUMBER
7981 , x_is_validate OUT NOCOPY VARCHAR2
7982 , x_func_area_short_name OUT NOCOPY VARCHAR2
7983 , x_return_status OUT NOCOPY VARCHAR2
7984 , x_error_msg OUT NOCOPY VARCHAR2
7985 ) IS
7986 e_error EXCEPTION;
7987 h_api_version NUMBER;
7988 h_all_info VARCHAR2(80);
7989 h_measure_rec_in BIS_MEASURE_PUB.Measure_Rec_Type;
7990 h_measure_rec_out BIS_MEASURE_PUB.Measure_Rec_Type;
7991 h_error_tbl BIS_UTILITIES_PUB.Error_Tbl_Type;
7992
7993 BEGIN
7994
7995 h_measure_rec_in.measure_short_name := p_measure_short_name;
7996 h_api_version := 1.0;
7997 h_all_info := FND_API.G_TRUE;
7998
7999 BIS_MEASURE_PUB.Retrieve_Measure(
8000 p_api_version => h_api_version
8001 , p_Measure_Rec => h_measure_rec_in
8002 , p_all_info => h_all_info
8003 , x_Measure_Rec => h_measure_rec_out
8004 , x_return_status => x_return_status
8005 , x_error_Tbl => h_error_tbl
8006 );
8007
8008 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8009 RAISE e_error;
8010 END IF;
8011
8012 x_measure_name := h_measure_rec_out.measure_name;
8013 x_description := h_measure_rec_out.description;
8014 x_region_app_id := h_measure_rec_out.region_app_id;
8015 x_source_column_app_id := h_measure_rec_out.source_column_app_id;
8016 x_compare_column_app_id := h_measure_rec_out.compare_column_app_id;
8017 x_actual_data_source_type := h_measure_rec_out.actual_data_source_type;
8018 x_actual_data_source := h_measure_rec_out.actual_data_source;
8019 x_function_name := h_measure_rec_out.function_name;
8020 x_comparison_source := h_measure_rec_out.comparison_source;
8021 x_increase_in_measure := h_measure_rec_out.increase_in_measure;
8022 x_enable_link := h_measure_rec_out.enable_link;
8023 x_enabled := h_measure_rec_out.enabled;
8024 x_obsolete := h_measure_rec_out.obsolete;
8025 x_measure_type := h_measure_rec_out.measure_type;
8026 x_dimension1_short_name := h_measure_rec_out.dimension1_short_name;
8027 x_dimension1_name := h_measure_rec_out.dimension1_name;
8028 x_dimension2_short_name := h_measure_rec_out.dimension2_short_name;
8029 x_dimension2_name := h_measure_rec_out.dimension2_name;
8030 x_dimension3_short_name := h_measure_rec_out.dimension3_short_name;
8031 x_dimension3_name := h_measure_rec_out.dimension3_name;
8032 x_dimension4_short_name := h_measure_rec_out.dimension4_short_name;
8033 x_dimension4_name := h_measure_rec_out.dimension4_name;
8034 x_dimension5_short_name := h_measure_rec_out.dimension5_short_name;
8035 x_dimension5_name := h_measure_rec_out.dimension5_name;
8036 x_dimension6_short_name := h_measure_rec_out.dimension6_short_name;
8037 x_dimension6_name := h_measure_rec_out.dimension6_name;
8038 x_dimension7_short_name := h_measure_rec_out.dimension7_short_name;
8039 x_dimension7_name := h_measure_rec_out.dimension7_name;
8040 x_unit_of_measure_class := h_measure_rec_out.unit_of_measure_class;
8041 x_application_id := h_measure_rec_out.application_id;
8042 x_is_validate := h_measure_rec_out.is_validate;
8043 x_func_area_short_name := h_measure_rec_out.func_area_short_name;
8044
8045 EXCEPTION
8046 WHEN e_error THEN
8047 x_error_msg := h_error_tbl(1).Error_Description;
8048 WHEN others THEN
8049 x_error_msg := SQLERRM;
8050 x_return_status := FND_API.G_RET_STS_ERROR;
8051 END Retrieve_Measure;
8052
8053
8054 -- ENH_B_TABLES_PERF: new function
8055 /*===========================================================================+
8056 | FUNCTION Get_RowId_Table_Name
8057 +============================================================================*/
8058 FUNCTION Get_RowId_Table_Name (
8059 x_table_name IN VARCHAR2
8060 ) RETURN VARCHAR2 IS
8061 h_list dbms_sql.varchar2_table;
8062 h_values dbms_sql.varchar2_table;
8063 BEGIN
8064 h_list.delete;
8065 h_list(1) := BSC_DBGEN_STD_METADATA.BSC_I_ROWID_TABLE;
8066 h_values := BSC_DBGEN_METADATA_READER.Get_Table_Properties(x_table_name, h_list);
8067 RETURN h_values(1);
8068 END Get_RowId_Table_Name;
8069
8070
8071 -- ENH_B_TABLES_PERF: new function
8072 /*===========================================================================+
8073 | FUNCTION Get_Proj_Table_Name
8074 +============================================================================*/
8075 FUNCTION Get_Proj_Table_Name (
8076 x_table_name IN VARCHAR2
8077 ) RETURN VARCHAR2 IS
8078 h_list dbms_sql.varchar2_table;
8079 h_values dbms_sql.varchar2_table;
8080 BEGIN
8081 h_list.delete;
8082 h_list(1) := BSC_DBGEN_STD_METADATA.BSC_B_PRJ_TABLE;
8083 h_values := BSC_DBGEN_METADATA_READER.Get_Table_Properties(x_table_name, h_list);
8084 RETURN h_values(1);
8085 END Get_Proj_Table_Name;
8086
8087
8088 -- ENH_B_TABLES_PERF: new function
8089 /*===========================================================================+
8090 | FUNCTION Get_Num_Partitions
8091 +============================================================================*/
8092 FUNCTION Get_Num_Partitions (
8093 x_table_name IN VARCHAR2
8094 ) RETURN NUMBER IS
8095 h_list dbms_sql.varchar2_table;
8096 h_values dbms_sql.varchar2_table;
8097 BEGIN
8098 h_list.delete;
8099 h_list(1) := BSC_DBGEN_STD_METADATA.BSC_PARTITION;
8100 h_values := BSC_DBGEN_METADATA_READER.Get_Table_Properties(x_table_name, h_list);
8101 RETURN TO_NUMBER(h_values(1));
8102 END Get_Num_Partitions;
8103
8104
8105 -- ENH_B_TABLES_PERF: new function
8106 /*===========================================================================+
8107 | FUNCTION Migrate_BTable_With_Partitions
8108 +============================================================================*/
8109 FUNCTION Migrate_BTable_With_Partitions (
8110 x_base_table IN VARCHAR2,
8111 x_proj_table IN VARCHAR2
8112 ) RETURN BOOLEAN IS
8113 e_unexpected_error EXCEPTION;
8114
8115 h_base_message VARCHAR2(4000);
8116 h_message VARCHAR2(4000);
8117 h_sql VARCHAR2(32000);
8118
8119 h_table VARCHAR2(30);
8120 h_num_partitions NUMBER;
8121 h_max_partitions NUMBER;
8122
8123 h_key_columns BSC_UPDATE_UTIL.t_array_of_varchar2;
8124 h_key_dim_tables BSC_UPDATE_UTIL.t_array_of_varchar2;
8125 h_source_columns BSC_UPDATE_UTIL.t_array_of_varchar2;
8126 h_source_dim_tables BSC_UPDATE_UTIL.t_array_of_varchar2;
8127 h_num_key_columns NUMBER;
8128
8129 h_i NUMBER;
8130 h_j NUMBER;
8131 h_level_table_name VARCHAR2(100);
8132 h_level_short_name VARCHAR2(300);
8133 h_level_source VARCHAR2(100);
8134 h_dbi_dim_data BSC_UPDATE_DIM.t_dbi_dim_data;
8135
8136 CURSOR c_columns(p_table varchar2) IS
8137 SELECT column_name
8138 FROM all_tab_columns
8139 WHERE table_name = UPPER(p_table) AND
8140 owner = UPPER(BSC_APPS.BSC_APPS_SCHEMA);
8141
8142 h_column VARCHAR2(50);
8143 h_batch_column VARCHAR2(50);
8144 h_lst_select VARCHAR2(32000);
8145 h_lst_insert VARCHAR2(32000);
8146 h_where_cond VARCHAR2(32000);
8147
8148 BEGIN
8149
8150 h_base_message := BSC_APPS.Get_Message('BSC_MIG_DATA');
8151
8152 h_max_partitions := bsc_dbgen_metadata_reader.get_max_partitions;
8153 h_num_partitions := Get_Num_Partitions(x_base_table);
8154 h_batch_column := UPPER(BSC_DBGEN_STD_METADATA.BSC_BATCH_COLUMN_NAME);
8155
8156 IF h_num_partitions <> h_max_partitions THEN
8157 h_num_key_columns := 0;
8158 IF NOT BSC_UPDATE_UTIL.Get_Information_Key_Columns(x_base_table,
8159 h_key_columns,
8160 h_key_dim_tables,
8161 h_source_columns,
8162 h_source_dim_tables,
8163 h_num_key_columns) THEN
8164 RAISE e_unexpected_error;
8165 END IF;
8166
8167 FOR h_i IN 1..h_num_key_columns LOOP
8168 -- Bug4769877
8169 -- BSC-BIS-DIMENSIONS: If the dimension is a BIS dimension we do not need to join
8170 -- to the dimension table because the code and user_code is the same. We
8171 -- do not need to translate code into user_code
8172 SELECT source
8173 INTO h_level_source
8174 FROM bsc_sys_dim_levels_b
8175 WHERE level_view_name = h_key_dim_tables(h_i);
8176 IF h_level_source = 'PMF' THEN
8177 h_key_dim_tables(h_i) := null;
8178 END IF;
8179 END LOOP;
8180
8181 FOR h_i IN 1..2 LOOP
8182 IF h_i = 1 THEN
8183 h_table := x_base_table;
8184 ELSE
8185 h_table := x_proj_table;
8186 END IF;
8187
8188 -- Bug4769877: review from here
8189 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', h_table);
8190 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
8191
8192 h_lst_insert := null;
8193 h_lst_select := null;
8194
8195 OPEN c_columns(h_table);
8196 LOOP
8197 FETCH c_columns INTO h_column;
8198 EXIT WHEN c_columns%NOTFOUND;
8199
8200 IF h_lst_insert IS NOT NULL THEN
8201 h_lst_insert := h_lst_insert||', ';
8202 h_lst_select := h_lst_select||', ';
8203 END IF;
8204 h_lst_insert := h_lst_insert||h_column;
8205
8206 IF h_column = h_batch_column THEN
8207 IF h_num_key_columns > 0 AND h_max_partitions > 1 THEN
8208 h_lst_select := h_lst_select||'dbms_utility.get_hash_value(';
8209 FOR h_j IN 1..h_num_key_columns LOOP
8210 IF h_j > 1 THEN
8211 h_lst_select := h_lst_select||'||''.''||';
8212 END IF;
8213 IF h_key_dim_tables(h_j) IS NULL THEN
8214 h_lst_select := h_lst_select||'b.'||h_key_columns(h_j);
8215 ELSE
8216 h_lst_select := h_lst_select||h_key_dim_tables(h_j)||'.USER_CODE';
8217 END IF;
8218 END LOOP;
8219 h_lst_select := h_lst_select||', 0, '||h_max_partitions||')';
8220 ELSE
8221 h_lst_select := h_lst_select||'0';
8222 END IF;
8223 ELSE
8224 h_lst_select := h_lst_select||'b.'||h_column;
8225 END IF;
8226 END LOOP;
8227 CLOSE c_columns;
8228
8229 h_sql := 'insert /*+ append parallel('||h_table||') */ into '||h_table||
8230 ' ('||h_lst_insert||')'||
8231 ' select /*+ parallel(b)';
8232 FOR h_j IN 1..h_num_key_columns LOOP
8233 IF h_key_dim_tables(h_j) IS NOT NULL THEN
8234 h_sql := h_sql||' parallel('||h_key_dim_tables(h_j)||')';
8235 END IF;
8236 END LOOP;
8237 h_sql := h_sql||' */ '||h_lst_select||
8238 ' from '||h_table||'@'||g_db_link||' b';
8239 FOR h_j IN 1..h_num_key_columns LOOP
8240 IF h_key_dim_tables(h_j) IS NOT NULL THEN
8241 h_sql := h_sql||', '||h_key_dim_tables(h_j)||'@'||g_db_link;
8242 END IF;
8243 END LOOP;
8244 h_where_cond := null;
8245 FOR h_j IN 1..h_num_key_columns LOOP
8246 IF h_key_dim_tables(h_j) IS NOT NULL THEN
8247 IF h_where_cond IS NULL THEN
8248 h_where_cond := 'where ';
8249 ELSE
8250 h_where_cond := h_where_cond||' and ';
8251 END IF;
8252 h_where_cond := h_where_cond||'b.'||h_key_columns(h_j)||' = '||h_key_dim_tables(h_j)||'.CODE';
8253 END IF;
8254 END LOOP;
8255 IF h_where_cond IS NOT NULL THEN
8256 h_sql := h_sql||' '||h_where_cond;
8257 END IF;
8258 execute immediate h_sql;
8259 commit;
8260 END LOOP;
8261
8262 -- Update the property PARTITIONS in BSC_DB_TABLES for this base table
8263 IF h_num_key_columns > 0 THEN
8264 bsc_dbgen_metadata_reader.set_table_property(x_base_table, BSC_DBGEN_STD_METADATA.BSC_PARTITION, h_max_partitions);
8265 commit;
8266 END IF;
8267 ELSE
8268 -- No difference in the number of partitions. So we can just insert from select, no need to fix batch column
8269 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', x_base_table);
8270 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
8271
8272 h_sql := 'INSERT /*+ append parallel('||x_base_table||') */ INTO '||x_base_table||
8273 ' SELECT /*+ parallel('||x_base_table||') */ * FROM '||x_base_table||'@'||g_db_link;
8274 BSC_APPS.Execute_Immediate(h_sql);
8275 commit;
8276
8277 h_message := BSC_APPS.Replace_Token(h_base_message, 'TABLE', x_proj_table);
8278 BSC_APPS.Write_Line_Log(h_message, BSC_APPS.OUTPUT_FILE);
8279
8280 h_sql := 'INSERT /*+ append parallel('||x_proj_table||') */ INTO '||x_proj_table||
8281 ' SELECT /*+ parallel('||x_proj_table||') */ * FROM '||x_proj_table||'@'||g_db_link;
8282 BSC_APPS.Execute_Immediate(h_sql);
8283 commit;
8284 END IF;
8285
8286 RETURN TRUE;
8287
8288 EXCEPTION
8289 WHEN e_unexpected_error THEN
8290 BSC_MESSAGE.Add (x_message => BSC_APPS.Get_Message('BSC_UNEXPECTED_ERROR'),
8291 x_source => 'BSC_MIGRATION.Migrate_BTable_With_Partitions');
8292 RETURN FALSE;
8293
8294 WHEN OTHERS THEN
8295 BSC_MESSAGE.Add (x_message => SQLERRM,
8296 x_source => 'BSC_MIGRATION.Migrate_BTable_With_Partitions');
8297 RETURN FALSE;
8298 END Migrate_BTable_With_Partitions;
8299
8300
8301 -- Enh#4697749 New procedure
8302 /*===========================================================================+
8303 | FUNCTION Migrate_AK_Region
8304 +============================================================================*/
8305 FUNCTION Migrate_AK_Region(
8306 p_region_code IN VARCHAR2,
8307 x_error_msg OUT NOCOPY VARCHAR2
8308 ) RETURN BOOLEAN IS
8309
8310 e_delete_ak_region_error EXCEPTION;
8311
8312 TYPE t_cursor IS REF CURSOR;
8313 h_cursor t_cursor;
8314 h_cursor1 t_cursor;
8315 h_sql VARCHAR2(32000);
8316 h_count NUMBER;
8317 h_return_status VARCHAR2(200);
8318 h_msg_count NUMBER;
8319 h_msg_data VARCHAR2(2000);
8320
8321 h_rowid VARCHAR2(2000);
8322 h_region_application_id NUMBER;
8323 h_database_object_name VARCHAR2(30);
8324 h_name VARCHAR2(80);
8325 h_description VARCHAR2(2000);
8326 h_num_rows_display NUMBER;
8327 h_region_style VARCHAR2(30);
8328 h_region_object_type VARCHAR2(240);
8329 h_isform_flag VARCHAR2(1);
8330 h_attribute_category VARCHAR2(30);
8331 h_attribute1 VARCHAR2(150);
8332 h_attribute2 VARCHAR2(150);
8333 h_attribute3 VARCHAR2(150);
8334 h_attribute4 VARCHAR2(150);
8335 h_attribute5 VARCHAR2(150);
8336 h_attribute6 VARCHAR2(150);
8337 h_attribute7 VARCHAR2(150);
8338 h_attribute8 VARCHAR2(150);
8339 h_attribute9 VARCHAR2(150);
8340 h_attribute10 VARCHAR2(150);
8341 h_attribute11 VARCHAR2(150);
8342 h_attribute12 VARCHAR2(150);
8343 h_attribute13 VARCHAR2(150);
8344 h_attribute14 VARCHAR2(150);
8345 h_attribute15 VARCHAR2(150);
8346 h_attribute16 VARCHAR2(150);
8347 h_attribute17 VARCHAR2(150);
8348 h_attribute18 VARCHAR2(150);
8349 h_attribute19 VARCHAR2(150);
8350 h_attribute20 VARCHAR2(150);
8351 h_attribute21 VARCHAR2(150);
8352 h_attribute22 VARCHAR2(150);
8353 h_attribute23 VARCHAR2(150);
8354 h_attribute24 VARCHAR2(150);
8355 h_attribute25 VARCHAR2(150);
8356 h_attribute26 VARCHAR2(150);
8357 h_attribute27 VARCHAR2(150);
8358 h_attribute28 VARCHAR2(150);
8359 h_attribute29 VARCHAR2(150);
8360 h_attribute30 VARCHAR2(150);
8361 h_attribute31 VARCHAR2(150);
8362 h_attribute32 VARCHAR2(150);
8363 h_attribute33 VARCHAR2(150);
8364 h_attribute34 VARCHAR2(150);
8365 h_attribute35 VARCHAR2(150);
8366 h_attribute36 VARCHAR2(150);
8367 h_attribute37 VARCHAR2(150);
8368 h_attribute38 VARCHAR2(150);
8369 h_attribute39 VARCHAR2(150);
8370 h_attribute40 VARCHAR2(150);
8371 h_created_by NUMBER;
8372
8373 h_attribute_application_id NUMBER;
8374 h_attribute_code VARCHAR2(30);
8375 h_display_sequence NUMBER;
8376 h_node_display_flag VARCHAR2(1);
8377 h_node_query_flag VARCHAR2(1);
8378 h_attribute_label_long VARCHAR2(80);
8379 h_attribute_label_length NUMBER;
8380 h_display_value_length NUMBER;
8381 h_item_style VARCHAR2(30);
8382 h_required_flag VARCHAR2(1);
8383 h_nested_region_code VARCHAR2(30);
8384 h_nested_region_application_id NUMBER;
8385 h_url VARCHAR2(2000);
8386 h_order_sequence NUMBER;
8387 h_order_direction VARCHAR2(30);
8388
8389 BEGIN
8390 IF Item_Belong_To_Array_Varchar2(p_region_code, g_migrated_ak_regions, g_num_migrated_ak_regions) THEN
8391 -- This ak region was migrated before during htis process. No need to migrate it again
8392 RETURN TRUE;
8393 END IF;
8394
8395 h_sql := 'SELECT region_application_id, database_object_name, name,'||
8396 ' description, num_rows_display, region_style, region_object_type,'||
8397 ' isform_flag, attribute_category, attribute1, attribute2, attribute3,'||
8398 ' attribute4, attribute5, attribute6, attribute7, attribute8, attribute9,'||
8399 ' attribute10, attribute11, attribute12, attribute13, attribute14,'||
8400 ' attribute15, created_by'||
8401 ' FROM ak_regions_vl@'||g_db_link||
8402 ' WHERE region_code = :1';
8403 OPEN h_cursor FOR h_sql USING p_region_code;
8404 FETCH h_cursor INTO h_region_application_id, h_database_object_name, h_name,
8405 h_description, h_num_rows_display, h_region_style, h_region_object_type,
8406 h_isform_flag, h_attribute_category, h_attribute1, h_attribute2, h_attribute3,
8407 h_attribute4, h_attribute5, h_attribute6, h_attribute7, h_attribute8, h_attribute9,
8408 h_attribute10, h_attribute11, h_attribute12, h_attribute13, h_attribute14,
8409 h_attribute15, h_created_by;
8410 IF h_cursor%NOTFOUND THEN
8411 -- The ak region does not exists in the source system
8412 CLOSE h_cursor;
8413 g_num_migrated_ak_regions := g_num_migrated_ak_regions + 1;
8414 g_migrated_ak_regions(g_num_migrated_ak_regions) := p_region_code;
8415 RETURN TRUE;
8416 END IF;
8417 CLOSE h_cursor;
8418
8419 --bug 5099776
8420 IF (h_created_by = 1) OR (h_created_by = 2) or (h_created_by = 120) or (h_created_by = 121)THEN
8421 -- The ak region is pre-seeded. We cannot create a pre-seeded ak region in the target
8422 g_num_migrated_ak_regions := g_num_migrated_ak_regions + 1;
8423 g_migrated_ak_regions(g_num_migrated_ak_regions) := p_region_code;
8424 RETURN TRUE;
8425 END IF;
8426
8427 -- Check if the ak region exists on the target
8428 h_count := 0;
8429 select count(region_code) into h_count
8430 from ak_regions
8431 where region_application_id = h_region_application_id and
8432 region_code = p_region_code;
8433
8434 IF h_count > 0 THEN
8435 -- Delete ak region from target.
8436 BIS_AK_REGION_PUB.DELETE_REGION_AND_REGION_ITEMS(
8437 p_REGION_CODE => p_region_code
8438 ,p_REGION_APPLICATION_ID => h_region_application_id
8439 ,x_return_status => h_return_status
8440 ,x_msg_count => h_msg_count
8441 ,x_msg_data => h_msg_data
8442 );
8443
8444 IF (h_return_status IS NOT NULL) AND (h_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
8445 RAISE e_delete_ak_region_error;
8446 END IF;
8447 END IF;
8448
8449 -- Create the ak region in the target
8450 BIS_AK_REGION_PUB.INSERT_REGION_ROW (
8451 X_ROWID => h_rowid,
8452 X_USER_ID => fnd_global.user_id,
8453 X_REGION_APPLICATION_ID => h_region_application_id,
8454 X_REGION_CODE => p_region_code,
8455 X_DATABASE_OBJECT_NAME => h_database_object_name,
8456 X_NAME => h_name,
8457 X_DESCRIPTION => h_description,
8458 X_NUM_ROWS_DISPLAY => h_num_rows_display,
8459 X_REGION_STYLE => h_region_style,
8460 X_REGION_OBJECT_TYPE => h_region_object_type,
8461 X_ISFORM_FLAG => h_isform_flag,
8462 X_ATTRIBUTE_CATEGORY => h_attribute_category,
8463 X_ATTRIBUTE1 => h_attribute1,
8464 X_ATTRIBUTE2 => h_attribute2,
8465 X_ATTRIBUTE3 => h_attribute3,
8466 X_ATTRIBUTE4 => h_attribute4,
8467 X_ATTRIBUTE5 => h_attribute5,
8468 X_ATTRIBUTE6 => h_attribute6,
8469 X_ATTRIBUTE7 => h_attribute7,
8470 X_ATTRIBUTE8 => h_attribute8,
8471 X_ATTRIBUTE9 => h_attribute9,
8472 X_ATTRIBUTE10 => h_attribute10,
8473 X_ATTRIBUTE11 => h_attribute11,
8474 X_ATTRIBUTE12 => h_attribute12,
8475 X_ATTRIBUTE13 => h_attribute13,
8476 X_ATTRIBUTE14 => h_attribute14,
8477 X_ATTRIBUTE15 => h_attribute15
8478 );
8479
8480 -- Create ak region extension
8481 h_sql := 'select attribute16, attribute17, attribute18, attribute19, attribute20, attribute21,'||
8482 ' attribute22, attribute23, attribute24, attribute25, attribute26, attribute27,'||
8483 ' attribute28, attribute29, attribute30, attribute31, attribute32, attribute33,'||
8484 ' attribute34, attribute35, attribute36, attribute37, attribute38, attribute39,'||
8485 ' attribute40'||
8486 ' from bis_ak_region_extension@'||g_db_link||
8487 ' where region_code = :1 and region_application_id = :2';
8488 OPEN h_cursor FOR h_sql USING p_region_code, h_region_application_id;
8489 FETCH h_cursor INTO h_attribute16, h_attribute17, h_attribute18, h_attribute19, h_attribute20, h_attribute21,
8490 h_attribute22, h_attribute23, h_attribute24, h_attribute25, h_attribute26, h_attribute27,
8491 h_attribute28, h_attribute29, h_attribute30, h_attribute31, h_attribute32, h_attribute33,
8492 h_attribute34, h_attribute35, h_attribute36, h_attribute37, h_attribute38, h_attribute39,
8493 h_attribute40;
8494 IF h_cursor%FOUND THEN
8495 BIS_REGION_EXTENSION_PVT.CREATE_REGION_EXTN_RECORD(
8496 p_commit => FND_API.G_FALSE
8497 ,pRegionCode => p_region_code
8498 ,pRegionAppId => h_region_application_id
8499 ,pAttribute16 => h_attribute16
8500 ,pAttribute17 => h_attribute17
8501 ,pAttribute18 => h_attribute18
8502 ,pAttribute19 => h_attribute19
8503 ,pAttribute20 => h_attribute20
8504 ,pAttribute21 => h_attribute21
8505 ,pAttribute22 => h_attribute22
8506 ,pAttribute23 => h_attribute23
8507 ,pAttribute24 => h_attribute24
8508 ,pAttribute25 => h_attribute25
8509 ,pAttribute26 => h_attribute26
8510 ,pAttribute27 => h_attribute27
8511 ,pAttribute28 => h_attribute28
8512 ,pAttribute29 => h_attribute29
8513 ,pAttribute30 => h_attribute30
8514 ,pAttribute31 => h_attribute31
8515 ,pAttribute32 => h_attribute32
8516 ,pAttribute33 => h_attribute33
8517 ,pAttribute34 => h_attribute34
8518 ,pAttribute35 => h_attribute35
8519 ,pAttribute36 => h_attribute36
8520 ,pAttribute37 => h_attribute37
8521 ,pAttribute38 => h_attribute38
8522 ,pAttribute39 => h_attribute39
8523 ,pAttribute40 => h_attribute40
8524 );
8525 END IF;
8526 CLOSE h_cursor;
8527
8528 -- Migrate ak region items
8529 h_sql := 'select attribute_application_id, attribute_code, display_sequence, node_display_flag,'||
8530 ' node_query_flag, attribute_label_long, attribute_label_length, display_value_length,'||
8531 ' item_style, required_flag, nested_region_code, nested_region_application_id,'||
8532 ' attribute_category, attribute1, attribute2, attribute3, attribute4, attribute5,'||
8533 ' attribute6, attribute7, attribute8, attribute9, attribute10, attribute11, attribute12,'||
8534 ' attribute13, attribute14, attribute15, url, order_sequence, order_direction'||
8535 ' from ak_region_items_vl@'||g_db_link||
8536 ' where region_code = :1 and region_application_id = :2';
8537 OPEN h_cursor FOR h_sql USING p_region_code, h_region_application_id;
8538 LOOP
8539 FETCH h_cursor INTO h_attribute_application_id, h_attribute_code, h_display_sequence, h_node_display_flag,
8540 h_node_query_flag, h_attribute_label_long, h_attribute_label_length, h_display_value_length,
8541 h_item_style, h_required_flag, h_nested_region_code, h_nested_region_application_id,
8542 h_attribute_category, h_attribute1, h_attribute2, h_attribute3, h_attribute4, h_attribute5,
8543 h_attribute6, h_attribute7, h_attribute8, h_attribute9, h_attribute10, h_attribute11, h_attribute12,
8544 h_attribute13, h_attribute14, h_attribute15, h_url, h_order_sequence, h_order_direction;
8545
8546 EXIT WHEN h_cursor%NOTFOUND;
8547
8548 BIS_AK_REGION_PUB.INSERT_REGION_ITEM_ROW (
8549 X_ROWID => h_rowid,
8550 X_USER_ID => fnd_global.user_id,
8551 X_REGION_APPLICATION_ID => h_region_application_id,
8552 X_REGION_CODE => p_region_code,
8553 X_ATTRIBUTE_APPLICATION_ID => h_attribute_application_id,
8554 X_ATTRIBUTE_CODE => h_attribute_code,
8555 X_DISPLAY_SEQUENCE => h_display_sequence,
8556 X_NODE_DISPLAY_FLAG => h_node_display_flag,
8557 X_NODE_QUERY_FLAG => h_node_query_flag,
8558 X_ATTRIBUTE_LABEL_LONG => h_attribute_label_long,
8559 X_ATTRIBUTE_LABEL_LENGTH => h_attribute_label_length,
8560 X_DISPLAY_VALUE_LENGTH => h_display_value_length,
8561 X_ITEM_STYLE => h_item_style,
8562 X_REQUIRED_FLAG => h_required_flag,
8563 X_NESTED_REGION_CODE => h_nested_region_code,
8564 X_NESTED_REGION_APPL_ID => h_nested_region_application_id,
8565 X_ATTRIBUTE_CATEGORY => h_attribute_category,
8566 X_ATTRIBUTE1 => h_attribute1,
8567 X_ATTRIBUTE2 => h_attribute2,
8568 X_ATTRIBUTE3 => h_attribute3,
8569 X_ATTRIBUTE4 => h_attribute4,
8570 X_ATTRIBUTE5 => h_attribute5,
8571 X_ATTRIBUTE6 => h_attribute6,
8572 X_ATTRIBUTE7 => h_attribute7,
8573 X_ATTRIBUTE8 => h_attribute8,
8574 X_ATTRIBUTE9 => h_attribute9,
8575 X_ATTRIBUTE10 => h_attribute10,
8576 X_ATTRIBUTE11 => h_attribute11,
8577 X_ATTRIBUTE12 => h_attribute12,
8578 X_ATTRIBUTE13 => h_attribute13,
8579 X_ATTRIBUTE14 => h_attribute14,
8580 X_ATTRIBUTE15 => h_attribute15,
8581 X_URL => h_url,
8582 X_ORDER_SEQUENCE => h_order_sequence,
8583 X_ORDER_DIRECTION => h_order_direction
8584 );
8585
8586 -- migrate region items extensions
8587 h_sql := 'SELECT attribute16, attribute17, attribute18, attribute19, attribute20, attribute21,'||
8588 ' attribute22, attribute23, attribute24, attribute25, attribute26, attribute27,'||
8589 ' attribute28, attribute29, attribute30, attribute31, attribute32, attribute33,'||
8590 ' attribute34, attribute35, attribute36, attribute37, attribute38, attribute39,'||
8591 ' attribute40'||
8592 ' from bis_ak_region_item_extension@'||g_db_link||
8593 ' where region_code = :1 and region_application_id = :2 and'||
8594 ' attribute_code = :3 and attribute_application_id = :4';
8595 OPEN h_cursor1 FOR h_sql USING p_region_code, h_region_application_id, h_attribute_code, h_attribute_application_id;
8596 FETCH h_cursor1 INTO h_attribute16, h_attribute17, h_attribute18, h_attribute19, h_attribute20, h_attribute21,
8597 h_attribute22, h_attribute23, h_attribute24, h_attribute25, h_attribute26, h_attribute27,
8598 h_attribute28, h_attribute29, h_attribute30, h_attribute31, h_attribute32, h_attribute33,
8599 h_attribute34, h_attribute35, h_attribute36, h_attribute37, h_attribute38, h_attribute39,
8600 h_attribute40;
8601 IF h_cursor1%FOUND THEN
8602 BIS_REGION_ITEM_EXTENSION_PVT.CREATE_REGION_ITEM_RECORD(
8603 pRegionCode => p_region_code
8604 ,pRegionAppId => h_region_application_id
8605 ,pAttributeCode => h_attribute_code
8606 ,pAttributeAppId => h_attribute_application_id
8607 ,pAttribute16 => h_attribute16
8608 ,pAttribute17 => h_attribute17
8609 ,pAttribute18 => h_attribute18
8610 ,pAttribute19 => h_attribute19
8611 ,pAttribute20 => h_attribute20
8612 ,pAttribute21 => h_attribute21
8613 ,pAttribute22 => h_attribute22
8614 ,pAttribute23 => h_attribute23
8615 ,pAttribute24 => h_attribute24
8616 ,pAttribute25 => h_attribute25
8617 ,pAttribute26 => h_attribute26
8618 ,pAttribute27 => h_attribute27
8619 ,pAttribute28 => h_attribute28
8620 ,pAttribute29 => h_attribute29
8621 ,pAttribute30 => h_attribute30
8622 ,pAttribute31 => h_attribute31
8623 ,pAttribute32 => h_attribute32
8624 ,pAttribute33 => h_attribute33
8625 ,pAttribute34 => h_attribute34
8626 ,pAttribute35 => h_attribute35
8627 ,pAttribute36 => h_attribute36
8628 ,pAttribute37 => h_attribute37
8629 ,pAttribute38 => h_attribute38
8630 ,pAttribute39 => h_attribute39
8631 ,pAttribute40 => h_attribute40
8632 ,pCommit => 'N'
8633 );
8634 END IF;
8635 CLOSE h_cursor1;
8636 END LOOP;
8637 CLOSE h_cursor;
8638
8639 g_num_migrated_ak_regions := g_num_migrated_ak_regions + 1;
8640 g_migrated_ak_regions(g_num_migrated_ak_regions) := p_region_code;
8641
8642 commit;
8643 RETURN TRUE;
8644
8645 EXCEPTION
8646 WHEN e_delete_ak_region_error THEN
8647 rollback;
8648 x_error_msg := h_msg_data;
8649 RETURN FALSE;
8650 WHEN OTHERS THEN
8651 rollback;
8652 x_error_msg := SQLERRM;
8653 RETURN FALSE;
8654 END Migrate_AK_Region;
8655
8656
8657 -- Enh#4697749 New procedure
8658 /*===========================================================================+
8659 | FUNCTION Migrate_Form_Function
8660 +============================================================================*/
8661 FUNCTION Migrate_Form_Function(
8662 p_function_name IN VARCHAR2,
8663 x_error_msg OUT NOCOPY VARCHAR2
8664 ) RETURN BOOLEAN IS
8665
8666 TYPE t_cursor IS REF CURSOR;
8667 h_cursor t_cursor;
8668 h_sql VARCHAR2(32000);
8669 h_count NUMBER;
8670
8671 CURSOR c_function_id IS
8672 SELECT function_id
8673 FROM fnd_form_functions
8674 WHERE function_name = p_function_name;
8675
8676 h_rowid VARCHAR2(2000);
8677 h_function_id NUMBER;
8678 h_web_host_name VARCHAR2(80);
8679 h_web_agent_name VARCHAR2(80);
8680 h_web_html_call VARCHAR2(240);
8681 h_web_encrypt_parameters VARCHAR2(1);
8682 h_web_secured VARCHAR2(1);
8683 h_web_icon VARCHAR2(30);
8684 h_object_id NUMBER;
8685 h_region_application_id NUMBER;
8686 h_region_code VARCHAR2(30);
8687 h_application_id NUMBER;
8688 h_form_id NUMBER;
8689 h_parameters VARCHAR2(2000);
8690 h_type VARCHAR2(30);
8691 h_user_function_name VARCHAR2(80);
8692 h_description VARCHAR2(240);
8693 h_maintenance_mode_support VARCHAR2(8);
8694 h_context_dependence VARCHAR2(8);
8695 h_jrad_ref_path VARCHAR2(1000);
8696 h_created_by NUMBER;
8697
8698 BEGIN
8699 IF Item_Belong_To_Array_Varchar2(p_function_name, g_migrated_functions, g_num_migrated_functions) THEN
8700 -- This form function was migrated before during this process. No need to migrate it again
8701 RETURN TRUE;
8702 END IF;
8703
8704 h_sql := 'SELECT web_host_name, web_agent_name, web_html_call, web_encrypt_parameters,'||
8705 ' web_secured, web_icon, object_id, region_application_id, region_code,'||
8706 ' application_id, form_id, parameters, type, user_function_name,'||
8707 ' description, maintenance_mode_support, context_dependence, jrad_ref_path,'||
8708 ' created_by'||
8709 ' FROM fnd_form_functions_vl@'||g_db_link||
8710 ' WHERE function_name = :1';
8711 OPEN h_cursor FOR h_sql USING p_function_name;
8712 FETCH h_cursor INTO h_web_host_name, h_web_agent_name, h_web_html_call, h_web_encrypt_parameters,
8713 h_web_secured, h_web_icon, h_object_id, h_region_application_id, h_region_code,
8714 h_application_id, h_form_id, h_parameters, h_type, h_user_function_name,
8715 h_description, h_maintenance_mode_support, h_context_dependence, h_jrad_ref_path,
8716 h_created_by;
8717 IF h_cursor%NOTFOUND THEN
8718 -- The form function does not exists in the source system
8719 CLOSE h_cursor;
8720 g_num_migrated_functions := g_num_migrated_functions + 1;
8721 g_migrated_functions(g_num_migrated_functions) := p_function_name;
8722 RETURN TRUE;
8723 END IF;
8724 CLOSE h_cursor;
8725 -- bug 5099776
8726 IF (h_created_by = 1) OR (h_created_by = 2) or (h_created_by = 120) or (h_created_by = 121) THEN
8727 -- The form function is pre-seeded. We cannot create a pre-seeded form function in the target
8728 g_num_migrated_functions := g_num_migrated_functions + 1;
8729 g_migrated_functions(g_num_migrated_functions) := p_function_name;
8730 RETURN TRUE;
8731 END IF;
8732
8733 -- Check if the form function exists on the target
8734 OPEN c_function_id;
8735 FETCH c_function_id INTO h_function_id;
8736 IF c_function_id%FOUND THEN
8737 -- Delete the form function from the target
8738 FND_FORM_FUNCTIONS_PKG.DELETE_ROW(X_FUNCTION_ID => h_function_id);
8739 END IF;
8740 CLOSE c_function_id;
8741
8742 -- Create the form function in the target
8743 SELECT fnd_form_functions_s.nextval INTO h_function_id FROM DUAL;
8744
8745 FND_FORM_FUNCTIONS_PKG.INSERT_ROW (
8746 X_ROWID => h_rowid,
8747 X_FUNCTION_ID => h_function_id,
8748 X_WEB_HOST_NAME => h_web_host_name,
8749 X_WEB_AGENT_NAME => h_web_agent_name,
8750 X_WEB_HTML_CALL => h_web_html_call,
8751 X_WEB_ENCRYPT_PARAMETERS => h_web_encrypt_parameters,
8752 X_WEB_SECURED => h_web_secured,
8753 X_WEB_ICON => h_web_icon,
8754 X_OBJECT_ID => h_object_id,
8755 X_REGION_APPLICATION_ID => h_region_application_id,
8756 X_REGION_CODE => h_region_code,
8757 X_FUNCTION_NAME => p_function_name,
8758 X_APPLICATION_ID => h_application_id,
8759 X_FORM_ID => h_form_id,
8760 X_PARAMETERS => h_parameters,
8761 X_TYPE => h_type,
8762 X_USER_FUNCTION_NAME => h_user_function_name,
8763 X_DESCRIPTION => h_description,
8764 X_CREATION_DATE => sysdate,
8765 X_CREATED_BY => fnd_global.user_id,
8766 X_LAST_UPDATE_DATE => sysdate,
8767 X_LAST_UPDATED_BY => fnd_global.user_id,
8768 X_LAST_UPDATE_LOGIN => fnd_global.user_id,
8769 X_MAINTENANCE_MODE_SUPPORT => h_maintenance_mode_support,
8770 X_CONTEXT_DEPENDENCE => h_context_dependence,
8771 X_JRAD_REF_PATH => h_jrad_ref_path
8772 );
8773
8774 g_num_migrated_functions := g_num_migrated_functions + 1;
8775 g_migrated_functions(g_num_migrated_functions) := p_function_name;
8776
8777 commit;
8778 RETURN TRUE;
8779
8780 EXCEPTION
8781 WHEN OTHERS THEN
8782 rollback;
8783 x_error_msg := SQLERRM;
8784 RETURN FALSE;
8785 END Migrate_Form_Function;
8786
8787
8788 -- Fix bug#4873385
8789 /*===========================================================================+
8790 | FUNCTION Get_Source_User_Id
8791 +============================================================================*/
8792 FUNCTION Get_Source_User_Id RETURN NUMBER IS
8793 TYPE t_cursor IS REF CURSOR;
8794 h_cursor t_cursor;
8795
8796 h_sql VARCHAR2(32000);
8797 h_source_user_id NUMBER;
8798 h_def_user VARCHAR2(200);
8799 BEGIN
8800 --Fix bug#4873385 if the user BSC_APPS.apps_user_id does not exists in the source system
8801 -- then we lock the source system with the user ANONYMOUS
8802 h_def_user := 'ANONYMOUS';
8803
8804 h_sql := 'select s.user_id'||
8805 ' from fnd_user@'||g_db_link||' s, fnd_user t'||
8806 ' where t.user_name = s.user_name and t.user_id = :1';
8807 OPEN h_cursor FOR h_sql USING BSC_APPS.apps_user_id;
8808 FETCH h_cursor INTO h_source_user_id;
8809 IF h_cursor%NOTFOUND THEN
8810 h_source_user_id := NULL;
8811 END IF;
8812 CLOSE h_cursor;
8813
8814 IF h_source_user_id IS NULL THEN
8815 h_sql := 'select user_id'||
8816 ' from fnd_user@'||g_db_link||
8817 ' where user_name = :1';
8818 OPEN h_cursor FOR h_sql USING h_def_user;
8819 FETCH h_cursor INTO h_source_user_id;
8820 IF h_cursor%NOTFOUND THEN
8821 h_source_user_id := 0;
8822 END IF;
8823 CLOSE h_cursor;
8824 END IF;
8825
8826 RETURN h_source_user_id;
8827
8828 END Get_Source_User_Id;
8829
8830 /************************************************************************************
8831 -- API name : Update_AK_Item_Props
8832 -- Type : Private
8833 -- Function :
8834 ************************************************************************************/
8835
8836 PROCEDURE Update_AK_Item_Props (
8837 p_commit IN VARCHAR2 := FND_API.G_FALSE
8838 ,p_region_code IN VARCHAR2
8839 ,p_region_application_id IN NUMBER
8840 ,p_Attribute_Code IN AK_REGION_ITEMS.ATTRIBUTE_CODE%TYPE
8841 ,p_Attribute_Application_Id IN AK_REGION_ITEMS.ATTRIBUTE_APPLICATION_ID%TYPE
8842 ,p_Attribute2 IN AK_REGION_ITEMS.ATTRIBUTE2%TYPE
8843 ,x_return_status OUT NOCOPY VARCHAR2
8844 ,x_msg_count OUT NOCOPY NUMBER
8845 ,x_msg_data OUT NOCOPY VARCHAR2
8846 ) IS
8847
8848 l_Ak_Region_Item_Rec BIS_AK_REGION_PUB.Bis_Region_Item_Rec_Type;
8849 BEGIN
8850 FND_MSG_PUB.INITIALIZE;
8851 x_return_status := FND_API.G_RET_STS_SUCCESS;
8852
8853 SAVEPOINT BscUpdAKItemProps;
8854 BIS_AK_REGION_PUB.Get_Region_Item_Rec (
8855 p_region_code => p_region_code
8856 ,p_region_application_id => p_region_application_id
8857 ,p_Attribute_Code => p_Attribute_Code
8858 ,p_Attribute_Application_Id => p_Attribute_Application_Id
8859 ,x_Region_Item_Rec => l_Ak_Region_Item_Rec
8860 ,x_return_status => x_return_status
8861 ,x_msg_count => x_msg_count
8862 ,x_msg_data => x_msg_data
8863 );
8864 IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
8865 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8866 END IF;
8867
8868 l_Ak_Region_Item_Rec.Measure_Level := p_Attribute2;
8869
8870 BIS_AK_REGION_PUB.Update_Region_Item_Row (
8871 p_region_code => p_region_code
8872 ,p_region_application_id => p_region_application_id
8873 ,p_Region_Item_Rec => l_Ak_Region_Item_Rec
8874 ,x_return_status => x_return_status
8875 ,x_msg_count => x_msg_count
8876 ,x_msg_data => x_msg_data
8877 );
8878 IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
8879 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8880 END IF;
8881
8882 IF (p_commit = FND_API.G_TRUE) THEN
8883 COMMIT;
8884 END IF;
8885
8886 EXCEPTION
8887 WHEN FND_API.G_EXC_ERROR THEN
8888 ROLLBACK TO BscUpdAKItemProps;
8889 FND_MSG_PUB.Count_And_Get
8890 ( p_encoded => FND_API.G_FALSE
8891 , p_count => x_msg_count
8892 , p_data => x_msg_data
8893 );
8894 x_return_status := FND_API.G_RET_STS_ERROR;
8895 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8896 ROLLBACK TO BscUpdAKItemProps;
8897 FND_MSG_PUB.Count_And_Get
8898 ( p_encoded => FND_API.G_FALSE
8899 , p_count => x_msg_count
8900 , p_data => x_msg_data
8901 );
8902 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8903 WHEN NO_DATA_FOUND THEN
8904 ROLLBACK TO BscUpdAKItemProps;
8905 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8906 IF (x_msg_data IS NOT NULL) THEN
8907 x_msg_data := x_msg_data||' -> BSC_MIGRATION.Update_AK_Item_Props';
8908 ELSE
8909 x_msg_data := SQLERRM||' at BSC_MIGRATION.Update_AK_Item_Props ';
8910 END IF;
8911 WHEN OTHERS THEN
8912 ROLLBACK TO BscUpdAKItemProps;
8913 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8914 IF (x_msg_data IS NOT NULL) THEN
8915 x_msg_data := x_msg_data||' -> BSC_MIGRATION.Update_AK_Item_Props ';
8916 ELSE
8917 x_msg_data := SQLERRM||' at BSC_MIGRATION.Update_AK_Item_Props ';
8918 END IF;
8919 END Update_AK_Item_Props;
8920
8921 /************************************************************************************
8922 -- API name : Synchronize_AK_BSC_Metadata
8923 -- Type : Private
8924 -- Function :
8925 -- 1. Synchronizes attribute2, attribute_label_long of measures
8926 -- 2. Synchronizes attribute2, attribute_label_long of dimension objects
8927 -- 3. Synchronizes attribute2, attribute_label_long of periodicities
8928 ************************************************************************************/
8929
8930
8931 PROCEDURE Synchronize_AK_BSC_Metadata (
8932 p_commit IN VARCHAR2 := FND_API.G_FALSE
8933 ,p_Trg_indicator IN BSC_KPIS_B.indicator%TYPE
8934 ,p_Src_indicator IN BSC_KPIS_B.indicator%TYPE
8935 ,p_short_name IN BSC_KPIS_B.short_name%TYPE
8936 ,p_Old_Dim_Levels IN FND_TABLE_OF_NUMBER
8937 ,p_New_Dim_Levels IN FND_TABLE_OF_NUMBER
8938 ,p_Old_Dim_Groups IN FND_TABLE_OF_NUMBER
8939 ,p_New_Dim_Groups IN FND_TABLE_OF_NUMBER
8940 ,p_Old_DataSet_Map IN FND_TABLE_OF_NUMBER
8941 ,p_New_DataSet_Map IN FND_TABLE_OF_NUMBER
8942 ,p_Target_Calendar IN NUMBER
8943 ,p_Old_Periodicities IN FND_TABLE_OF_NUMBER
8944 ,p_New_Periodicities IN FND_TABLE_OF_NUMBER
8945 ,x_return_status OUT NOCOPY VARCHAR2
8946 ,x_msg_count OUT NOCOPY NUMBER
8947 ,x_msg_data OUT NOCOPY VARCHAR2
8948 ) IS
8949 l_Id NUMBER;
8950
8951 l_Calendar_Sht_Name bsc_sys_calendars_b.short_name%TYPE;
8952 l_Dim_Group_Id bsc_sys_dim_groups_vl.dim_group_Id%TYPE;
8953 l_Dim_Lev_Sht_Name bsc_sys_dim_levels_vl.short_name%TYPE;
8954 l_Dim_Short_Name bsc_sys_dim_groups_vl.short_name%TYPE;
8955 l_Old_Default_Node bsc_kpi_properties.property_value%TYPE ;
8956
8957 l_Attribute2 ak_region_items.attribute2%TYPE;
8958 l_Item_Att_App_Id ak_region_items.attribute_application_id%TYPE;
8959 l_Item_Att_Code ak_region_items.attribute_code%TYPE;
8960 l_New_Attribute2 ak_region_items.attribute2%TYPE;
8961 l_Region_Att_Id ak_region_items.region_application_id%TYPE;
8962 l_Attribute_Code_Tbl BISVIEWER.t_char ;
8963 l_Attribute_App_Id_Tbl BISVIEWER.t_num ;
8964 l_Region_Code ak_region_items.region_code%TYPE;
8965 l_Retain_Dim_Att2 BIS_STRING_ARRAY;
8966 l_Actual_Data_Source bis_indicators.actual_data_source%TYPE;
8967 l_sql VARCHAR2(32000);
8968 l_Periodicity_Sht_Name bsc_sys_periodicities.short_name%TYPE;
8969 l_Comparison_Source bis_indicators.comparison_source%TYPE;
8970 l_Enable_Link bis_indicators.enable_link%TYPE;
8971 TYPE c_cur_type IS REF CURSOR;
8972 c_cursor c_cur_type;
8973
8974 CURSOR c_Default_Node IS
8975 SELECT
8976 property_value
8977 FROM
8978 bsc_kpi_properties
8979 WHERE
8980 indicator = p_Trg_indicator AND
8981 property_code = 'S_NODE_ID';
8982
8983 BEGIN
8984 FND_MSG_PUB.INITIALIZE;
8985 x_return_status := FND_API.G_RET_STS_SUCCESS;
8986
8987 SAVEPOINT BscSyncAKBscMetadata;
8988 -- DataSet Sync Up
8989 l_sql := 'SELECT ak_item.region_code,ak_item.region_application_id,ak_item.attribute_code,ak_item.attribute_application_id, i.comparison_source,i.enable_link, ';
8990 l_sql := l_sql || BSC_DESIGNER_PVT.Format_DbLink_String('ak_item.attribute2,i.dataset_id from ak_region_items');
8991 l_sql := l_sql || BSC_DESIGNER_PVT.Format_DbLink_String('ak_item, bis_indicators');
8992 l_sql := l_sql || BSC_DESIGNER_PVT.Format_DbLink_String('i,bsc_kpis_b');
8993 l_sql := l_sql || ' k WHERE ak_item.region_code = k.short_name and ak_item.attribute1 = :1 and i.short_name = ak_item.attribute2';
8994 l_sql := l_sql || ' AND k.indicator = :2';
8995
8996 OPEN c_Default_Node;
8997 FETCH c_Default_Node INTO l_Old_Default_Node;
8998 CLOSE c_Default_Node;
8999
9000 OPEN c_cursor FOR l_sql USING 'MEASURE_NOTARGET',p_Src_indicator;
9001 LOOP
9002 FETCH c_cursor INTO l_Region_Code,l_Region_Att_Id,l_Item_Att_Code,l_Item_Att_App_Id, l_Comparison_Source,l_Enable_Link,l_Attribute2,l_Id;
9003 EXIT WHEN c_cursor%NOTFOUND;
9004 FOR i IN 1..p_Old_DataSet_Map.COUNT LOOP
9005 IF p_Old_DataSet_Map(i) = l_Id THEN
9006
9007 SELECT
9008 short_name,actual_data_source
9009 INTO
9010 l_New_Attribute2,l_Actual_Data_Source
9011 FROM
9012 bis_indicators
9013 WHERE
9014 dataset_id = p_New_DataSet_Map(i);
9015
9016 IF l_Actual_Data_Source IS NULL THEN
9017 UPDATE
9018 bis_indicators
9019 SET
9020 actual_data_source = p_short_name || '.' || l_Item_Att_Code,
9021 function_name = p_short_name,
9022 actual_data_source_type = 'AK',
9023 comparison_source = DECODE(l_Comparison_Source,NULL,NULL,p_short_name || '.' || l_Item_Att_Code || '_B'),
9024 enable_link = l_Enable_Link
9025 WHERE
9026 short_name = l_New_Attribute2;
9027 END IF;
9028
9029 IF l_New_Attribute2 <> l_Attribute2 OR p_New_DataSet_Map(i) <> p_Old_DataSet_Map(i) THEN
9030 Update_AK_Item_Props (
9031 p_commit => FND_API.G_FALSE
9032 ,p_region_code => p_short_name
9033 ,p_region_application_id => l_Region_Att_Id
9034 ,p_Attribute_Code => l_Item_Att_Code
9035 ,p_Attribute_Application_Id => l_Item_Att_App_Id
9036 ,p_Attribute2 => l_New_Attribute2
9037 ,x_return_status => x_return_status
9038 ,x_msg_count => x_msg_count
9039 ,x_msg_data => x_msg_data
9040 );
9041 IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
9042 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9043 END IF;
9044
9045 UPDATE
9046 ak_region_items_tl ak_item
9047 SET
9048 attribute_label_long = (SELECT
9049 d.name
9050 FROM
9051 bsc_sys_datasets_tl d
9052 WHERE
9053 d.dataset_id = p_New_DataSet_Map(i) AND
9054 d.language = ak_item.language)
9055 WHERE
9056 ak_item.region_code = p_short_name AND
9057 ak_item.region_application_id = l_Region_Att_Id AND
9058 ak_item.attribute_code = l_Item_Att_Code AND
9059 ak_item.attribute_application_id = l_Item_Att_App_Id;
9060
9061 UPDATE
9062 bsc_kpi_tree_nodes_b
9063 SET
9064 node_id = p_New_DataSet_Map(i)
9065 WHERE
9066 indicator = p_Trg_indicator AND
9067 node_id = p_Old_DataSet_Map(i);
9068
9069 UPDATE
9070 bsc_kpi_tree_nodes_tl tr
9071 SET
9072 node_id = p_New_DataSet_Map(i),
9073 name = (SELECT
9074 d.name
9075 FROM
9076 bsc_sys_datasets_tl d
9077 WHERE
9078 d.dataset_id = p_New_DataSet_Map(i) AND
9079 (d.language = tr.language OR
9080 d.language = tr.language)),
9081 help = (SELECT
9082 d.help
9083 FROM
9084 bsc_sys_datasets_tl d
9085 WHERE
9086 d.dataset_id = p_New_DataSet_Map(i) AND
9087 (d.language = tr.language OR
9088 d.language = tr.language))
9089 WHERE
9090 indicator = p_Trg_indicator AND
9091 node_id = p_Old_DataSet_Map(i);
9092
9093 UPDATE
9094 bsc_tab_view_labels_b
9095 SET
9096 link_id = p_New_DataSet_Map(i)
9097 WHERE
9098 tab_view_id = p_Trg_indicator AND
9099 tab_id = -999 AND
9100 link_id = p_Old_DataSet_Map(i);
9101
9102 IF l_Old_Default_Node IS NOT NULL AND l_Old_Default_Node = p_Old_DataSet_Map(i) THEN
9103 UPDATE
9104 bsc_kpi_properties
9105 SET
9106 property_value = p_New_DataSet_Map(i)
9107 WHERE
9108 indicator = p_Trg_indicator AND
9109 property_code = 'S_NODE_ID';
9110 END IF;
9111
9112 END IF;
9113 EXIT;
9114 END IF;
9115 END LOOP;
9116 END LOOP;
9117 CLOSE c_cursor;
9118
9119 --Periods Sync Up
9120 l_sql := 'SELECT ak_item.region_code,ak_item.region_application_id,ak_item.attribute_code,ak_item.attribute_application_id,ak_item.attribute2,';
9121 l_sql := l_sql || BSC_DESIGNER_PVT.Format_DbLink_String(' p.periodicity_id FROM ak_region_items');
9122 l_sql := l_sql || BSC_DESIGNER_PVT.Format_DbLink_String(' ak_item,bsc_kpis_b');
9123 l_sql := l_sql || BSC_DESIGNER_PVT.Format_DbLink_String(' k,bsc_sys_periodicities');
9124 l_sql := l_sql || ' p WHERE ak_item.region_code = k.short_name and ak_item.attribute1 = :1 and ak_item.attribute2 LIKE :2';
9125 l_sql := l_sql || ' AND ak_item.attribute2 NOT LIKE :3 AND SUBSTR(ak_item.attribute2,INSTR(ak_item.attribute2,''+'') +1) = p.short_name';
9126 l_sql := l_sql || ' AND k.indicator = :4';
9127
9128 SELECT
9129 short_name
9130 INTO
9131 l_Calendar_Sht_Name
9132 FROM
9133 bsc_sys_calendars_b
9134 WHERE
9135 calendar_id = p_Target_Calendar;
9136
9137 l_Retain_Dim_Att2 := BIS_STRING_ARRAY();
9138 OPEN c_cursor FOR l_sql USING 'DIMENSION LEVEL','%+%','TIME_COMPARISON_TYPE+BUDGET',p_Src_indicator;
9139 LOOP
9140 FETCH c_cursor INTO l_Region_Code,l_Region_Att_Id,l_Item_Att_Code,l_Item_Att_App_Id,l_Attribute2,l_Id;
9141 EXIT WHEN c_cursor%NOTFOUND;
9142 FOR i IN 1..p_Old_Periodicities.COUNT LOOP
9143 IF p_Old_Periodicities(i) = l_Id THEN
9144 SELECT
9145 short_name
9146 INTO
9147 l_Periodicity_Sht_Name
9148 FROM
9149 bsc_sys_periodicities
9150 WHERE
9151 periodicity_id = p_New_Periodicities(i);
9152
9153 l_New_Attribute2 := l_Calendar_Sht_Name || '+' || l_Periodicity_Sht_Name;
9154 Update_AK_Item_Props (
9155 p_commit => FND_API.G_FALSE
9156 ,p_region_code => p_short_name
9157 ,p_region_application_id => l_Region_Att_Id
9158 ,p_Attribute_Code => l_Item_Att_Code
9159 ,p_Attribute_Application_Id => l_Item_Att_App_Id
9160 ,p_Attribute2 => l_New_Attribute2
9161 ,x_return_status => x_return_status
9162 ,x_msg_count => x_msg_count
9163 ,x_msg_data => x_msg_data
9164 );
9165 IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
9166 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9167 END IF;
9168
9169 l_Retain_Dim_Att2.EXTEND(1);
9170 l_Retain_Dim_Att2(l_Retain_Dim_Att2.LAST) := l_Item_Att_Code;
9171
9172 UPDATE
9173 ak_region_items_tl ak_item
9174 SET
9175 attribute_label_long = (SELECT
9176 tl.name
9177 FROM
9178 bsc_sys_periodicities_tl tl,
9179 bsc_sys_periodicities b
9180 WHERE
9181 b.short_name = l_Periodicity_Sht_Name AND
9182 b.periodicity_id = tl.periodicity_id AND
9183 tl.language = ak_item.language)
9184 WHERE
9185 ak_item.region_code = p_short_name AND
9186 ak_item.region_application_id = l_Region_Att_Id AND
9187 ak_item.attribute_code = l_Item_Att_Code AND
9188 ak_item.attribute_application_id = l_Item_Att_App_Id;
9189
9190 EXIT;
9191 END IF;
9192 END LOOP;
9193 END LOOP;
9194 CLOSE c_cursor;
9195
9196 --Dim Object Sync Up
9197 l_sql := 'SELECT ak_item.region_code,ak_item.region_application_id,ak_item.attribute_code,ak_item.attribute_application_id,';
9198 l_sql := l_sql || BSC_DESIGNER_PVT.Format_DbLink_String(' ak_item.attribute2, d.dim_level_id,g.dim_group_id FROM ak_region_items');
9199 l_sql := l_sql || BSC_DESIGNER_PVT.Format_DbLink_String(' ak_item,bsc_kpis_b');
9200 l_sql := l_sql || BSC_DESIGNER_PVT.Format_DbLink_String(' k , bsc_sys_dim_levels_b');
9201 l_sql := l_sql || BSC_DESIGNER_PVT.Format_DbLink_String(' d , bsc_sys_dim_groups_vl');
9202 l_sql := l_sql || ' g WHERE ak_item.region_code = k.short_name AND ak_item.node_query_flag = ''Y'' AND ak_item.attribute2 LIKE ''%+%''';
9203 l_sql := l_sql || ' AND SUBSTR(ak_item.attribute2,INSTR(ak_item.attribute2,''+'') +1) = d.short_name AND';
9204 l_sql := l_sql || ' SUBSTR(ak_item.attribute2,0,INSTR(ak_item.attribute2,''+'') - 1) = g.short_name AND k.indicator = :1 MINUS';
9205 l_sql := l_sql || ' SELECT ak_item.region_code,ak_item.region_application_id,ak_item.attribute_code,ak_item.attribute_application_id,';
9206 l_sql := l_sql || BSC_DESIGNER_PVT.Format_DbLink_String('ak_item.attribute2, d.dim_level_id,g.dim_group_id FROM ak_region_items');
9207 l_sql := l_sql || BSC_DESIGNER_PVT.Format_DbLink_String(' ak_item,bsc_kpis_b');
9208 l_sql := l_sql || BSC_DESIGNER_PVT.Format_DbLink_String(' k , bsc_sys_periodicities');
9209 l_sql := l_sql || BSC_DESIGNER_PVT.Format_DbLink_String(' p,bsc_sys_dim_levels_b');
9210 l_sql := l_sql || BSC_DESIGNER_PVT.Format_DbLink_String(' d,bsc_sys_dim_groups_vl');
9211 l_sql := l_sql || 'g WHERE ak_item.region_code = k.short_name AND ak_item.node_query_flag = ''Y'' AND ak_item.attribute2 LIKE ''%+%''';
9212 l_sql := l_sql || ' AND SUBSTR(ak_item.attribute2,INSTR(ak_item.attribute2,''+'') +1) = p.short_name AND d.short_name = p.short_name';
9213 l_sql := l_sql || ' AND SUBSTR(ak_item.attribute2,0,INSTR(ak_item.attribute2,''+'') - 1) = g.short_name';
9214 l_sql := l_sql || ' AND k.indicator = :2';
9215
9216 OPEN c_cursor FOR l_sql USING p_Src_indicator,p_Src_indicator;
9217 LOOP
9218 FETCH c_cursor INTO l_Region_Code,l_Region_Att_Id,l_Item_Att_Code,l_Item_Att_App_Id,l_Attribute2,l_Id,l_Dim_Group_Id;
9219 EXIT WHEN c_cursor%NOTFOUND;
9220 l_Dim_Short_Name := NULL;
9221 FOR i IN 1..p_Old_Dim_Groups.COUNT LOOP
9222 IF p_Old_Dim_Groups(i) = l_Dim_Group_Id THEN
9223 SELECT
9224 short_name
9225 INTO
9226 l_Dim_Short_Name
9227 FROM
9228 bsc_sys_dim_groups_vl
9229 WHERE
9230 dim_group_id = p_New_Dim_Groups(i);
9231 EXIT;
9232 END IF;
9233 END LOOP;
9234
9235 IF l_Dim_Short_Name IS NOT NULL THEN
9236 l_Dim_Lev_Sht_Name := NULL;
9237 FOR i IN 1..p_Old_Dim_Levels.COUNT LOOP
9238 IF p_Old_Dim_Levels(i) = l_Id THEN
9239 SELECT
9240 short_name
9241 INTO
9242 l_Dim_Lev_Sht_Name
9243 FROM
9244 bsc_sys_dim_levels_vl
9245 WHERE
9246 dim_level_id = p_New_Dim_Levels(i);
9247 EXIT;
9248 END IF;
9249 END LOOP;
9250
9251 IF l_Dim_Lev_Sht_Name IS NOT NULL THEN
9252 l_New_Attribute2 := l_Dim_Short_Name||'+'||l_Dim_Lev_Sht_Name;
9253 Update_AK_Item_Props (
9254 p_commit => FND_API.G_FALSE
9255 ,p_region_code => p_short_name
9256 ,p_region_application_id => l_Region_Att_Id
9257 ,p_Attribute_Code => l_Item_Att_Code
9258 ,p_Attribute_Application_Id => l_Item_Att_App_Id
9259 ,p_Attribute2 => l_New_Attribute2
9260 ,x_return_status => x_return_status
9261 ,x_msg_count => x_msg_count
9262 ,x_msg_data => x_msg_data
9263 );
9264 IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
9265 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9266 END IF;
9267
9268 l_Retain_Dim_Att2.EXTEND(1);
9269 l_Retain_Dim_Att2(l_Retain_Dim_Att2.LAST) := l_Item_Att_Code;
9270
9271 UPDATE
9272 ak_region_items_tl ak_item
9273 SET
9274 attribute_label_long = (SELECT
9275 tl.name
9276 FROM
9277 bsc_sys_dim_levels_tl tl,
9278 bsc_sys_dim_levels_b b
9279 WHERE
9280 b.short_name = l_Dim_Lev_Sht_Name AND
9281 b.dim_level_id = tl.dim_level_id AND
9282 tl.language = ak_item.language)
9283 WHERE
9284 ak_item.region_code = p_short_name AND
9285 ak_item.region_application_id = l_Region_Att_Id AND
9286 ak_item.attribute_code = l_Item_Att_Code AND
9287 ak_item.attribute_application_id = l_Item_Att_App_Id;
9288
9289 END IF;
9290 END IF;
9291
9292 END LOOP;
9293 CLOSE c_cursor;
9294
9295 IF l_Retain_Dim_Att2 IS NOT NULL THEN
9296 SELECT
9297 attribute_code,attribute_application_id
9298 BULK COLLECT INTO
9299 l_Attribute_Code_Tbl,l_Attribute_App_Id_Tbl
9300 FROM
9301 ak_region_items
9302 WHERE
9303 region_code = p_short_name AND
9304 attribute_code in (SELECT
9305 attribute_code
9306 FROM
9307 ak_region_items
9308 WHERE
9309 region_code = p_short_name AND
9310 node_query_flag = 'Y' AND
9311 attribute2 like '%+%' AND
9312 attribute2 not like 'TIME_COMPARISON_TYPE+BUDGET'
9313 MINUS
9314 SELECT
9315 column_value attribute_code
9316 FROM
9317 TABLE(CAST(l_Retain_Dim_Att2 AS BIS_STRING_ARRAY)));
9318 SELECT
9319 region_application_id
9320 INTO
9321 l_Region_Att_Id
9322 FROM
9323 ak_regions
9324 WHERE
9325 region_code = p_short_name;
9326
9327 BIS_PMV_REGION_ITEMS_PVT.DELETE_REGION_ITEMS (
9328 p_commit => p_commit
9329 ,p_region_code => p_short_name
9330 ,p_region_application_id => l_Region_Att_Id
9331 ,p_Attribute_Code_Tbl => l_Attribute_Code_Tbl
9332 ,p_Attribute_Appl_Id_Tbl => l_Attribute_App_Id_Tbl
9333 ,x_return_status => x_return_status
9334 ,x_msg_count => x_msg_count
9335 ,x_msg_data => x_msg_data
9336 );
9337 IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
9338 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9339 END IF;
9340
9341 END IF;
9342
9343 IF (p_commit = FND_API.G_TRUE) THEN
9344 COMMIT;
9345 END IF;
9346
9347 EXCEPTION
9348 WHEN FND_API.G_EXC_ERROR THEN
9349 ROLLBACK TO BscSyncAKBscMetadata;
9350 FND_MSG_PUB.Count_And_Get
9351 ( p_encoded => FND_API.G_FALSE
9352 , p_count => x_msg_count
9353 , p_data => x_msg_data
9354 );
9355 x_return_status := FND_API.G_RET_STS_ERROR;
9356 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9357 ROLLBACK TO BscSyncAKBscMetadata;
9358 FND_MSG_PUB.Count_And_Get
9359 ( p_encoded => FND_API.G_FALSE
9360 , p_count => x_msg_count
9361 , p_data => x_msg_data
9362 );
9363 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9364 WHEN NO_DATA_FOUND THEN
9365 ROLLBACK TO BscSyncAKBscMetadata;
9366 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9367 IF (x_msg_data IS NOT NULL) THEN
9368 x_msg_data := x_msg_data||' -> BSC_MIGRATION.Synchronize_AK_BSC_Metadata ';
9369 ELSE
9370 x_msg_data := SQLERRM||' at BSC_MIGRATION.Synchronize_AK_BSC_Metadata ';
9371 END IF;
9372 WHEN OTHERS THEN
9373 ROLLBACK TO BscSyncAKBscMetadata;
9374 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9375 IF (x_msg_data IS NOT NULL) THEN
9376 x_msg_data := x_msg_data||' -> BSC_MIGRATION.Synchronize_AK_BSC_Metadata ';
9377 ELSE
9378 x_msg_data := SQLERRM||' at BSC_MIGRATION.Synchronize_AK_BSC_Metadata ';
9379 END IF;
9380 END Synchronize_AK_BSC_Metadata;
9381
9382
9383 /************************************************************************************
9384 -- API name : Copy_AK_Attributes_Metadata
9385 -- Type : Private
9386 -- Function :
9387 -- 1. Synchronizes properties in ak_attributes and ak_attributes_tl
9388 ************************************************************************************/
9389
9390
9391 PROCEDURE Copy_AK_Attributes_Metadata (
9392 p_commit IN VARCHAR2 := FND_API.G_FALSE
9393 ,p_short_name IN BSC_KPIS_B.short_name%TYPE
9394 ,x_return_status OUT NOCOPY VARCHAR2
9395 ,x_msg_count OUT NOCOPY NUMBER
9396 ,x_msg_data OUT NOCOPY VARCHAR2
9397 ) IS
9398 l_Attribute_Code ak_region_items.attribute_code%TYPE;
9399 l_Attribute_Application_Id ak_region_items.attribute_application_id%TYPE;
9400 l_Item_Style ak_region_items.item_style%TYPE;
9401 l_Attribute_Category ak_region_items.attribute_category%TYPE;
9402 l_sql VARCHAR2(32000);
9403 l_attribute_rowid varchar2(50);
9404 l_count NUMBER := 0;
9405 TYPE c_cur_type IS REF CURSOR;
9406 c_cursor c_cur_type;
9407
9408 BEGIN
9409 FND_MSG_PUB.INITIALIZE;
9410 x_return_status := FND_API.G_RET_STS_SUCCESS;
9411
9412 SAVEPOINT BscCopyAKAttrMetadata;
9413 -- DataSet Sync Up
9414 l_sql := 'SELECT attribute_code,attribute_application_id,item_style,attribute_category ';
9415 l_sql := l_sql || BSC_DESIGNER_PVT.Format_DbLink_String('from ak_region_items');
9416 l_sql := l_sql || ' WHERE region_code = :1';
9417
9418
9419 OPEN c_cursor FOR l_sql USING p_short_name;
9420 LOOP
9421 FETCH c_cursor INTO l_Attribute_Code,l_Attribute_Application_Id,l_Item_Style,l_Attribute_Category;
9422 EXIT WHEN c_cursor%NOTFOUND;
9423
9424 l_Count := 0;
9425 SELECT COUNT(1)
9426 INTO l_Count
9427 FROM AK_ATTRIBUTES
9428 WHERE attribute_code = l_Attribute_Code AND
9429 attribute_application_id = l_Attribute_Application_Id;
9430 IF l_Count = 0 THEN
9431 AK_ATTRIBUTES_PKG.INSERT_ROW (
9432 X_ROWID => l_attribute_rowid,
9433 X_ATTRIBUTE_APPLICATION_ID => l_Attribute_Application_Id,
9434 X_ATTRIBUTE_CODE => l_Attribute_Code,
9435 X_ATTRIBUTE_LABEL_LENGTH => BIS_AK_REGION_PUB.c_ATTR_LABEL_LENGTH,
9436 X_ATTRIBUTE_VALUE_LENGTH => BIS_AK_REGION_PUB.c_ATTR_VALUE_LENGTH,
9437 X_BOLD => BIS_AK_REGION_PUB.c_BOLD ,
9438 X_ITALIC => BIS_AK_REGION_PUB.c_ITALIC,
9439 X_UPPER_CASE_FLAG => BIS_AK_REGION_PUB.c_UPPER_CASE_FLAG,
9440 X_VERTICAL_ALIGNMENT => BIS_AK_REGION_PUB.c_VERTICAL_ALIGNMENT,
9441 X_HORIZONTAL_ALIGNMENT => BIS_AK_REGION_PUB.c_HORIZONTAL_ALIGNMENT,
9442 X_DEFAULT_VALUE_VARCHAR2 => null,
9443 X_DEFAULT_VALUE_NUMBER => null,
9444 X_DEFAULT_VALUE_DATE => null,
9445 X_LOV_REGION_CODE => null,
9446 X_LOV_REGION_APPLICATION_ID => null,
9447 X_DATA_TYPE => BIS_AK_REGION_PUB.c_ATTR_DATATYPE,
9448 X_DISPLAY_HEIGHT => null,
9449 X_ITEM_STYLE => l_Item_Style,
9450 X_CSS_CLASS_NAME => null,
9451 X_CSS_LABEL_CLASS_NAME => null,
9452 X_PRECISION => null,
9453 X_EXPANSION => null,
9454 X_ALS_MAX_LENGTH => null,
9455 X_POPLIST_VIEWOBJECT => null,
9456 X_POPLIST_DISPLAY_ATTRIBUTE => null,
9457 X_POPLIST_VALUE_ATTRIBUTE => null,
9458 X_ATTRIBUTE_CATEGORY => l_Attribute_Category,
9459 X_ATTRIBUTE1 => null,
9460 X_ATTRIBUTE2 => null,
9461 X_ATTRIBUTE3 => null,
9462 X_ATTRIBUTE4 => null,
9463 X_ATTRIBUTE5 => null,
9464 X_ATTRIBUTE6 => null,
9465 X_ATTRIBUTE7 => null,
9466 X_ATTRIBUTE8 => null,
9467 X_ATTRIBUTE9 => null,
9468 X_ATTRIBUTE10 => null,
9469 X_ATTRIBUTE11 => null,
9470 X_ATTRIBUTE12 => null,
9471 X_ATTRIBUTE13 => null,
9472 X_ATTRIBUTE14 => null,
9473 X_ATTRIBUTE15 => null,
9474 X_NAME => l_Attribute_Code,
9475 X_ATTRIBUTE_LABEL_LONG => null,
9476 X_ATTRIBUTE_LABEL_SHORT => null,
9477 X_DESCRIPTION => null,
9478 X_CREATION_DATE => sysdate,
9479 X_CREATED_BY => fnd_global.user_id,
9480 X_LAST_UPDATE_DATE => sysdate,
9481 X_LAST_UPDATED_BY => fnd_global.user_id,
9482 X_LAST_UPDATE_LOGIN => fnd_global.user_id);
9483 END IF;
9484 END LOOP;
9485 CLOSE c_cursor;
9486
9487
9488 IF (p_commit = FND_API.G_TRUE) THEN
9489 COMMIT;
9490 END IF;
9491
9492 EXCEPTION
9493 WHEN FND_API.G_EXC_ERROR THEN
9494 ROLLBACK TO BscCopyAKAttrMetadata;
9495 FND_MSG_PUB.Count_And_Get
9496 ( p_encoded => FND_API.G_FALSE
9497 , p_count => x_msg_count
9498 , p_data => x_msg_data
9499 );
9500 x_return_status := FND_API.G_RET_STS_ERROR;
9501 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9502 ROLLBACK TO BscCopyAKAttrMetadata;
9503 FND_MSG_PUB.Count_And_Get
9504 ( p_encoded => FND_API.G_FALSE
9505 , p_count => x_msg_count
9506 , p_data => x_msg_data
9507 );
9508 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9509 WHEN NO_DATA_FOUND THEN
9510 ROLLBACK TO BscCopyAKAttrMetadata;
9511 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9512 IF (x_msg_data IS NOT NULL) THEN
9513 x_msg_data := x_msg_data||' -> BSC_MIGRATION.Copy_AK_Attributes_Metadata ';
9514 ELSE
9515 x_msg_data := SQLERRM||' at BSC_MIGRATION.Copy_AK_Attributes_Metadata ';
9516 END IF;
9517 WHEN OTHERS THEN
9518 ROLLBACK TO BscCopyAKAttrMetadata;
9519 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9520 IF (x_msg_data IS NOT NULL) THEN
9521 x_msg_data := x_msg_data||' -> BSC_MIGRATION.Copy_AK_Attributes_Metadata ';
9522 ELSE
9523 x_msg_data := SQLERRM||' at BSC_MIGRATION.Copy_AK_Attributes_Metadata ';
9524 END IF;
9525 END Copy_AK_Attributes_Metadata;
9526
9527 /************************************************************************************
9528 -- API name : Migrate_Sim_Data
9529 -- Type : Public
9530 -- Function :
9531 -- 1. Copies simulation data of BSC tables
9532 -- 2. Copies AK Metadata
9533 -- 3. Copies Form Function data
9534 -- 4. Synchronizes AK Metadata with BSC Metadata
9535 ************************************************************************************/
9536
9537 PROCEDURE Migrate_Sim_Data
9538 (
9539 p_commit IN VARCHAR2 := FND_API.G_FALSE
9540 ,p_Trg_indicator IN BSC_KPIS_B.indicator%TYPE
9541 ,p_Src_indicator IN BSC_KPIS_B.indicator%TYPE
9542 ,p_Region_Code IN VARCHAR2
9543 ,p_Old_Region_Code IN BSC_KPIS_B.short_name%TYPE
9544 ,p_Old_Dim_Levels IN FND_TABLE_OF_NUMBER
9545 ,p_New_Dim_Levels IN FND_TABLE_OF_NUMBER
9546 ,p_Old_Dim_Groups IN FND_TABLE_OF_NUMBER
9547 ,p_New_Dim_Groups IN FND_TABLE_OF_NUMBER
9548 ,p_Old_DataSet_Map IN FND_TABLE_OF_NUMBER
9549 ,p_New_DataSet_Map IN FND_TABLE_OF_NUMBER
9550 ,p_Target_Calendar IN NUMBER
9551 ,p_Old_Periodicities IN FND_TABLE_OF_NUMBER
9552 ,p_New_Periodicities IN FND_TABLE_OF_NUMBER
9553 ,x_return_status OUT NOCOPY VARCHAR2
9554 ,x_msg_count OUT NOCOPY NUMBER
9555 ,x_msg_data OUT NOCOPY VARCHAR2
9556 )IS
9557 l_count NUMBER;
9558 l_Bsc_Kpi_Entity_Rec BSC_KPI_PUB.Bsc_Kpi_Entity_Rec;
9559 l_Table_Number NUMBER;
9560 l_kpi_metadata_tables BSC_DESIGNER_PVT.t_kpi_metadata_tables;
9561 l_sql VARCHAR2(32700);
9562 l_table_name all_tables.table_name%TYPE;
9563 l_arr_columns BSC_UPDATE_UTIL.t_array_of_varchar2;
9564 l_num_columns NUMBER;
9565 l_colum VARCHAR2(100);
9566 l_key_name VARCHAR2(30);
9567 l_error_msg VARCHAR2(4000);
9568 l_column_name all_tab_columns.column_name%TYPE;
9569 l_Tl_Table_Column all_tab_columns.column_name%TYPE;
9570 l_condition VARCHAR2(4000);
9571 l_image_id BSC_SYS_IMAGES_MAP_TL.image_id%TYPE;
9572 l_next_image_id BSC_SYS_IMAGES_MAP_TL.image_id%TYPE;
9573 l_cursor BSC_BIS_LOCKS_PUB.t_cursor;
9574 h_sql VARCHAR2(3200);
9575 l_New_Function_Id fnd_form_functions.function_id%TYPE;
9576 l_Target_Value_char fnd_form_functions.function_name%TYPE;
9577 l_Target_Value fnd_form_functions.function_id%TYPE;
9578 l_Source_Value_char fnd_form_functions.function_name%TYPE;
9579 l_Source_Value fnd_form_functions.function_id%TYPE;
9580 l_Old_Function_Id fnd_form_functions.function_id%TYPE;
9581 CURSOR c_column IS
9582 SELECT column_name
9583 FROM all_tab_columns
9584 WHERE table_name = UPPER(l_table_name)
9585 AND OWNER = UPPER(BSC_APPS.BSC_APPS_SCHEMA);
9586
9587
9588
9589 BEGIN
9590 --new tables for simulatio tree objective are
9591 --BSC_SYS_IMAGES
9592 --BSC_SYS_IMAGES_MAP_TL
9593 --BSC_TAB_VIEW_LABELS_B/TL
9594 --BSC_KPI_TREE_NODES_B/TL
9595
9596 --For existing migration we don't need to handle any thing
9597
9598 --First we will check if the region_code exists on the target system
9599 -- if yes then we cannot migrate and log it
9600 -- if the short_name is not there
9601 FND_MSG_PUB.INITIALIZE;
9602 x_return_status := FND_API.G_RET_STS_SUCCESS;
9603
9604 SAVEPOINT BscMigSimDataPub;
9605 g_db_link := BSC_DESIGNER_PVT.g_DbLink_Name;
9606 SELECT COUNT(0)
9607 INTO l_count
9608 FROM ak_regions
9609 WHERE region_code = p_Old_Region_Code
9610 AND region_application_id =BSC_MIGRATION.C_BSC_APP_ID;
9611
9612 IF g_db_link IS NULL THEN
9613 --here we will call only the tables which are specific to simulation tree
9614 -- and also call the migration of ak region api
9615 l_Bsc_Kpi_Entity_Rec.Bsc_Kpi_Id := p_Trg_indicator;
9616 BSC_KPI_PUB.Delete_Sim_Tree_Data
9617 (
9618 p_commit => FND_API.G_FALSE
9619 , p_Bsc_Kpi_Entity_Rec => l_Bsc_Kpi_Entity_Rec
9620 , x_return_status => x_return_status
9621 , x_msg_count => x_msg_count
9622 , x_msg_data => x_msg_data
9623 );
9624 IF (x_return_status IS NOT NULL AND x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
9625 BSC_APPS.Write_Line_Log('Error Deleting SimTree Data ', BSC_APPS.OUTPUT_FILE);
9626 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9627 END IF;
9628 END IF;
9629
9630 BSC_SIMULATION_VIEW_PVT.Init_Sim_Tables_Array
9631 (
9632 p_copy_Ak_Tables => FND_API.G_TRUE
9633 ,x_Table_Number => l_Table_Number
9634 ,x_kpi_metadata_tables => l_kpi_metadata_tables
9635 );
9636
9637 BSC_APPS.Write_Line_Log('Migrating Sim Data [p_Trg_indicator =' ||p_Trg_indicator||']' , BSC_APPS.OUTPUT_FILE);
9638
9639 FOR h_i IN 1..l_Table_Number LOOP
9640 IF l_kpi_metadata_tables(h_i).table_type <> BSC_SIMULATION_VIEW_PVT.C_AK_TABLE AND
9641 l_kpi_metadata_tables(h_i).table_type <> BSC_SIMULATION_VIEW_PVT.C_FORM_TABLE THEN
9642 l_table_name := l_kpi_metadata_tables(h_i).table_name;
9643 l_column_name:= l_kpi_metadata_tables(h_i).table_column;
9644
9645 l_key_name := 'TAB_VIEW_ID';
9646 IF( l_column_name = BSC_SIMULATION_VIEW_PVT.C_SOURCE_CODE )THEN
9647 l_key_name := 'SOURCE_CODE';
9648 ELSIF (l_column_name = BSC_SIMULATION_VIEW_PVT.C_INDICATOR) THEN
9649 l_key_name := 'INDICATOR';
9650 END IF;
9651
9652
9653 l_num_columns :=0;
9654 OPEN c_column;
9655 FETCH c_column INTO l_colum;
9656 WHILE c_column%FOUND LOOP
9657 l_num_columns := l_num_columns + 1;
9658 l_arr_columns(l_num_columns) := l_colum;
9659 FETCH c_column INTO l_colum;
9660 END LOOP;
9661 CLOSE c_column;
9662
9663 IF l_num_columns > 0 THEN
9664
9665 IF(l_key_name = 'SOURCE_CODE') THEN
9666 l_condition := 'SOURCE_TYPE = 2 AND ' || l_key_name || '=' || p_Src_indicator;
9667 ELSIF(l_key_name = 'INDICATOR') THEN
9668 l_condition := 'INDICATOR =' || p_Src_indicator;
9669 ELSE
9670 l_condition := 'TAB_ID =-999 AND '|| l_column_name ||' = ' || p_Src_indicator;
9671 END IF;
9672
9673
9674 l_sql:= 'INSERT INTO ( SELECT ';
9675 FOR i IN 1..l_num_columns LOOP
9676 IF i <> 1 THEN
9677 l_sql:= l_sql || ',';
9678 END IF;
9679 l_sql:= l_sql || l_arr_columns(i);
9680 END LOOP;
9681 l_sql:= l_sql || ' FROM ' || l_table_name;
9682 l_sql:= l_sql || ' )';
9683 l_sql:= l_sql || ' SELECT ';
9684 FOR i IN 1..l_num_columns LOOP
9685 IF i <> 1 THEN
9686 l_sql:= l_sql || ',';
9687 END IF;
9688
9689 IF(l_table_name='BSC_SYS_IMAGES_MAP_TL' AND UPPER(l_arr_columns(i)) = 'IMAGE_ID') THEN
9690
9691 SELECT bsc_sys_image_id_s.nextval
9692 INTO l_next_image_id
9693 FROM dual;
9694
9695 l_sql:= l_sql || l_next_image_id || ' AS ' || l_arr_columns(i);
9696 ELSIF(l_table_name='BSC_SYS_IMAGES' AND UPPER(l_arr_columns(i)) = 'IMAGE_ID' )THEN
9697
9698 h_sql := ' SELECT DISTINCT image_id '||
9699 ' FROM BSC_SYS_IMAGES_MAP_TL '||'@'||g_db_link ||
9700 ' WHERE SOURCE_TYPE =2 AND SOURCE_CODE = '|| p_Src_indicator;
9701
9702 IF(l_cursor%ISOPEN)THEN
9703 CLOSE l_cursor;
9704 END IF;
9705
9706 OPEN l_cursor FOR h_sql;
9707 FETCH l_cursor INTO l_image_id;
9708 CLOSE l_cursor;
9709
9710 l_condition := l_column_name ||' = ' || l_image_id;
9711
9712 SELECT distinct image_id
9713 INTO l_image_id
9714 FROM BSC_SYS_IMAGES_MAP_TL
9715 WHERE SOURCE_TYPE =2
9716 AND SOURCE_CODE =p_Trg_indicator;
9717
9718 l_sql:= l_sql || l_image_id || ' AS ' || l_arr_columns(i);
9719
9720 ELSIF UPPER(l_arr_columns(i)) = l_key_name THEN
9721 l_sql:= l_sql || p_Trg_indicator || ' AS ' || l_arr_columns(i);
9722 ELSE
9723 l_sql:= l_sql || l_arr_columns(i) || ' AS ' || l_arr_columns(i);
9724 END IF;
9725 END LOOP;
9726 l_sql:= l_sql || ' FROM ' || l_table_name||'@'||g_db_link;
9727 l_sql:= l_sql || ' WHERE ' || l_condition;
9728 BSC_UPDATE_UTIL.Execute_Immediate(l_sql);
9729 END IF;
9730
9731 IF l_kpi_metadata_tables(h_i).mls_table IS NOT NULL AND
9732 l_kpi_metadata_tables(h_i).mls_table = bsc_utility.YES THEN
9733 BSC_DESIGNER_PVT.Process_TL_Table(
9734 p_commit => FND_API.G_FALSE
9735 ,p_DbLink_Name => g_db_link
9736 ,p_Table_Name => l_table_name
9737 ,p_Table_column => l_key_name
9738 ,p_Target_Value => p_Trg_indicator
9739 ,p_Target_Value_Char => NULL
9740 ,x_return_status => x_return_status
9741 ,x_msg_count => x_msg_count
9742 ,x_msg_data => x_msg_data
9743 );
9744 IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
9745 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9746 END IF;
9747 END IF;
9748
9749 END IF;
9750 END LOOP;
9751
9752 SELECT
9753 FND_FORM_FUNCTIONS_S.NEXTVAL
9754 INTO
9755 l_New_Function_Id
9756 FROM dual;
9757
9758 FOR h_i IN 1..l_Table_Number LOOP
9759 IF(l_kpi_metadata_tables(h_i).duplicate_data = bsc_utility.YES AND
9760 l_kpi_metadata_tables(h_i).table_type=BSC_SIMULATION_VIEW_PVT.C_AK_TABLE) THEN
9761 BSC_SIMULATION_VIEW_PVT.Copy_Ak_Record_Table (
9762 p_table_name => l_kpi_metadata_tables(h_i).table_name
9763 ,p_table_type => l_kpi_metadata_tables(h_i).table_type
9764 ,p_table_column => l_kpi_metadata_tables(h_i).table_column
9765 ,p_Src_kpi => p_Src_indicator
9766 ,p_Trg_kpi => p_Trg_indicator
9767 ,p_new_region_code => p_Region_Code
9768 ,p_new_form_function=> NULL
9769 ,p_DbLink_Name => g_db_link
9770 );
9771 IF l_kpi_metadata_tables(h_i).mls_table IS NOT NULL AND
9772 l_kpi_metadata_tables(h_i).mls_table = bsc_utility.YES THEN
9773 BSC_DESIGNER_PVT.Process_TL_Table(
9774 p_commit => FND_API.G_FALSE
9775 ,p_DbLink_Name => g_db_link
9776 ,p_Table_Name => l_kpi_metadata_tables(h_i).table_name
9777 ,p_Table_column => l_kpi_metadata_tables(h_i).table_column
9778 ,p_Target_Value => NULL
9779 ,p_Target_Value_Char => p_Region_Code
9780 ,x_return_status => x_return_status
9781 ,x_msg_count => x_msg_count
9782 ,x_msg_data => x_msg_data
9783 );
9784 IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
9785 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9786 END IF;
9787 END IF;
9788 ELSIF(l_kpi_metadata_tables(h_i).duplicate_data = bsc_utility.YES AND
9789 l_kpi_metadata_tables(h_i).table_type=BSC_SIMULATION_VIEW_PVT.C_FORM_TABLE)THEN
9790 BSC_SIMULATION_VIEW_PVT.Copy_Ak_Record_Table (
9791 p_table_name => l_kpi_metadata_tables(h_i).table_name
9792 ,p_table_type => l_kpi_metadata_tables(h_i).table_type
9793 ,p_table_column => l_kpi_metadata_tables(h_i).table_column
9794 ,p_Src_kpi => p_Src_indicator
9795 ,p_Trg_kpi => p_Trg_indicator
9796 ,p_new_region_code => p_Region_Code
9797 ,p_new_form_function=> l_new_function_id
9798 ,p_DbLink_Name => g_db_link
9799 );
9800 IF l_kpi_metadata_tables(h_i).mls_table IS NOT NULL AND
9801 l_kpi_metadata_tables(h_i).mls_table = bsc_utility.YES THEN
9802 BSC_DESIGNER_PVT.Process_TL_Table(
9803 p_commit => FND_API.G_FALSE
9804 ,p_DbLink_Name => g_db_link
9805 ,p_Table_Name => l_kpi_metadata_tables(h_i).table_name
9806 ,p_Table_column => 'FUNCTION_ID'
9807 ,p_Target_Value => l_new_function_id
9808 ,p_Target_Value_Char => NULL
9809 ,x_return_status => x_return_status
9810 ,x_msg_count => x_msg_count
9811 ,x_msg_data => x_msg_data
9812 );
9813 IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
9814 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9815 END IF;
9816
9817 END IF;
9818 END IF;
9819 END LOOP;
9820
9821 IF p_Region_Code <> p_Old_Region_Code THEN
9822 UPDATE
9823 bsc_kpis_b
9824 SET
9825 short_name = p_Region_Code
9826 WHERE
9827 indicator = p_Trg_indicator;
9828
9829 UPDATE
9830 bsc_kpi_analysis_options_b
9831 SET
9832 short_name = p_Region_Code
9833 WHERE
9834 indicator = p_Trg_indicator;
9835
9836 UPDATE fnd_form_functions_tl tl
9837 SET user_function_name = (SELECT name FROM bsc_kpis_tl k, bsc_kpis_b b
9838 WHERE b.indicator = k.indicator AND
9839 b.short_name = p_Region_Code AND k.language = tl.language)
9840 WHERE
9841 function_id = l_new_function_id;
9842
9843 END IF;
9844
9845 --Now we will migrate the AK stuff here
9846 IF p_Region_Code IS NOT NULL THEN
9847 -- By design there is a form function and ak region called as the short name
9848 BSC_APPS.Write_Line_Log('Migrating report '||p_Old_Region_Code, BSC_APPS.OUTPUT_FILE);
9849 Synchronize_AK_BSC_Metadata (
9850 p_commit => FND_API.G_FALSE
9851 ,p_Src_indicator => p_Src_indicator
9852 ,p_Trg_indicator => p_Trg_indicator
9853 ,p_short_name => p_Region_Code
9854 ,p_Old_Dim_Levels => p_Old_Dim_Levels
9855 ,p_New_Dim_Levels => p_New_Dim_Levels
9856 ,p_Old_Dim_Groups => p_Old_Dim_Groups
9857 ,p_New_Dim_Groups => p_New_Dim_Groups
9858 ,p_Old_DataSet_Map => p_Old_DataSet_Map
9859 ,p_New_DataSet_Map => p_New_DataSet_Map
9860 ,p_Target_Calendar => p_Target_Calendar
9861 ,p_Old_Periodicities => p_Old_Periodicities
9862 ,p_New_Periodicities => p_New_Periodicities
9863 ,x_return_status => x_return_status
9864 ,x_msg_count => x_msg_count
9865 ,x_msg_data => x_msg_data
9866 );
9867 IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
9868 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9869 END IF;
9870
9871 UPDATE
9872 ak_regions
9873 SET
9874 attribute12 = p_Region_Code
9875 WHERE
9876 region_code = p_Region_Code;
9877 Copy_AK_Attributes_Metadata (
9878 p_commit => FND_API.G_FALSE
9879 ,p_short_name => p_Old_Region_Code
9880 ,x_return_status => x_return_status
9881 ,x_msg_count => x_msg_count
9882 ,x_msg_data => x_msg_data
9883 );
9884 END IF;
9885
9886 IF (p_commit = FND_API.G_TRUE) THEN
9887 COMMIT;
9888 END IF;
9889
9890 EXCEPTION
9891 WHEN FND_API.G_EXC_ERROR THEN
9892 ROLLBACK TO BscMigSimDataPub;
9893 FND_MSG_PUB.Count_And_Get
9894 ( p_encoded => FND_API.G_FALSE
9895 , p_count => x_msg_count
9896 , p_data => x_msg_data
9897 );
9898 x_return_status := FND_API.G_RET_STS_ERROR;
9899 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9900 ROLLBACK TO BscMigSimDataPub;
9901 FND_MSG_PUB.Count_And_Get
9902 ( p_encoded => FND_API.G_FALSE
9903 , p_count => x_msg_count
9904 , p_data => x_msg_data
9905 );
9906 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9907 WHEN NO_DATA_FOUND THEN
9908 ROLLBACK TO BscMigSimDataPub;
9909 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9910 IF (x_msg_data IS NOT NULL) THEN
9911 x_msg_data := x_msg_data||' -> BSC_MIGRATION.Migrate_Sim_Data ';
9912 ELSE
9913 x_msg_data := SQLERRM||' at BSC_MIGRATION.Migrate_Sim_Data ';
9914 END IF;
9915 WHEN OTHERS THEN
9916 ROLLBACK TO BscMigSimDataPub;
9917 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9918 IF (x_msg_data IS NOT NULL) THEN
9919 x_msg_data := x_msg_data||' -> BSC_MIGRATION.Migrate_Sim_Data ';
9920 ELSE
9921 x_msg_data := SQLERRM||' at BSC_MIGRATION.Migrate_Sim_Data ';
9922 END IF;
9923 END Migrate_Sim_Data;
9924
9925
9926
9927 END BSC_MIGRATION;