DBA Data[Home] [Help]

PACKAGE BODY: APPS.BIS_PMF_MIGRATION_PVT

Source


1 PACKAGE BODY BIS_PMF_MIGRATION_PVT AS
2 /* $Header: BISVMIGB.pls 120.2 2005/12/15 03:23:41 ankgoel noship $ */
3 --
4 /*
5 REM +=======================================================================+
6 REM |    Copyright (c) 1998 Oracle Corporation, Redwood Shores, CA, USA     |
7 REM |                         All rights reserved.                          |
8 REM +=======================================================================+
9 REM | FILENAME                                                              |
10 REM |     BISPMIGS.pls                                                      |
11 REM |                                                                       |
12 REM | DESCRIPTION                                                           |
13 REM |     Package Body for Migration of PMF data .
14 REM |     Please refer to the datamodel for the changes.
15 REM |                                                                       |
16 REM | NOTES                                                                 |
17 REM |                                                                       |
18 REM | HISTORY                                                               |
19 REM | 21-July-2000 amkulkar Creation                                        |
20 REM |  19-apr-01 rmohanty added fix for 1743506
21 REM | 21-Jun-2001 meastmon fix migration for bis_user_ind_selections        |
22 REM | 11-FEB-2003 rchandra added a check to see if the target level going   |
23 REM |                       to be migrated already exists in which case it  |
24 REM |                       will not be migrated , in NEEDS_MIGRATION api   |
25 REM |                       for bug 2790164                                 |
26 REM |                       Also the migration script will only process rows|
27 REM |                       from old data model. Cursor definition          |
28 REM |                       c_targetlvls in MIGRATE_PERFORMANCE_MEASURES API|
29 REM |                       accordingly changed                             |
30 REM | 03-JUN-2004 ankgoel  Modified for bug#3583357. Added procedures for   |
31 REM |                      re-sequencing dimensions in                      |
32 REM |                      bis_indicator_dimensions using the dim level     |
33 REM |                      order in bis_target_levels.                      |
34 REM | 21-MAR-2005 ankagarw bug#4235732 - changing count(*) to count(1)      |
35 REM | 19-OCT-2005 ppandey  Enh 4618419- SQL Literal Fix                     |
36 REM | 15-DEC-2005 ankgoel  Bug 4879417- Execute dynamic SQL with a NULL check                   |
37 REM +=======================================================================+
38 */
39 --
40 --
41 FUNCTION GET_DIMENSION_ID
42 (p_dimension_level_id     IN    NUMBER
43 )
44 RETURN NUMBER
45 IS
46    CURSOR c_dim IS
47    SELECT dimension_id
48    FROM   bis_levels
49    WHERE  level_id = p_dimension_level_id;
50    l_dim_id		NUMBER;
51 BEGIN
52    OPEN c_dim;
53    FETCH c_dim INTO l_dim_id;
54    CLOSE c_dim;
55    RETURN l_dim_id;
56 EXCEPTION
57   WHEN OTHERS THEN
58        null;
59 END GET_DIMENSION_ID;
60 --
61 
62 FUNCTION need_resequence (
63  p_indicator_id  IN  NUMBER
64 ,p_dim_level_id  IN  NUMBER
65 ,p_sequence_no   IN  NUMBER
66 )
67 RETURN BOOLEAN
68 IS
69   CURSOR c_dim_dim_levels(p_dim_level_id NUMBER, p_indicator_id NUMBER) IS
70   SELECT sequence_no
71   FROM bis_indicator_dimensions BIS_IND,
72        bis_levels BIS_LVL
73   WHERE BIS_IND.dimension_id = BIS_LVL.dimension_id
74   AND	BIS_IND.indicator_id = p_indicator_id
75   AND	BIS_LVL.level_id = p_dim_level_id;
76 
77   l_reseq_flag          BOOLEAN := FALSE;
78   l_dim_level_sequence  NUMBER;
79   l_ind_dim_sequence    NUMBER;
80 BEGIN
81   IF c_dim_dim_levels%ISOPEN THEN
82     CLOSE c_dim_dim_levels;
83   END IF;
84   l_dim_level_sequence := p_sequence_no;
85   OPEN c_dim_dim_levels(p_dim_level_id, p_indicator_id);
86   FETCH c_dim_dim_levels INTO l_ind_dim_sequence;
87   IF ((c_dim_dim_levels%FOUND) AND (l_dim_level_sequence <> l_ind_dim_sequence)) THEN
88     l_reseq_flag := TRUE;
89   END IF;
90   CLOSE c_dim_dim_levels;
91 
92   RETURN l_reseq_flag;
93 
94 EXCEPTION
95 WHEN OTHERS THEN
96   IF c_dim_dim_levels%ISOPEN THEN
97     CLOSE c_dim_dim_levels;
98   END IF;
99   RETURN TRUE;
100 END need_resequence;
101 --
102 
103 PROCEDURE update_bis_indicators (
104  p_indicator_id  IN  NUMBER
105 ,p_dim_level_id  IN  NUMBER
106 ,p_sequence_no   IN  NUMBER
107 )
108 IS
109 BEGIN
110   IF(p_dim_level_id IS NOT NULL) THEN
111     UPDATE bis_indicator_dimensions
112     SET sequence_no = p_sequence_no
113        ,last_update_date = SYSDATE
114     WHERE indicator_id = p_indicator_id
115     AND	dimension_id = get_dimension_id(p_dim_level_id);
116   END IF;
117 EXCEPTION
118   WHEN OTHERS THEN
119     ROLLBACK;
120 END update_bis_indicators;
121 
122 PROCEDURE resequence_ind_dimensions (
123   p_indicator_id  IN  NUMBER
124 )
125 IS
126   /* It is assumed that all target levels for a measure are consistent with each other.
127      Only the first set of target level data is taken up.
128   */
129   CURSOR c_target_level(p_ind_id NUMBER) IS
130   SELECT dimension1_level_id, dimension2_level_id,
131          dimension3_level_id, dimension4_level_id,
132          dimension5_level_id, dimension6_level_id,
133          dimension7_level_id
134   FROM bis_target_levels
135   WHERE indicator_id = p_ind_id
136   AND org_level_id IS NOT NULL
137   AND time_level_id IS NOT NULL
138   AND rownum < 2;
139 
140   l_flag_resequence     BOOLEAN := FALSE;
141   l_target_level_rec    BIS_PMF_MIGRATION_PVT.target_level_rec;
142   c_tl_rec              c_target_level%ROWTYPE;
143 
144 BEGIN
145 
146   IF c_target_level%ISOPEN THEN
147     CLOSE c_target_level;
148   END IF;
149 
150   OPEN c_target_level(p_indicator_id);
151   FETCH c_target_level INTO c_tl_rec;
152   IF c_target_level%FOUND THEN
153 
154     IF (c_tl_rec.dimension1_level_id IS NOT NULL) THEN
155       l_flag_resequence := need_resequence(p_indicator_id, c_tl_rec.dimension1_level_id, 1);
156     END IF;
157     IF ((c_tl_rec.dimension2_level_id IS NOT NULL) AND (l_flag_resequence = FALSE)) THEN
158 	  l_flag_resequence := need_resequence(p_indicator_id, c_tl_rec.dimension2_level_id, 2);
159     END IF;
160     IF ((c_tl_rec.dimension3_level_id IS NOT NULL) AND (l_flag_resequence = FALSE)) THEN
161 	  l_flag_resequence := need_resequence(p_indicator_id, c_tl_rec.dimension3_level_id, 3);
162     END IF;
163     IF ((c_tl_rec.dimension4_level_id IS NOT NULL) AND (l_flag_resequence = FALSE)) THEN
164 	  l_flag_resequence := need_resequence(p_indicator_id, c_tl_rec.dimension4_level_id, 4);
165     END IF;
166     IF ((c_tl_rec.dimension5_level_id IS NOT NULL) AND (l_flag_resequence = FALSE)) THEN
167 	  l_flag_resequence := need_resequence(p_indicator_id, c_tl_rec.dimension5_level_id, 5);
168     END IF;
169     IF ((c_tl_rec.dimension6_level_id IS NOT NULL) AND (l_flag_resequence = FALSE)) THEN
170 	  l_flag_resequence := need_resequence(p_indicator_id, c_tl_rec.dimension6_level_id, 6);
171     END IF;
172     IF ((c_tl_rec.dimension7_level_id IS NOT NULL) AND (l_flag_resequence = FALSE)) THEN
173 	  l_flag_resequence := need_resequence(p_indicator_id, c_tl_rec.dimension7_level_id, 7);
174     END IF;
175 
176     IF (l_flag_resequence = TRUE) THEN
177 
178       update_bis_indicators(p_indicator_id, c_tl_rec.dimension1_level_id, 1);
179       update_bis_indicators(p_indicator_id, c_tl_rec.dimension2_level_id, 2);
180       update_bis_indicators(p_indicator_id, c_tl_rec.dimension3_level_id, 3);
181       update_bis_indicators(p_indicator_id, c_tl_rec.dimension4_level_id, 4);
182       update_bis_indicators(p_indicator_id, c_tl_rec.dimension5_level_id, 5);
183       update_bis_indicators(p_indicator_id, c_tl_rec.dimension6_level_id, 6);
184       update_bis_indicators(p_indicator_id, c_tl_rec.dimension7_level_id, 7);
185 
186     END IF;
187   END IF;
188   CLOSE c_target_level;
189 
190 EXCEPTION
191 WHEN OTHERS THEN
192   IF c_target_level%ISOPEN THEN
193     CLOSE c_target_level;
194   END IF;
195   ROLLBACK;
196 END resequence_ind_dimensions;
197 --
198 
199 
200 PROCEDURE migrate_indicator_dimensions(
201  x_return_status  OUT NOCOPY   VARCHAR2
202 ,x_return_code    OUT NOCOPY   NUMBER
203 )
204 IS
205   /* Cursor picks up only the indicator_id which have ORG and TIME level id as NOT NULL.
206      This is assumed for old measures.
207   */
208     CURSOR c_ind_id IS
209     SELECT indicator_id
210     FROM bis_target_levels
211     WHERE org_level_id IS NOT NULL
212     AND time_level_id IS NOT NULL
213     GROUP BY indicator_id;
214 
215 BEGIN
216   FOR c_ind_rec IN c_ind_id LOOP
217     resequence_ind_dimensions(c_ind_rec.indicator_id);
218   END LOOP;
219 
220   x_return_Status := 'Success';
221   x_return_code   := 0;
222 EXCEPTION
223   WHEN OTHERS THEN
224     ROLLBACK;
225     x_return_Status := SQLERRM;
226     x_return_code   := SQLCODE;
227 END migrate_indicator_dimensions;
228 --
229 
230 PROCEDURE RESEQUENCE_DIMENSION_LEVELS(
231  p_target_level_rec       IN    BIS_PMF_MIGRATION_PVT.target_level_rec
232 ,x_resequenced_dimensions OUT NOCOPY   BIS_PMF_MIGRATION_PVT.resequenced_dimensions_array
233 ,x_dim_count		  OUT NOCOPY	NUMBER
234 ,x_return_status          OUT NOCOPY   NUMBER
235 )
236 IS
237   CURSOR c_dimcount(p_measure_id IN NUMBER) IS
238   SELECT count(1) FROM
239   bis_indicator_dimensions
240   WHERE indicator_id = p_measure_id;
241   l_reseuenced_dimensions_array         BIS_PMF_MIGRATION_PVT.resequenced_dimensions_array;
242   l_dimcount				NUMBER;
243 BEGIN
244   OPEN c_dimcount(p_target_level_rec.measure_id);
245   FETCH c_dimcount INTO l_dimcount;
246   IF (c_dimcount%NOTFOUND) THEN
247      x_return_status := -1;
248   END IF;
249   CLOSE c_dimcount;
250   x_dim_count := l_dimcount;
251   -- Since the org/time are always the first two subtract two from the count
252   --If somebody for some reason runs the migration script again , do not subtract two
253   IF (p_target_level_rec.org_levelid IS NOT NULL and p_target_level_rec.time_levelid IS NOT NULL) THEN
254      l_dimcount := l_dimcount-2;
255   END IF;
256   IF (l_dimcount > 0) THEN
257   FOR l_count IN 1..l_dimcount LOOP
258       x_resequenced_dimensions(l_count).dim_level_col := 'dimension'||l_count||'_level_id';
259       IF (l_count = 1) THEN
260          x_resequenced_dimensions(1).dim_level_col_val := p_target_level_rec.dimension1_levelid;
261          x_resequenced_dimensions(1).dim_id            := bis_pmf_migration_pvt.get_dimension_id (
262 							  p_target_level_rec.dimension1_levelid);
263          x_Resequenced_dimensions(1).seq_no            := l_count;
264       END IF;
265       IF (l_count=2) THEN
266          x_resequenced_dimensions(2).dim_level_col_val := p_target_level_rec.dimension2_levelid;
267          x_resequenced_dimensions(2).dim_id            := bis_pmf_migration_pvt.get_dimension_id (
268 							  p_target_level_rec.dimension2_levelid);
269          x_Resequenced_dimensions(2).seq_no            := l_count;
270       END IF;
271       IF (l_count=3) THEN
272          x_resequenced_dimensions(3).dim_level_col_val := p_target_level_rec.dimension3_levelid;
273          x_resequenced_dimensions(3).dim_id            := bis_pmf_migration_pvt.get_dimension_id (
274 							  p_target_level_rec.dimension3_levelid);
275          x_Resequenced_dimensions(3).seq_no            := l_count;
276       END IF;
277       IF (l_count=4) THEN
278          x_resequenced_dimensions(4).dim_level_col_val := p_target_level_rec.dimension4_levelid;
279          x_resequenced_dimensions(4).dim_id            := bis_pmf_migration_pvt.get_dimension_id (
280 							  p_target_level_rec.dimension4_levelid);
281          x_Resequenced_dimensions(4).seq_no            := l_count;
282       END IF;
283       IF (l_count=5) THEN
284          x_resequenced_dimensions(5).dim_level_col_val := p_target_level_rec.dimension5_levelid;
285          x_resequenced_dimensions(5).dim_id            := bis_pmf_migration_pvt.get_dimension_id (
286 							  p_target_level_rec.dimension5_levelid);
287          x_Resequenced_dimensions(5).seq_no            := l_count;
288       END IF;
289   END LOOP;
290   END IF;
291   l_dimcount := l_dimcount + 1;
292   IF (l_dimcount <= 7) THEN
293      x_resequenced_dimensions(l_dimcount).dim_level_col := 'dimension'||l_dimcount||'_level_id';
294      x_resequenced_dimensions(l_dimcount).dim_level_col_val := p_target_level_rec.org_levelid;
295      x_resequenced_dimensions(l_dimcount).dim_id            := bis_pmf_migration_pvt.get_dimension_id (
296 							       p_target_level_rec.org_levelid);
297      x_Resequenced_dimensions(l_dimcount).seq_no            := l_dimcount;
298      l_dimcount := l_dimcount + 1;
299      x_resequenced_dimensions(l_dimcount).dim_level_col     := 'dimension'||l_dimcount||'_level_id';
300      x_resequenced_dimensions(l_dimcount).dim_level_col_val := p_target_level_rec.time_levelid;
301      x_resequenced_dimensions(l_dimcount).dim_id            := bis_pmf_migration_pvt.get_dimension_id (
302 							       p_target_level_rec.time_levelid);
303      x_Resequenced_dimensions(l_dimcount).seq_no            := l_dimcount;
304      l_dimcount := l_dimcount +1;
305      FOR l_count IN l_dimcount..7 LOOP
306      x_resequenced_dimensions(l_dimcount).dim_level_col     := 'dimension'||l_dimcount||'_level_id';
307      x_resequenced_dimensions(l_dimcount).dim_level_col_val := NULL;
308      l_dimcount := l_dimcount+1;
309      END LOOP;
310   END IF;
311   x_return_status := 0;
312 EXCEPTION
313   WHEN OTHERS THEN
314        x_return_status := -1;
315 END RESEQUENCE_DIMENSION_LEVELS;
316 --
317 PROCEDURE RESEQUENCE_DIM_LEVEL_VALUES(
318  p_dimvalues_rec          IN    BIS_PMF_MIGRATION_PVT.dim_values_rec
319 ,p_dim_count              IN    NUMBER
320 ,x_reseq_dim_values       OUT NOCOPY   BIS_PMF_MIGRATION_PVT.reseq_dim_values_arr
321 ,x_return_Status	  OUT NOCOPY   NUMBER
322 )
323 IS
324   l_dim_levelcount 	  NUMBER ;
325 BEGIN
326   l_dim_levelcount := p_dim_count;
327   IF(p_dimvalues_rec.org_level_value IS NOT NULL AND p_dimvalues_rec.time_level_value IS NOT NULL) THEN
328     l_dim_levelcount := l_dim_levelcount - 2;
329   END IF;
330   IF (l_dim_levelcount > 0) THEN
331   FOR l_count IN 1..l_dim_levelcount LOOP
332       x_reseq_dim_values(l_count).dim_level_name := 'dimension'||l_count||'_level_value';
333       IF (l_count = 1) THEN
334 	 IF (p_dimvalues_rec.dimension1_level_value IS NOT NULL) THEN
335             x_reseq_dim_values(1).dim_level_value :=
336 				''''||p_dimvalues_rec.dimension1_level_value||'''';
337 	 ELSE
338 	    x_reseq_dim_values(1).dim_level_value := p_dimvalues_rec.dimension1_level_Value;
339 	 END IF;
340       END IF;
341       IF (l_count = 2) THEN
342 	 IF (p_dimvalues_rec.dimension2_level_value IS NOT NULL) THEN
343             x_reseq_dim_values(2).dim_level_value :=
344 				''''||p_dimvalues_rec.dimension2_level_value||'''';
345 	 ELSE
346 	    x_reseq_dim_values(2).dim_level_value:= p_dimvalues_rec.dimension2_level_Value;
347 	 END IF;
348       END IF;
349       IF (l_count = 3) THEN
353 	 ELSE
350 	 IF (p_dimvalues_rec.dimension3_level_value IS NOT NULL) THEN
351             x_reseq_dim_values(3).dim_level_value:=
352 				''''||p_dimvalues_rec.dimension3_level_value||'''';
354 	    x_reseq_dim_values(3).dim_level_value := p_dimvalues_rec.dimension3_level_Value;
355 	 END IF;
356       END IF;
357       IF (l_count = 4) THEN
358 	 IF (p_dimvalues_rec.dimension4_level_value IS NOT NULL) THEN
359             x_reseq_dim_values(4).dim_level_value :=
360 				''''||p_dimvalues_rec.dimension4_level_value||'''';
361 	 ELSE
362 	    x_reseq_dim_values(4).dim_level_value := p_dimvalues_rec.dimension4_level_Value;
363 	 END IF;
364       END IF;
365       IF (l_count = 5) THEN
366 	 IF (p_dimvalues_rec.dimension5_level_value IS NOT NULL) THEN
367             x_reseq_dim_values(5).dim_level_value :=
368 				''''||p_dimvalues_rec.dimension5_level_value||'''';
369 	 ELSE
370 	    x_reseq_dim_values(5).dim_level_value := p_dimvalues_rec.dimension5_level_Value;
371 	 END IF;
372       END IF;
373   END LOOP;
374   END IF;
375   l_dim_levelcount := l_dim_levelcount + 1;
376   IF (l_dim_levelcount <= 7) THEN
377      x_reseq_dim_values(l_dim_levelcount).dim_level_name :=
378                           'dimension'||l_dim_levelcount||'_level_value';
379      IF (p_dimvalues_rec.org_level_value IS NOT NULL) THEN
380      x_reseq_dim_values(l_dim_levelcount).dim_level_value :=
381 		''''||p_dimvalues_rec.org_level_value||'''';
382      ELSE
383      x_reseq_dim_values(l_dim_levelcount).dim_level_value := p_dimvalues_rec.org_level_value;
384      END IF;
385      l_dim_levelcount := l_dim_levelcount + 1;
386      x_reseq_dim_values(l_dim_levelcount).dim_level_name :=
387 			 'dimension'||l_dim_levelcount||'_level_value';
388      IF (p_dimvalues_rec.time_level_value IS NOT NULL) THEN
389      x_reseq_dim_values(l_dim_levelcount).dim_level_value :=
390 		''''||p_dimvalues_rec.time_level_value||'''';
391      ELSE
392      x_reseq_dim_values(l_dim_levelcount).dim_level_value := p_dimvalues_rec.time_level_value;
393      END IF;
394      l_dim_levelcount := l_dim_levelcount +1;
395      FOR l_count IN l_dim_levelcount..7 LOOP
396      x_reseq_dim_values(l_dim_levelcount).dim_level_name :=
397 			 'dimension'||l_dim_levelcount||'_level_value';
398      x_reseq_dim_values(l_Dim_levelcount).dim_level_value := NULL;
399      l_dim_levelcount := l_dim_levelcount+1;
400      END LOOP;
401   END IF;
402   x_return_status := 0;
403 EXCEPTION
404   WHEN OTHERS THEN
405        x_return_status := -1;
406 END;
407 --
408 PROCEDURE RESEQUENCE_IND_LEVEL_VALUES(
409  p_dimvalues_rec          IN BIS_PMF_MIGRATION_PVT.dim_values_Rec
410 ,p_dim_count              IN NUMBER
411 ,x_reseq_dim_values       OUT NOCOPY BIS_PMF_MIGRATION_PVT.reseq_dim_values_arr
412 ,x_return_status          OUT NOCOPY NUMBER
413 )
414 IS
415   l_dim_levelcount 	  NUMBER ;
416 BEGIN
417   l_dim_levelcount := p_dim_count;
418   IF(p_dimvalues_rec.org_level_value IS NOT NULL ) THEN
419     l_dim_levelcount := l_dim_levelcount - 1;
420   END IF;
421   IF (l_dim_levelcount > 0) THEN
422   FOR l_count IN 1..l_dim_levelcount LOOP
423       x_reseq_dim_values(l_count).dim_level_name := 'dimension'||l_count||'_level_value';
424       IF (l_count = 1) THEN
425 	 IF (p_dimvalues_rec.dimension1_level_value IS NOT NULL) THEN
426             x_reseq_dim_values(1).dim_level_value :=
427 				''''||p_dimvalues_rec.dimension1_level_value||'''';
428 	 ELSE
429 	    x_reseq_dim_values(1).dim_level_value := p_dimvalues_rec.dimension1_level_Value;
430 	 END IF;
431       END IF;
432       IF (l_count = 2) THEN
433 	 IF (p_dimvalues_rec.dimension2_level_value IS NOT NULL) THEN
434             x_reseq_dim_values(2).dim_level_value :=
435 				''''||p_dimvalues_rec.dimension2_level_value||'''';
436 	 ELSE
437 	    x_reseq_dim_values(2).dim_level_value:= p_dimvalues_rec.dimension2_level_Value;
438 	 END IF;
439       END IF;
440       IF (l_count = 3) THEN
441 	 IF (p_dimvalues_rec.dimension3_level_value IS NOT NULL) THEN
442             x_reseq_dim_values(3).dim_level_value:=
443 				''''||p_dimvalues_rec.dimension3_level_value||'''';
444 	 ELSE
445 	    x_reseq_dim_values(3).dim_level_value := p_dimvalues_rec.dimension3_level_Value;
446 	 END IF;
447       END IF;
448       IF (l_count = 4) THEN
449 	 IF (p_dimvalues_rec.dimension4_level_value IS NOT NULL) THEN
450             x_reseq_dim_values(4).dim_level_value :=
451 				''''||p_dimvalues_rec.dimension4_level_value||'''';
452 	 ELSE
453 	    x_reseq_dim_values(4).dim_level_value := p_dimvalues_rec.dimension4_level_Value;
454 	 END IF;
455       END IF;
456       IF (l_count = 5) THEN
457 	 IF (p_dimvalues_rec.dimension5_level_value IS NOT NULL) THEN
458             x_reseq_dim_values(5).dim_level_value :=
459 				''''||p_dimvalues_rec.dimension5_level_value||'''';
460 	 ELSE
461 	    x_reseq_dim_values(5).dim_level_value := p_dimvalues_rec.dimension5_level_Value;
462 	 END IF;
463       END IF;
464   END LOOP;
465   END IF;
466   l_dim_levelcount := l_dim_levelcount + 1;
467   IF (l_dim_levelcount <= 6) THEN
468      x_reseq_dim_values(l_dim_levelcount).dim_level_name :=
469                           'dimension'||l_dim_levelcount||'_level_value';
470      IF (p_dimvalues_rec.org_level_value IS NOT NULL) THEN
471      x_reseq_dim_values(l_dim_levelcount).dim_level_value :=
472 		''''||p_dimvalues_rec.org_level_value||'''';
473      ELSE
474      x_reseq_dim_values(l_dim_levelcount).dim_level_value := p_dimvalues_rec.org_level_value;
475      END IF;
476      l_dim_levelcount := l_dim_levelcount + 1;
480      x_reseq_dim_values(l_Dim_levelcount).dim_level_value := NULL;
477      FOR l_count IN l_dim_levelcount..7 LOOP
478      x_reseq_dim_values(l_dim_levelcount).dim_level_name :=
479 			 'dimension'||l_dim_levelcount||'_level_value';
481      l_dim_levelcount := l_dim_levelcount+1;
482      END LOOP;
483   END IF;
484   x_return_status := 0;
485 EXCEPTION
486   WHEN OTHERS THEN
487        x_return_status := -1;
488 END;
489 
490 
491 PROCEDURE MIGRATE_PERFORMANCE_MEASURES
492 (
493  x_return_status      OUT NOCOPY   VARCHAR2
494 ,x_return_code       OUT NOCOPY   NUMBER
495 )
496 IS
497   CURSOR c_targetlvls  IS
498   SELECT target_level_id, indicator_id, short_name
499         ,time_level_id, org_level_id, dimension1_level_id
500         ,dimension2_level_id, dimension3_level_id, dimension4_level_id
501         ,dimension5_level_id, dimension6_level_id, dimension7_level_id
502   FROM bis_target_levels
503   WHERE (NVL(dimension1_level_id,-9999) <> time_level_id AND NVL(dimension1_level_id,-9999)  <> org_level_id)
504     AND (NVL(dimension2_level_id,-9999) <> time_level_id AND NVL(dimension2_level_id,-9999)  <> org_level_id)
505     AND (NVL(dimension3_level_id,-9999) <> time_level_id AND NVL(dimension3_level_id,-9999)  <> org_level_id)
506     AND (NVL(dimension4_level_id,-9999) <> time_level_id AND NVL(dimension4_level_id,-9999)  <> org_level_id)
507     AND (NVL(dimension5_level_id,-9999) <> time_level_id AND NVL(dimension5_level_id,-9999)  <> org_level_id)
508     AND (NVL(dimension6_level_id,-9999) <> time_level_id AND NVL(dimension6_level_id,-9999)  <> org_level_id)
509     AND (NVL(dimension7_level_id,-9999) <> time_level_id AND NVL(dimension7_level_id,-9999)  <> org_level_id)
510   ;  -- only get those rows from the old datamodel
511   CURSOR c_targetlvl_values(p_target_level_id IN NUMBER) IS
512   SELECT target_id, org_level_value, time_level_value
513         ,dimension1_level_value, dimension2_level_value, dimension3_level_value
514 	,dimension4_level_value, dimension5_level_value
515   FROM bis_target_values
516   WHERE target_level_id = p_target_level_id;
517   CURSOR c_actual_values(p_target_level_id IN NUMBER) IS
518   SELECT actual_id, target_level_id, org_level_value, time_level_value,
519          dimension1_level_value, dimension2_level_value
520         ,dimension3_level_value, dimension4_level_value
521         ,dimension5_level_value
522   FROM bis_Actual_values
523   WHERE target_level_id = p_target_level_id;
524   CURSOR c_usrind_values(p_target_level_id IN NUMBER) IS
525   SELECT ind_selection_id, target_level_id, org_level_value
526         ,dimension1_level_value, dimension2_level_value
527         ,dimension3_level_value, dimension4_level_value
528         ,dimension5_level_value
529   FROM bis_user_ind_selections
530   WHERE target_level_id = p_target_level_id;
531   l_target_level_rec		BIS_PMF_MIGRATION_PVT.target_level_rec;
532   l_reseq_dims                  BIS_PMF_MIGRATION_PVT.resequenced_dimensions_Array;
533   l_target_rec			BIS_PMF_MIGRATION_PVT.dim_Values_rec;
534   l_reseq_target_values		BIS_PMF_MIGRATION_PVT.reseq_dim_values_arr;
535   l_Actual_rec			BIS_PMF_MIGRATION_PVT.dim_values_rec;
536   l_reseq_actual_values	        BIS_PMF_MIGRATION_PVT.reseq_dim_values_arr;
537   l_userind_rec    		BIS_PMF_MIGRATION_PVT.dim_values_rec;
538   l_reseq_userind_Values        BIS_PMF_MIGRATION_PVT.reseq_dim_values_arr;
539   l_return_status               NUMBER;
540   l_sqlstmt 			VARCHAR2(32000);
541   l_sqlstmt1			VARCHAR2(32000);
542   l_sqlstmt2                    VARCHAR2(32000);
543   l_sqlstmt3			VARCHAR2(32000);
544   l_count			NUMBER := 1;
545   l_dummy_value 		NUMBER := 990;
546   l_dimlevel_count		NUMBER;
547   l_dim_count			NUMBER;
548   l_dim_levelvalue_count	NUMBER;
549   l_indicator_id                BIS_INDICATORS.INDICATOR_ID%TYPE;
550   l_error_tbl			BIS_UTILITIES_PUB.ERROR_TBL_TYPE;
551   l_sequence_no			NUMBER;
552   l_dim_level_id		NUMBER;
553   l_dim_level_short_name        VARCHAR2(32000);
554   l_dim_level_name              VARCHAR2(32000);
555   l_ret_status                  VARCHAR2(32000);
556   l_userind_org_name            VARCHAR2(32000);
557   l_userind_org_value           VARCHAR2(32000);
558   l_target_level_rec_new        BIS_TARget_LEVEL_PUB.TARGET_LEVEL_REC_TYPE;
559   -- meastmon 06/21/2001
560   l_userind_current_org_value   VARCHAR2(32000);
561 BEGIN
562 --Loop thru the cursor and resequence the dimension levels
563     FOR c_rec IN c_targetlvls LOOP
564         l_target_level_rec.measure_id         := c_rec.indicator_id;
565         l_target_level_rec.target_level_id    := c_rec.target_level_id;
566         l_target_level_rec.org_levelid        := c_rec.org_level_id;
567         l_target_level_rec.time_levelid       := c_Rec.time_level_id;
568         l_target_level_rec.dimension1_levelid := c_rec.dimension1_level_id;
569         l_target_level_rec.dimension2_levelid := c_rec.dimension2_level_id;
570         l_Target_level_Rec.dimension3_levelid := c_rec.dimension3_level_id;
571         l_target_level_rec.dimension4_levelid := c_rec.dimension4_level_id;
572         l_target_level_rec.dimension5_levelid := c_rec.dimension5_level_id;
573         l_dimlevel_count := 0;
574         IF (c_rec.org_level_id IS NOT NULL) THEN
575             l_dimlevel_count := l_dimlevel_count+1;
576         END IF;
577         IF (c_rec.time_level_id IS NOT NULL) THEN
578             l_dimlevel_count := l_dimlevel_count+1;
579         END IF;
580         IF (c_rec.dimension1_level_id IS NOT NULL) THEN
581             l_dimlevel_count := l_dimlevel_count+1;
582         END IF;
583         IF (c_rec.dimension2_level_id IS NOT NULL) THEN
587             l_dimlevel_count := l_dimlevel_count+1;
584             l_dimlevel_count := l_dimlevel_count+1;
585         END IF;
586         IF (c_rec.dimension3_level_id IS NOT NULL) THEN
588         END IF;
589         IF (c_rec.dimension4_level_id IS NOT NULL) THEN
590             l_dimlevel_count := l_dimlevel_count+1;
591         END IF;
592         IF (c_rec.dimension5_level_id IS NOT NULL) THEN
593             l_dimlevel_count := l_dimlevel_count+1;
594         END IF;
595         --Check if the org and time levels are null. If they are then there is no
596         --need to resequence anything.  This means the records are not really from an
597         -- older version of BIS. Also ignore any targets, actuals , user indicator dimensions
598         -- for this record since if they have org and time level values the whole thing is
599         --messed up anyway.
600         IF ((c_rec.org_level_id IS NOT NULL) OR (c_rec.time_level_id IS NOT NULL)) THEN
601             l_target_level_rec_new.dimension1_level_id := c_rec.dimension1_level_id;
602             l_target_level_rec_new.dimension2_level_id := c_rec.dimension2_level_id;
603             l_target_level_rec_new.dimension3_level_id := c_rec.dimension3_level_id;
604             l_target_level_rec_new.dimension4_level_id := c_rec.dimension4_level_id;
605             l_target_level_rec_new.dimension5_level_id := c_rec.dimension5_level_id;
606             l_target_level_rec_new.dimension6_level_id := c_rec.dimension6_level_id;
607             l_target_level_rec_new.dimension7_level_id := c_rec.dimension7_level_id;
608             l_target_level_rec_new.org_level_id        := c_rec.org_level_id;
609             l_target_level_rec_new.time_level_id       := c_rec.time_level_id;
610             l_target_level_rec_new.measure_id          := c_rec.indicator_id;
611 
612             IF (BIS_PMF_MIGRATION_PVT.NEEDS_MIGRATION(l_target_level_rec_new)) THEN
613                 BIS_PMF_MIGRATION_PVT.resequence_dimension_levels
614          		         (p_target_level_rec => l_target_level_rec
615 			             ,x_resequenced_dimensions => l_reseq_dims
616 			             ,x_dim_count     => l_dim_count
617                          ,x_return_status => l_return_status
618         		          );
619                 -- Check if the org_level_id and time_level_id are already part of one of
620                 -- the seven dimension levels. We really need to go back to the dimensions
621                 -- for these levels in order to verify that. This is to allow the re-re-running
622                 -- of this particular procedure
623                 IF (l_return_status = 0 AND l_reseq_dims.COUNT>0) THEN
624                     IF (l_dim_count = l_dimlevel_count) THEN
625                         --First update the dimension sequences
626                         l_Dummy_value := 990;
627 	                    FOR l_count IN 1..l_reseq_dims.COUNT LOOP
628                             IF c_rec.indicator_id = 1001 THEN
629 		                      NULL;--
630 	                        END If;
631 	                    END LOOP;
632                         FOR l_count IN 1..l_dim_count LOOP
633                             IF (l_reseq_dims(l_count).dim_id IS NULL) THEN
634                                 --EXIT;
635 		                        GOTO skip_record;
636 	                        ELSE
637 		                        --if (c_rec.indicator_id < 995) THEN
638                                 UPDATE bis_indicator_dimensions
639                                 SET sequence_no = l_dummy_value
640   	                            WHERE dimension_id=l_Reseq_dims(l_count).dim_id AND
641                                       indicator_id=c_rec.indicator_id;
642 		                        --END IF;
643 	                        END IF;
644 	                        l_dummy_value := l_dummy_value + 1;
645                         END LOOP;
646                         FOR l_count IN 1..l_dim_count LOOP
647                             IF (l_reseq_dims(l_count).dim_id IS NULL) THEN
648                                 EXIT;
649 	                        ELSE
650 		                        --if (c_rec.indicator_id > 995) THEN
651                                 l_indicator_id := c_rec.indicator_id;
652                                 UPDATE bis_indicator_dimensions
653                                 SET    sequence_no= l_reseq_dims(l_count).seq_no
654                                 WHERE  dimension_id = l_reseq_dims(l_count).dim_id AND
655                                        indicator_id = c_Rec.indicator_id;
656 		                        --END IF;
657 	                        END IF;
658                         END LOOP;
659                     END IF;
660 	                IF (l_dim_count = l_dimlevel_count) THEN
661                         l_sqlstmt := 'UPDATE bis_target_levels SET ' ||
662                                      l_reseq_dims(1).dim_level_col ||' = :1 ' ||
663                                      ' , '||l_reseq_dims(2).dim_level_col ||' = :2 '||
664                                      ' , '||l_reseq_dims(3).dim_level_col ||' = :3 '||
665                                      ' , '||l_reseq_dims(4).dim_level_col ||' = :4 '||
666                                      ' , '||l_reseq_dims(5).dim_level_col ||' = :5 '||
667                                      ' , '||l_reseq_dims(6).dim_level_col ||' = :6 '||
668                                      ' , '||l_reseq_dims(7).dim_level_col ||' = :7 '||
669 		                             '  WHERE target_level_id =:8';
670                       EXECUTE IMMEDIATE l_sqlstmt USING to_char(l_reseq_dims(1).dim_level_col_val),
671                            to_char(l_reseq_dims(2).dim_level_col_val), to_char(l_reseq_dims(3).dim_level_col_val),
675 	                    l_count := 0;
672                            to_char(l_reseq_dims(4).dim_level_col_val), to_char(l_reseq_dims(5).dim_level_col_val),
673                            to_char(l_reseq_dims(6).dim_level_col_val), to_char(l_reseq_dims(7).dim_level_col_val),
674                            c_rec.target_level_id;
676 	                    /*Migrate the targets*/
677                         FOR c_targetrec IN c_targetlvl_values(c_rec.target_level_id) LOOP
678                             l_count := l_count+1;
679                             l_target_rec.org_level_value := c_targetrec.org_level_value;
680 	                        l_target_rec.time_level_value := c_targetrec.time_level_value;
681 	                        l_target_rec.dimension1_level_value := c_targetrec.dimension1_level_value;
682                             l_target_rec.dimension2_level_value := c_targetrec.dimension2_level_value;
683                             l_target_rec.dimension3_level_value := c_targetrec.dimension3_level_value;
684                             l_target_rec.dimension4_level_value := c_targetrec.dimension4_level_value;
685                             l_Target_rec.dimension5_level_value := c_targetrec.dimension5_level_value;
686                             BIS_PMF_MIGRATION_PVT.resequence_dim_level_values(
687                		                   p_dimvalues_rec => l_target_rec
688 		                              ,p_dim_count  => l_dim_count
689 		                              ,x_reseq_dim_values => l_reseq_target_values
690 		                              ,x_return_Status       => l_return_status
691 	                                  );
692                             IF ((l_return_status = 0) AND (l_reseq_target_values.COUNT > 0)) THEN
693                                 l_sqlstmt1 := 'UPDATE bis_target_values SET '||
694                                               l_reseq_target_values(1).dim_level_name ||' = :1 '||
695                                               ' ,'|| l_Reseq_target_values(2).dim_level_name ||' = :2 ' ||
696 	                                          ' ,' || l_Reseq_target_values(3).dim_level_name ||' = :3 '||
697 	                                          ' ,' || l_Reseq_target_values(4).dim_level_name||' = :4 ' ||
698 	                                          ' ,' || l_Reseq_target_values(5).dim_level_name||' = :5 ' ||
699 	                                          ' ,' || l_Reseq_target_values(6).dim_level_name||' = :6 ' ||
700 	                                          ' ,' || l_Reseq_target_values(7).dim_level_name||' = :7 ' ||
701 			                                  ' WHERE target_level_id = :8  AND target_id = :9';
702                                 EXECUTE IMMEDIATE l_sqlstmt1 USING l_reseq_target_values(1).dim_level_value,
703                                      l_reseq_target_values(2).dim_level_value, l_reseq_target_values(3).dim_level_value,
704                                      l_reseq_target_values(4).dim_level_value, l_reseq_target_values(5).dim_level_value,
705                                      l_reseq_target_values(6).dim_level_value, l_reseq_target_values(7).dim_level_value,
706                                      c_rec.target_level_id, c_targetrec.target_id;
707  	                        END IF;
708                         END LOOP;
709                         --Migrate the Actual Values
710                         FOR c_actual_rec IN c_actual_values(c_rec.target_level_id)  LOOP
711                             l_actual_rec.target_level_id := c_actual_rec.target_level_id;
712 	                        l_actual_rec.org_level_value := c_actual_rec.org_level_value;
713                             l_actual_rec.time_level_value := c_actual_rec.time_level_value;
714                             l_actual_rec.dimension1_level_value := c_actual_rec.dimension1_level_value;
715                             l_actual_rec.dimension2_level_Value := c_actual_rec.dimension2_level_value;
716                             l_actual_rec.dimension3_level_value := c_actual_rec.dimension3_level_value;
717                             l_actual_rec.dimension4_level_value := c_actual_rec.dimension4_level_value;
718                             l_actual_rec.dimension5_level_value := c_actual_rec.dimension5_level_value;
719                             BIS_PMF_MIGRATION_PVT.resequence_dim_level_values(
720                		               p_dimvalues_rec => l_actual_rec
721 		                           ,p_dim_count  => l_dim_count
722 		                           ,x_reseq_dim_values => l_reseq_actual_values
723 		                           ,x_return_Status       => l_return_status
724 	                               );
725                             IF ((l_return_status = 0) AND (l_reseq_actual_values.COUNT > 0)) THEN
726                                 l_sqlstmt2 := 'UPDATE bis_actual_values SET '||
727                                               l_reseq_actual_values(1).dim_level_name ||' = :1 '||
728                                               ' ,'|| l_Reseq_actual_values(2).dim_level_name ||' = :2 ' ||
729 	                                          ' ,' || l_Reseq_actual_values(3).dim_level_name ||' = :3 '||
730 	                                          ' ,' || l_Reseq_actual_values(4).dim_level_name||' = :4 ' ||
731 	                                          ' ,' || l_Reseq_actual_values(5).dim_level_name||' = :5 ' ||
732 	                                          ' ,' || l_Reseq_actual_values(6).dim_level_name||' = :6 ' ||
733 	                                          ' ,' || l_Reseq_actual_values(7).dim_level_name||' = :7 ' ||
734 			                                  ' WHERE target_level_id = :8 AND actual_id = :9 ';
735                                 EXECUTE IMMEDIATE l_sqlstmt2 USING l_reseq_actual_values(1).dim_level_value,
736                                     l_reseq_actual_values(2).dim_level_value, l_reseq_actual_values(3).dim_level_value,
740  	                        END IF;
737                                     l_reseq_actual_values(4).dim_level_value, l_reseq_actual_values(5).dim_level_value,
738                                     l_reseq_actual_values(6).dim_level_value, l_reseq_actual_values(7).dim_level_value,
739                                     c_rec.target_level_id, c_actual_Rec.actual_id;
741 	                    END LOOP;
742                     END IF;
743 
744                     FOR c_userind_rec IN c_usrind_values(c_rec.target_level_id)  LOOP
745                         l_userind_rec.target_level_id := c_userind_rec.target_level_id;
746 	                    l_userind_rec.org_level_value := c_userind_rec.org_level_value;
747                         l_userind_rec.time_level_value := NULL;
748                         l_userind_rec.dimension1_level_value := c_userind_rec.dimension1_level_value;
749                         l_userind_rec.dimension2_level_Value := c_userind_rec.dimension2_level_value;
750                         l_userind_rec.dimension3_level_value := c_userind_rec.dimension3_level_value;
751                         l_userind_rec.dimension4_level_value := c_userind_rec.dimension4_level_value;
752                         l_userind_rec.dimension5_level_value := c_userind_rec.dimension5_level_value;
753                         /*BIS_PMF_MIGRATION_PVT.resequence_ind_level_values(
754                		           p_dimvalues_rec => l_userind_rec
755 		                      ,p_dim_count  => l_dim_count
756 		                      ,x_reseq_dim_values => l_reseq_userind_values
757 		                      ,x_return_Status       => l_return_status
758 	                          ); */
759                         -- For user indicator selections find out NOCOPY what is the org level and just update
760                         -- that particular dimension. The above logic tries to move the org level value to
761                         -- the end which is wrong
762 	                    BIS_PMF_DEFINER_WRAPPER_PVT.GET_ORG_LEVEL_ID
763                             (p_performance_measure_id         => c_rec.indicator_id
764                             ,p_target_level_id                => c_rec.target_level_id
765 	                    ,p_perf_measure_short_name        => null
766                             ,p_target_level_short_name        => null
767                             ,x_sequence_no                    => l_sequence_no
768                             ,x_dim_level_id                   => l_dim_level_id
769                             ,x_dim_level_short_name           => l_dim_level_short_name
770                             ,x_dim_level_name                 => l_dim_level_name
771                             ,x_return_status                  => l_ret_status
772                             ,x_error_tbl                      =>l_error_tbl
773                             );
774                         l_userind_org_name := '';
775                         l_userind_org_value := '';
776 
777                         --meastmon 06/21/20001
778                         --save the current value for organization level
779                         --It will be used to decide whether we have to update the record or not.
780                         l_userind_current_org_value := NULL;
781 
782                         IF (l_sequence_no = 1) THEN
783                             l_userind_org_name := 'dimension1_level_value';
784                             l_userind_org_value := ''''||c_userind_rec.org_level_value||'''';
785                             l_userind_current_org_value := c_userind_rec.dimension1_level_value;
786 	                    END IF;
787                         IF (l_sequence_no = 2) THEN
788                             l_userind_org_name := 'dimension2_level_value';
789                             l_userind_org_value := ''''||c_userind_rec.org_level_Value||'''';
790                             l_userind_current_org_value := c_userind_rec.dimension2_level_value;
791 	                    END IF;
792                         IF (l_sequence_no = 3) THEN
793                             l_userind_org_name := 'dimension3_level_value';
794                             l_userind_org_value := ''''||c_userind_rec.org_level_value||'''';
795                             l_userind_current_org_value := c_userind_rec.dimension3_level_value;
796 	                    END IF;
797                         IF (l_sequence_no = 4) THEN
798                             l_userind_org_name := 'dimension4_level_value';
799                             l_userind_org_value := ''''||c_userind_rec.org_level_value||'''';
800                             l_userind_current_org_value := c_userind_rec.dimension4_level_value;
801                         END IF;
802                         IF (l_sequence_no = 5) THEN
803                             l_userind_org_name := 'dimension5_level_value';
804                             l_userind_org_value := ''''||c_userind_rec.org_level_value||'''';
805                             l_userind_current_org_value := c_userind_rec.dimension5_level_value;
806 	                    END IF;
807                         IF (l_sequence_no = 6) THEN
808                             l_userind_org_name := 'dimension6_level_value';
809                             l_userind_org_value := ''''||c_userind_rec.org_level_value||'''';
810 	                    END IF;
811                         IF (l_sequence_no = 7) THEN
812                             l_userind_org_name := 'dimension7_level_value';
813                             l_userind_org_value := ''''||c_userind_rec.org_level_value||'''';
814 	                    END IF;
815                         --IF ((l_return_status = 0) AND (l_reseq_userind_values.COUNT > 0)) THEN
816                             /*l_sqlstmt3 := 'UPDATE bis_user_ind_selections SET '||
817                                             l_reseq_userind_values(1).dim_level_name ||' = '||
818  			                                NVL(l_reseq_userind_values(1).dim_level_value, 'NULL') ||
819                                             ' ,'|| l_reseq_userind_values(2).dim_level_name ||' = ' ||
820 			                                NVL(l_reseq_userind_values(2).dim_level_value, 'NULL') ||
821 	                                        ' ,' || l_reseq_userind_values(3).dim_level_name ||' = '||
822 			                                NVL(l_reseq_userind_values(3).dim_level_value,'NULL') ||
823 	                                        ' ,' || l_reseq_userind_values(4).dim_level_name||' = ' ||
824 			                                NVL(l_reseq_userind_values(4).dim_level_value,'NULL') ||
825 	                                        ' ,' || l_reseq_userind_values(5).dim_level_name||' = ' ||
826 			                                NVL(l_reseq_userind_values(5).dim_level_value,'NULL') ||
827 	                                        ' ,' || l_reseq_userind_values(6).dim_level_name||' = ' ||
828 			                                NVL(l_reseq_userind_values(6).dim_level_value,'NULL') ||
829 	                                        ' ,' || l_reseq_userind_values(7).dim_level_name||' = ' ||
830 			                                NVL(l_reseq_userind_values(7).dim_level_value,'NULL') ||
831 			                                ' WHERE target_level_id = :1  ';*/
832                         --meastmon 06/21/2001
833                         --If it is null --> Update the record
834                         --Else --> dont touch it (It could be a new user selection or the migration was done before)
835                         IF (l_userind_current_org_value IS NULL AND l_userind_org_name IS NOT NULL) THEN
836                             l_sqlstmt3 := 'UPDATE bis_user_ind_selections SET '||
837                                           l_userind_org_name ||'= :1 ' ||
838 		    	                          ' WHERE ind_selection_id = :2 AND target_level_id = :3';
839                             EXECUTE IMMEDIATE l_sqlstmt3 USING l_userind_org_value, c_userind_rec.ind_selection_id, c_rec.target_level_id;
840  	                    END IF;
841 	               END LOOP;
842                    --END IF;
843                 END IF;
844             END IF;
845         END IF;
846         <<skip_record>>
847         null;
848     END LOOP;
849     COMMIT;
850     --rollback;
851 
852     x_return_Status := 'Success';
853     x_return_code   := 0;
854 EXCEPTION
855   WHEN OTHERS THEN
856        ROLLBACK;
857        x_return_Status := SQLERRM;
858        x_return_code   := SQLCODE;
859 END MIGRATE_PERFORMANCE_MEASURES;
860 
861 
862 
863 FUNCTION NEEDS_MIGRATION
864 (p_target_level_rec    IN BIS_TARGET_LEvel_PUB.TARGET_LEVEL_REC_TYPE
865 )
866 RETURN BOOLEAN
867 IS
868   l_org_time_exists       BOOLEAN;
869   l_org_id                NUMBER;
870   l_time_id               NUMBER;
871   l_dim1_id               NUMBER;
875   l_dim5_id               NUMBER;
872   l_dim2_id               NUMBER;
873   l_dim3_id               NUMBER;
874   l_dim4_id               NUMBER;
876   l_dim6_id               NUMBER;
877   l_dim7_id               NUMBER;
878 
879   CURSOR c_target_lvl_exists(cp_tl_rec    IN BIS_TARGET_LEvel_PUB.TARGET_LEVEL_REC_TYPE) IS
880   SELECT COUNT(1) FROM bis_target_levels
881   WHERE indicator_id = cp_tl_rec.measure_id
882     AND ( cp_tl_rec.dimension1_level_id IS NULL OR
883           dimension1_level_id = cp_tl_rec.dimension1_level_id
884         )
885     AND ( cp_tl_rec.dimension2_level_id IS NULL OR
886           dimension2_level_id = cp_tl_rec.dimension2_level_id
887         )
888     AND ( cp_tl_rec.dimension3_level_id IS NULL OR
889           dimension3_level_id = cp_tl_rec.dimension3_level_id
890         )
891     AND ( cp_tl_rec.dimension4_level_id IS NULL OR
892           dimension4_level_id = cp_tl_rec.dimension4_level_id
893         )
894     AND ( cp_tl_rec.dimension5_level_id IS NULL OR
895           dimension5_level_id = cp_tl_rec.dimension5_level_id
896         )
897     AND ( cp_tl_rec.dimension6_level_id IS NULL OR
898           dimension6_level_id = cp_tl_rec.dimension6_level_id
899         )
900     AND ( cp_tl_rec.dimension7_level_id IS NULL OR
901           dimension7_level_id = cp_tl_rec.dimension7_level_id
902         );
903 
904   l_tl_count             NUMBER := 0;
905   l_mig_target_level_rec BIS_PMF_MIGRATION_PVT.target_level_rec;
906   l_target_level_rec     BIS_TARGET_LEVEL_PUB.TARGET_LEVEL_REC_TYPE;
907   l_reseq_dims           BIS_PMF_MIGRATION_PVT.resequenced_dimensions_Array;
908   l_return_status        NUMBER;
909   l_dim_count            NUMBER;
910 
911 BEGIN
912 
913   -- Get the resequenced dimension levels which will be used to update
914   -- the record to be migrated
915 
916   l_mig_target_level_rec.measure_id         := p_target_level_rec.measure_id;
917   l_mig_target_level_rec.target_level_id    := p_target_level_rec.target_level_id;
918   l_mig_target_level_rec.org_levelid        := p_target_level_rec.org_level_id;
919   l_mig_target_level_rec.time_levelid       := p_target_level_rec.time_level_id;
920   l_mig_target_level_rec.dimension1_levelid := p_target_level_rec.dimension1_level_id;
921   l_mig_target_level_rec.dimension2_levelid := p_target_level_rec.dimension2_level_id;
922   l_mig_target_level_Rec.dimension3_levelid := p_target_level_rec.dimension3_level_id;
923   l_mig_target_level_rec.dimension4_levelid := p_target_level_rec.dimension4_level_id;
924   l_mig_target_level_rec.dimension5_levelid := p_target_level_rec.dimension5_level_id;
925 
926   BIS_PMF_MIGRATION_PVT.resequence_dimension_levels
927   (p_target_level_rec       => l_mig_target_level_rec
928   ,x_resequenced_dimensions => l_reseq_dims
929   ,x_dim_count              => l_dim_count
930   ,x_return_status          => l_return_status
931   );
932 
933   -- Create a target level record using the dimension 1 to 7 level ids
934 
935   l_target_level_rec.measure_id          := p_target_level_rec.measure_id;
936   l_target_level_rec.dimension1_level_id := l_reseq_dims(1).dim_level_col_val;
937   l_target_level_rec.dimension2_level_id := l_reseq_dims(2).dim_level_col_val;
938   l_target_level_rec.dimension3_level_id := l_reseq_dims(3).dim_level_col_val;
939   l_target_level_rec.dimension4_level_id := l_reseq_dims(4).dim_level_col_val;
940   l_target_level_rec.dimension5_level_id := l_reseq_dims(5).dim_level_col_val;
941   l_target_level_rec.dimension6_level_id := l_reseq_dims(6).dim_level_col_val;
942   l_target_level_rec.dimension7_level_id := l_reseq_dims(7).dim_level_col_val;
943 
944   -- If the target level combination already exists then the target level should
945   -- not be migrated
946 
947   IF (c_target_lvl_exists%ISOPEN) THEN
948     CLOSE c_target_lvl_exists;
949   END IF;
950 
951   OPEN c_target_lvl_exists(cp_tl_rec => l_target_level_rec);
952   FETCH c_target_lvl_exists INTO l_tl_count;
953   CLOSE c_target_lvl_exists;
954 
955   IF (l_tl_count <> 0) THEN
956     RETURN FALSE;
957   END IF;
958 
959   -- IF either org or time exists then return true here. As it should never
960   -- happen that, only org got migrated and not time
961   l_org_id := BIS_PMF_MIGRATION_PVT.GET_DIMENSION_ID(p_target_level_rec.org_level_id);
962   l_time_id := BIS_PMF_MIGRATION_PVT.GET_DIMENSION_ID(p_target_level_rec.time_level_id);
963   l_dim1_id := BIS_PMF_MIGRATION_PVT.GET_DIMENSION_ID(p_target_level_rec.dimension1_level_id);
964   l_dim2_id := BIS_PMF_MIGRATION_PVT.GET_DIMENSION_ID(p_target_level_rec.dimension2_level_id);
965   l_dim3_id := BIS_PMF_MIGRATION_PVT.GET_DIMENSION_ID(p_target_level_rec.dimension3_level_id);
966   l_dim4_id := BIS_PMF_MIGRATION_PVT.GET_DIMENSION_ID(p_target_level_rec.dimension4_level_id);
967   l_dim5_id := BIS_PMF_MIGRATION_PVT.GET_DIMENSION_ID(p_target_level_rec.dimension5_level_id);
968   l_dim6_id := BIS_PMF_MIGRATION_PVT.GET_DIMENSION_ID(p_target_level_rec.dimension6_level_id);
969   l_dim7_id := BIS_PMF_MIGRATION_PVT.GET_DIMENSION_ID(p_target_level_rec.dimension7_level_id);
970 
971   l_org_time_exists := TRUE;
972   IF (l_org_id = l_dim1_id)
973   THEN
974       l_org_time_exists := FALSE;
975       GOTO    returnfromproc;
976   END IF;
977   IF (l_org_id = l_dim2_id)
978   THEN
979       l_org_time_exists := FALSE;
980       GOTO    returnfromproc;
981   END IF;
982   IF (l_org_id = l_dim3_id)
983   THEN
984       l_org_time_exists := FALSE;
985       GOTO    returnfromproc;
986   END IF;
987   IF (l_org_id = l_dim4_id)
988   THEN
989       l_org_time_exists := FALSE;
990       GOTO    returnfromproc;
991   END IF;
992   IF (l_org_id = l_dim5_id)
993   THEN
994       l_org_time_exists := FALSE;
995       GOTO    returnfromproc;
996   END IF;
997   IF (l_org_id = l_dim6_id)
998   THEN
999       l_org_time_exists := FALSE;
1000       GOTO    returnfromproc;
1001   END IF;
1002   IF (l_org_id = l_dim7_id)
1003   THEN
1004       l_org_time_exists := FALSE;
1005       GOTO    returnfromproc;
1006   END IF;
1007   IF (l_time_id = l_dim1_id)
1008   THEN
1009       l_org_time_exists := FALSE;
1010       GOTO    returnfromproc;
1011   END IF;
1012   IF (l_time_id = l_dim2_id)
1013   THEN
1014       l_org_time_exists := FALSE;
1015       GOTO    returnfromproc;
1016   END IF;
1017   IF (l_time_id = l_dim3_id)
1018   THEN
1019       l_org_time_exists := FALSE;
1020       GOTO    returnfromproc;
1021   END IF;
1022   IF (l_time_id = l_dim4_id)
1023   THEN
1024       l_org_time_exists := FALSE;
1025       GOTO    returnfromproc;
1026   END IF;
1027   IF (l_time_id = l_dim5_id)
1028   THEN
1029       l_org_time_exists := FALSE;
1030       GOTO    returnfromproc;
1031   END IF;
1032   IF (l_time_id = l_dim6_id)
1033   THEN
1034       l_org_time_exists := FALSE;
1035       GOTO    returnfromproc;
1036   END IF;
1037   IF (l_time_id = l_dim7_id)
1038   THEN
1039       l_org_time_exists := FALSE;
1040       GOTO    returnfromproc;
1041   END IF;
1042   <<returnfromproc>>
1043   RETURN l_org_time_exists;
1044 EXCEPTION
1045   WHEN OTHERS THEN
1046   IF (c_target_lvl_exists%ISOPEN) THEN
1047     CLOSE c_target_lvl_exists;
1048   END IF;
1049   RETURN FALSE;
1050 END;
1051 END BIS_PMF_MIGRATION_PVT;
1052  --SHOW ERRORS