DBA Data[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;