DBA Data[Home] [Help]

PACKAGE BODY: APPS.EDW_BSC_BRIDGE

Source


1 Package Body EDW_BSC_BRIDGE AS
2 /* $Header: EDWBSCB.pls 115.14 2004/02/13 05:01:13 smulye noship $ */
3 e_DynamicSqlStmtErr  EXCEPTION;
4 TYPE t_FactMeasure IS RECORD (
5   measure_name EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_NAME%TYPE,
6   measure_id   EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_ID%TYPE
7 );
8 
9 TYPE FactDimColTable IS TABLE of
10   EDW_FACT_DIM_RELATIONS_MD_V.FACT_FK_COL_NAME%TYPE
11   INDEX BY BINARY_INTEGER;
12 
13 TYPE FactMeasureTable IS TABLE of
14   t_FactMeasure
15   INDEX BY BINARY_INTEGER;
16 
17 TYPE t_Fact IS RECORD (
18   fact_id     EDW_FACTS_MD_V.FACT_ID%TYPE,
19   fact_name   EDW_FACTS_MD_V.FACT_NAME%TYPE
20 );
21 
22 TYPE FactTable IS TABLE of
23   t_Fact
24   INDEX BY BINARY_INTEGER;
25 
26 
27 NOTVALID       constant VARCHAR2(30) := 'NOT_VALID';
28 VALID          constant VARCHAR2(30) := 'VALID';
29 NOSYNONYM      constant VARCHAR2(30) := 'VALID_WITHOUT_SYNONYM';
30 STARTED        constant VARCHAR2(30) := 'Started';
31 FAILED         constant VARCHAR2(30) := 'Failed';
32 PROCESSING     constant VARCHAR2(30) := 'Processing';
33 PROCESSED      constant VARCHAR2(30) := 'Processed';
34 DONE           constant VARCHAR2(30) := 'Done';
35 ABORTED        constant VARCHAR2(30) := 'Aborted';
36 SQLERR         constant VARCHAR2(30) := 'Sql Error';
37 EXECUTING      constant VARCHAR2(30) := 'Executing';
38 EXECUTED       constant VARCHAR2(30) := 'Executed';
39 SCRIPTING      constant VARCHAR2(30) := 'Scripting';
40 SCRIPTED       constant VARCHAR2(30) := 'Scripted';
41 DEBUG          constant VARCHAR2(30) := 'Debug';
42 -- Cache the EDW_TIME_M Dimsension ID.
43 v_time_dimension_id EDW_DIMENSIONS_MD_V.DIM_NAME%TYPE  := NULL;
44 v_fact_id           EDW_FACTS_MD_V.FACT_ID%TYPE        := NULL;
45 v_fact_name         EDW_FACTS_MD_V.FACT_NAME%TYPE      := NULL;
46 
47 CURSOR dim_id(
48   p_object_name EDW_DIMENSIONS_MD_V.DIM_NAME%TYPE
49 ) IS
50 SELECT DIM_ID
51 FROM EDW_DIMENSIONS_MD_V
52 WHERE DIM_NAME = p_object_name;
53 
54 CURSOR c_fact IS
55 SELECT
56      FACT_ID
57    , FACT_NAME
58 FROM EDW_FACTS_MD_V;
59 
60 CURSOR c_factid (
61   p_fact_name        EDW_FACTS_MD_V.FACT_NAME%TYPE
62 )IS
63 SELECT
64     FACT_ID
65 FROM EDW_FACTS_MD_V
66 WHERE FACT_NAME = p_fact_name;
67 
68 CURSOR c_time_hier_id(
69   p_hier_prefix       EDW_HIERARCHIES_MD_V.HIER_PREFIX%TYPE
70 ) IS
71 SELECT HIER_ID
72 FROM EDW_HIERARCHIES_MD_V
73 WHERE
74  DIM_ID = v_time_dimension_id
75 AND HIER_PREFIX = p_hier_prefix;
76 
77 --excuted once per fact, no need for tuning
78 CURSOR c_facttimedimcol(p_fact_name EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE) IS
79 SELECT
80   FACT_FK_COL_NAME
81 FROM EDW_FACT_DIM_RELATIONS_MD_V
82 WHERE
83     DIM_ID = v_time_dimension_id
84     -- use the cached id for better performance,
85     -- it is instanciated at the intialization.
86 AND FACT_NAME = p_fact_name;
87 
88 
89 --excuted once per fact, no need for tuning
90 CURSOR c_factnontimedimcol(p_fact_name EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE) IS
91 SELECT
92   FACT_FK_COL_NAME
93 FROM EDW_FACT_DIM_RELATIONS_MD_V
94 WHERE
95     DIM_ID <> v_time_dimension_id
96     -- use the cached id for better performance,
97     -- it is instanciated at the intialization.
98 AND FACT_NAME = p_fact_name;
99 
100 --excuted once per fact, no need for tuning
101 CURSOR c_factmeasure(p_fact_name EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE) IS
102 SELECT
103   ATTRIBUTE_ID ,
104   ATTRIBUTE_NAME
105 FROM EDW_FACT_ATTRIBUTES_MD_V
106 WHERE FACT_NAME = p_fact_name
107 AND ATTRIBUTE_TYPE = 'MEASURE';
108 
109 
110 --excuted once per fact, no need for tuning
111 CURSOR c_factmeasure_id(
112   p_fact_name EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE,
113   p_measure_name EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_NAME%TYPE
114 ) IS
115 SELECT
116   ATTRIBUTE_ID
117 FROM EDW_FACT_ATTRIBUTES_MD_V
118 WHERE
119     FACT_NAME = p_fact_name
120 AND ATTRIBUTE_NAME = p_measure_name
121 AND ATTRIBUTE_TYPE = 'MEASURE';
122 
123 
124 CURSOR c_factvalidity_t(
125   p_fact_name     EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE
126 )IS
127 SELECT
128   object_name
129 FROM
130   user_objects
131 WHERE
132     object_name = UPPER(p_fact_name)
133 AND object_type = 'TABLE';
134 
135 CURSOR c_factvalidity_s(
136   p_fact_name     EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE
137 )IS
138 SELECT
139   object_name
140 FROM
141   user_objects
142 WHERE
143     object_name = UPPER(p_fact_name)
144 AND object_type = 'SYNONYM';
145 
146 /*
147 CHANGES FOR BUG 3431744 BY AMITGUPT
148 */
149 CURSOR c_att_validity (
150   p_tbl_name ALL_TAB_COLUMNS.TABLE_NAME%TYPE ,
151   p_col_name ALL_TAB_COLUMNS.COLUMN_NAME%TYPE) IS
152 SELECT
153   COUNT(TAB.COLUMN_NAME)
154 FROM
155   ALL_TAB_COLUMNS TAB, USER_SYNONYMS SYN
156 WHERE
157     TAB.TABLE_NAME = UPPER(p_tbl_name) AND
158     SYN.TABLE_NAME = TAB.TABLE_NAME  AND
159     SYN.TABLE_OWNER = TAB.OWNER AND
160     TAB.COLUMN_NAME = UPPER(p_col_name);
161 
162 
163 v_445_id            EDW_HIERARCHIES_MD_V.HIER_ID%TYPE := NULL;
164 v_pa_id             EDW_HIERARCHIES_MD_V.HIER_ID%TYPE := NULL;
165 v_gl_id             EDW_HIERARCHIES_MD_V.HIER_ID%TYPE := NULL;
166 v_enterprise_id     EDW_HIERARCHIES_MD_V.HIER_ID%TYPE := NULL;
167 v_gregerion_id      EDW_HIERARCHIES_MD_V.HIER_ID%TYPE := NULL;
168 
169 
170 
171 FUNCTION GET_DIM_ID(
172   p_object_name EDW_DIMENSIONS_MD_V.DIM_NAME%TYPE
173 ) RETURN EDW_DIMENSIONS_MD_V.DIM_ID%TYPE;
174 
175 FUNCTION GET_TIME_ID RETURN EDW_DIMENSIONS_MD_V.DIM_ID%TYPE;
176 
177 PROCEDURE INITIALIZE;
178 
179 PROCEDURE FINALIZE;
180 
181 PROCEDURE LOG(
182     p_code              EDW_CALSUM4_BSC_LOG.CODE%TYPE
183   , p_text              EDW_CALSUM4_BSC_LOG.TEXT%TYPE
184   , p_info              EDW_CALSUM4_BSC_LOG.INFO%TYPE
185 );
186 
187 FUNCTION GET_FACT_ID(
188    p_fact_name IN EDW_FACTS_MD_V.FACT_NAME%TYPE
189 ) RETURN EDW_FACTS_MD_V.FACT_ID%TYPE;
190 
191 FUNCTION CHECK_VALIDILITY(
192   p_tbl_name ALL_TAB_COLUMNS.TABLE_NAME%TYPE ,
193   p_col_name ALL_TAB_COLUMNS.COLUMN_NAME%TYPE)
194 RETURN BOOLEAN;
195 
196 FUNCTION CHECK_FACT_VALIDILITY(
197   p_fact_name IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE
198 ) RETURN VARCHAR2;
199 
200 FUNCTION GET_FACT_MEASURE(
201   p_fact_name IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE
202 )RETURN FactMeasureTable;
203 
204 FUNCTION GET_FACT_TIME_DIM_COL(
205   p_fact_name IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE
206 )RETURN FactDimColTable;
207 
208 FUNCTION GET_FACT_NONTIME_DIM_COL(
209   p_fact_name IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE
210 )RETURN FactDimColTable;
211 
212 FUNCTION GET_SQL_STMT(
213   p_fact_id                 IN EDW_FACT_ATTRIBUTES_MD_V.FACT_ID%TYPE,
214   p_fact_name               IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE,
215   p_fact_time_dim_table     IN FactDimColTable,
216   p_fact_nontime_dim_table  IN FactDimColTable,
217   p_fact_measure            IN EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_NAME%TYPE,
218   p_fact_measure_id         IN EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_ID%TYPE,
219   p_hier                    IN VARCHAR
220 )RETURN VARCHAR2;
221 
222 
223 PROCEDURE POPULATE_EDW_CALSUM4_BSC(
224   p_fact_name IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE
225 );
226 
227 PROCEDURE POPULATE_EDW_CALSUM4_BSC(
228   p_fact_name    IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE,
229   p_measure_name IN EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_NAME%TYPE
230 );
231 
232 PROCEDURE POPULATE_EDW_CALSUM4_BSC(
233   p_fact_id   IN EDW_FACT_ATTRIBUTES_MD_V.FACT_ID%TYPE,
234   p_fact_name IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE
235 );
236 
237 PROCEDURE POPULATE_EDW_CALSUM4_BSC(
238   p_fact_id                 IN EDW_FACT_ATTRIBUTES_MD_V.FACT_ID%TYPE,
239   p_fact_name               IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE,
240   p_fact_time_dim_table     IN FactDimColTable,
241   p_fact_nontime_dim_table  IN FactDimColTable,
242   p_fact_measure            IN EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_NAME%TYPE,
243   p_fact_measure_id         IN EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_ID%TYPE
244 );
245 
246 
247 PROCEDURE POPULATE_EDW_CALSUM4_BSC(
248   p_fact_id            IN EDW_FACT_ATTRIBUTES_MD_V.FACT_ID%TYPE,
249   p_fact_name          IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE,
250   p_fact_measure_table IN FactMeasureTable
251 );
252 
253 FUNCTION GET_FACT_MEASURE_ID(
254   p_fact_name EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE,
255   p_measure_name EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_NAME%TYPE
256 )RETURN NUMBER;
257 
258 FUNCTION GET_HIER_ID(
259   p_hier_prefix          IN EDW_HIERARCHIES_MD_V.HIER_PREFIX%TYPE
260 ) RETURN NUMBER;
261 
262 FUNCTION GET_TIME_HIER_ID(
263   p_hier_prefix          IN EDW_HIERARCHIES_MD_V.HIER_PREFIX%TYPE
264 ) RETURN NUMBER;
265 
266 --Kernal Entries
267 -- #1.1
268 PROCEDURE POPULATE_EDW_CALSUM4_BSC(
269    errbuf   OUT NOCOPY VARCHAR2,
270    retcode  OUT NOCOPY NUMBER
271 ) IS
272   l_fact_id     EDW_FACTS_MD_V.FACT_ID%TYPE;
273   l_fact        EDW_FACTS_MD_V.FACT_NAME%TYPE;
274   l_fact_tbl    FactTable;
275   l_fact_count  BINARY_INTEGER;
276   l_fact_index  BINARY_INTEGER;
277 BEGIN
278   INITIALIZE;
279   --cache the fact information and close the cursor!
280   l_fact_count := 0;
281   OPEN c_fact;
282   LOOP
283     FETCH c_fact INTO l_fact_id, l_fact;
284     EXIT WHEN c_fact%NOTFOUND;
285     l_fact_tbl(l_fact_count).fact_id := l_fact_id;
286     l_fact_tbl(l_fact_count).fact_name := l_fact;
287     l_fact_count := l_fact_count + 1;
288   END LOOP;
289   CLOSE c_fact;
290 
291   --start processing fact by fact
292   l_fact_index := l_fact_tbl.FIRST;
293   LOOP
294     POPULATE_EDW_CALSUM4_BSC(
295       l_fact_tbl(l_fact_index).fact_id,
296       l_fact_tbl(l_fact_index).fact_name);
297     EXIT WHEN l_fact_index = l_fact_tbl.LAST;
298     l_fact_index := l_fact_tbl.NEXT(l_fact_index);
299   END LOOP;
300 
301   FINALIZE;
302 
303   EXCEPTION
304     WHEN OTHERS THEN
305       CLOSE c_fact;
306       retcode := SQLCODE;
307       errbuf := SQLERRM;
308       LOG(retcode, SQLERR, errbuf);
309       LOG(NULL, ABORTED, 'Process aborted!!');
310 END POPULATE_EDW_CALSUM4_BSC;
311 
312 -- #1.2
313 PROCEDURE POPULATE_EDW_CALSUM4_BSC(
314   p_fact_name IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE,
315   errbuf   OUT NOCOPY VARCHAR2,
316   retcode  OUT NOCOPY NUMBER
317 ) IS
318 BEGIN
319   INITIALIZE;
320   POPULATE_EDW_CALSUM4_BSC(p_fact_name);
321   FINALIZE;
322   EXCEPTION
323     WHEN OTHERS THEN
324       retcode := SQLCODE;
325       errbuf := SQLERRM;
326       LOG(retcode, SQLERR, errbuf);
327       LOG(NULL, ABORTED, 'Process aborted!!');
328 END POPULATE_EDW_CALSUM4_BSC;
329 
330 -- #1.3
331 PROCEDURE POPULATE_EDW_CALSUM4_BSC(
332   p_fact_name    IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE,
333   p_measure_name IN EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_NAME%TYPE,
334   errbuf   OUT NOCOPY VARCHAR2,
335   retcode  OUT NOCOPY NUMBER
336 ) IS
337 BEGIN
338   INITIALIZE;
339   POPULATE_EDW_CALSUM4_BSC(p_fact_name, p_measure_name);
340   FINALIZE;
341   EXCEPTION
342     WHEN OTHERS THEN
343       CLOSE c_fact;
344       retcode := SQLCODE;
345       errbuf := SQLERRM;
346       LOG(retcode, SQLERR, errbuf);
347       LOG(NULL, ABORTED, 'Process aborted!!');
348 END POPULATE_EDW_CALSUM4_BSC;
349 --Kernal Entries
350 
351 -- Second Level Procedures
352 -- #2.1 : Called by Entry #1.1
353 PROCEDURE POPULATE_EDW_CALSUM4_BSC(
354   p_fact_id   IN EDW_FACT_ATTRIBUTES_MD_V.FACT_ID%TYPE,
355   p_fact_name IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE
356 ) IS
357   l_fact_measure_table       FactMeasureTable;
358 
359 BEGIN
360   IF(CHECK_FACT_VALIDILITY(p_fact_name) <> VALID) THEN
361     RETURN ;
362   ELSE
363     l_fact_measure_table:= GET_FACT_MEASURE(p_fact_name);
364     POPULATE_EDW_CALSUM4_BSC(p_fact_id, p_fact_name, l_fact_measure_table);
365   END IF;
366 END POPULATE_EDW_CALSUM4_BSC;
367 
368 -- #2.2 : Called by Entry #1.2
369 PROCEDURE POPULATE_EDW_CALSUM4_BSC(
370   p_fact_name IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE
371 ) IS
372   l_fact_measure_table       FactMeasureTable;
373   l_fact_id                  EDW_FACT_ATTRIBUTES_MD_V.FACT_ID%TYPE;
374 BEGIN
375   IF(CHECK_FACT_VALIDILITY(p_fact_name) <> VALID) THEN
376     RETURN ;
377   ELSE
378     l_fact_id := GET_FACT_ID(p_fact_name);
379     l_fact_measure_table:= GET_FACT_MEASURE(p_fact_name);
380     POPULATE_EDW_CALSUM4_BSC(l_fact_id, p_fact_name, l_fact_measure_table);
381   END IF;
382 END POPULATE_EDW_CALSUM4_BSC;
383 
384 -- #2.3 : Called by Entry #1.3
385 PROCEDURE POPULATE_EDW_CALSUM4_BSC(
386   p_fact_name    IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE,
387   p_measure_name IN EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_NAME%TYPE
388 ) IS
389   l_fact_id                  EDW_FACT_ATTRIBUTES_MD_V.FACT_ID%TYPE;
390   l_measure_id               EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_ID%TYPE;
391   l_fact_measure_table       FactMeasureTable;
392 BEGIN
393   IF( CHECK_FACT_VALIDILITY(p_fact_name) <> VALID) THEN
394     RETURN;
395   ELSIF( CHECK_VALIDILITY( p_fact_name, p_measure_name)) THEN
396     l_fact_id := GET_FACT_ID(p_fact_name);
397     l_measure_id := GET_FACT_MEASURE_ID(p_fact_name, p_measure_name);
398 
399     -- create a one item measure-table
400     l_fact_measure_table(0).measure_name := p_measure_name;
401     l_fact_measure_table(0).measure_id := l_measure_id;
402     POPULATE_EDW_CALSUM4_BSC(l_fact_id, p_fact_name, l_fact_measure_table);
403   ELSE
404     LOG(NULL, FAILED , '  Corrupted metadata definition, ' || p_measure_name || ', in ' || p_fact_name);
405     RETURN ;
406   END IF;
407 END POPULATE_EDW_CALSUM4_BSC;
408 
409 -- Third Level Procedures
410 -- #3.1 : called by #2.1, #2.2 & #2.3
411 PROCEDURE POPULATE_EDW_CALSUM4_BSC(
412   p_fact_id             IN EDW_FACT_ATTRIBUTES_MD_V.FACT_ID%TYPE,
413   p_fact_name           IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE,
414   p_fact_measure_table  IN FactMeasureTable
415 ) IS
416   l_fact_measure         EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_NAME%TYPE;
417   l_measure_index        BINARY_INTEGER;
418   l_fact_time_dim_table  FactDimColTable;
419   l_fact_nontime_dim_table  FactDimColTable;
420 BEGIN
421   l_fact_time_dim_table := GET_FACT_TIME_DIM_COL(p_fact_name);
422   l_fact_nontime_dim_table := GET_FACT_NONTIME_DIM_COL(p_fact_name);
423   -- Don't do anything if no time dimension or no measures
427     l_measure_index := p_fact_measure_table.FIRST;
424   -- Otherwise, the dynamic sql statement will be errered out
425   IF (    l_fact_time_dim_table.COUNT > 0
426       AND p_fact_measure_table.COUNT > 0)  THEN
428     LOOP
429       POPULATE_EDW_CALSUM4_BSC(
430         p_fact_id,
431         p_fact_name,
432         l_fact_time_dim_table,
433         l_fact_nontime_dim_table,
434         p_fact_measure_table(l_measure_index).measure_name,
435         p_fact_measure_table(l_measure_index).measure_id);
436       COMMIT;
437       EXIT WHEN l_measure_index = p_fact_measure_table.LAST;
438       l_measure_index := p_fact_measure_table.NEXT(l_measure_index);
439     END LOOP;
440   ELSE
441     LOG(NULL, FAILED, '  No measure or time dimension defined for the fact '|| p_fact_name);
442   END IF;
443 END POPULATE_EDW_CALSUM4_BSC;
444 
445 -- The Fourth Level Procedure
446 -- #4.1 : Called by #3.1
447 PROCEDURE POPULATE_EDW_CALSUM4_BSC(
448   p_fact_id                 IN EDW_FACT_ATTRIBUTES_MD_V.FACT_ID%TYPE,
449   p_fact_name               IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE,
450   p_fact_time_dim_table     IN FactDimColTable,
451   p_fact_nontime_dim_table  IN FactDimColTable,
452   p_fact_measure            IN EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_NAME%TYPE,
453   p_fact_measure_id         IN EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_ID%TYPE
454 ) IS
455    l_calsum_stmt     varchar2(30000) := NULL;
456    l_calsum          varchar2(100);
457    l_sumid           EDW_CALSUM4_BSC.CALSUM_ID%TYPE;
458    l_hier            varchar2(50);
459    l_hier_id         EDW_CALSUM4_BSC.HIERID%TYPE;
460    l_ErrorCode       EDW_CALSUM4_BSC_LOG.CODE%TYPE;
461    l_ErrorText       EDW_CALSUM4_BSC_LOG.TEXT%TYPE;
462    l_fact_dim_index  BINARY_INTEGER;
463    l_err_info        EDW_CALSUM4_BSC_LOG.INFO%TYPE;
464 BEGIN
465   LOG(NULL, PROCESSING, '->Fact: ' || p_fact_name || ', ' || 'Measure: ' || p_fact_measure);
466 
467   l_calsum_stmt := GET_SQL_STMT(p_fact_id, p_fact_name, p_fact_time_dim_table, p_fact_nontime_dim_table, p_fact_measure, p_fact_measure_id, '445');
468   LOG(NULL, EXECUTING, '445------------------------------------------>');
469   EXECUTE IMMEDIATE l_calsum_stmt;
470   LOG(NULL, EXECUTED, '445<------------------------------------------');
471 
472 
473   l_calsum_stmt := GET_SQL_STMT(p_fact_id, p_fact_name, p_fact_time_dim_table, p_fact_nontime_dim_table, p_fact_measure, p_fact_measure_id, 'PA');
474   LOG(NULL, EXECUTING, 'PA------------------------------------------>');
475   EXECUTE IMMEDIATE l_calsum_stmt;
476   LOG(NULL, EXECUTED, 'PA<------------------------------------------');
477 
478   l_calsum_stmt := GET_SQL_STMT(p_fact_id, p_fact_name, p_fact_time_dim_table, p_fact_nontime_dim_table, p_fact_measure, p_fact_measure_id, 'GL');
479   LOG(NULL, EXECUTING, 'GL------------------------------------------>');
480   EXECUTE IMMEDIATE l_calsum_stmt;
481   LOG(NULL, EXECUTED, 'GL<------------------------------------------');
482 
483   l_calsum_stmt := GET_SQL_STMT(p_fact_id, p_fact_name, p_fact_time_dim_table, p_fact_nontime_dim_table, p_fact_measure, p_fact_measure_id, 'GREGERION');
484   LOG(NULL, EXECUTING, 'GREGERION------------------------------------------>');
485   EXECUTE IMMEDIATE l_calsum_stmt;
486   LOG(NULL, EXECUTED, 'GREGERION<------------------------------------------');
487 
488   l_calsum_stmt := GET_SQL_STMT(p_fact_id, p_fact_name, p_fact_time_dim_table, p_fact_nontime_dim_table, p_fact_measure, p_fact_measure_id, 'ENTERPRISE');
489   LOG(NULL, EXECUTING, 'ENTERPRISE------------------------------------------>');
490   EXECUTE IMMEDIATE l_calsum_stmt;
491   LOG(NULL, EXECUTED, 'ENTERPRISE<------------------------------------------');
492 
493   LOG(NULL, PROCESSED, '<-Fact: ' || p_fact_name || ', ' || 'Measure: ' || p_fact_measure);
494   EXCEPTION
495     WHEN e_DynamicSqlStmtErr THEN
496       LOG(NULL, FAILED, '<-Fact: ' || p_fact_name || ', ' || 'Measure: ' || p_fact_measure);
497     WHEN OTHERS THEN
498       l_ErrorCode := SQLCODE;
499       l_ErrorText := SQLERRM;
500       l_err_info  := p_fact_measure;
501       l_fact_dim_index := p_fact_time_dim_table.FIRST;
502       LOOP
503         l_err_info := l_err_info || ', '|| p_fact_time_dim_table(l_fact_dim_index);
504         EXIT WHEN l_fact_dim_index = p_fact_time_dim_table.LAST;
505         l_fact_dim_index := p_fact_time_dim_table.NEXT(l_fact_dim_index);
506       END LOOP;
507       l_err_info := l_err_info || ' might not be defined/valid in ' || p_fact_name;
508       LOG(l_ErrorCode, l_ErrorText, l_err_info);
509       LOG(NULL, FAILED, '<-Fact: ' || p_fact_name || ', ' || 'Measure: ' || p_fact_measure);
510 END POPULATE_EDW_CALSUM4_BSC;
511 
512 FUNCTION GET_FACT_MEASURE_ID(
513   p_fact_name EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE,
514   p_measure_name EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_NAME%TYPE
515 )RETURN NUMBER IS
516   l_measure_id               EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_ID%TYPE;
517 BEGIN
518   OPEN c_factmeasure_id(p_fact_name, p_measure_name);
519   FETCH c_factmeasure_id INTO l_measure_id;
520   CLOSE c_factmeasure_id;
521   RETURN l_measure_id;
522 END GET_FACT_MEASURE_ID;
523 
524 FUNCTION GET_FACT_MEASURE(
525   p_fact_name IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE
526 )RETURN FactMeasureTable IS
527   l_measure_id               EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_ID%TYPE;
528   l_measure                  EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_NAME%TYPE;
529   l_fact_measure_table       FactMeasureTable;
530   l_fact_measure_table_count BINARY_INTEGER;
531 BEGIN
532   l_fact_measure_table_count := 0;
536     EXIT WHEN c_factmeasure%NOTFOUND;
533   OPEN c_factmeasure(p_fact_name);
534   LOOP
535     FETCH c_factmeasure INTO l_measure_id, l_measure;
537     IF (CHECK_VALIDILITY( p_fact_name, l_measure)) THEN
538       l_fact_measure_table(l_fact_measure_table_count).measure_name := l_measure;
539       l_fact_measure_table(l_fact_measure_table_count).measure_id := l_measure_id;
540       l_fact_measure_table_count := l_fact_measure_table_count + 1;
541     ELSE
542       LOG(NULL, FAILED, '  Corrupted metadata definition, ' || l_measure || ', in ' || p_fact_name);
543     END IF;
544   END LOOP;
545   CLOSE c_factmeasure;
546   RETURN l_fact_measure_table;
547 END GET_FACT_MEASURE;
548 
549 FUNCTION GET_FACT_TIME_DIM_COL(
550   p_fact_name IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE
551 )RETURN FactDimColTable IS
552   l_fact_time_dim              EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_NAME%TYPE;
553   l_fact_time_dim_table        FactDimColTable;
554   l_fact_time_dim_table_count  BINARY_INTEGER;
555 BEGIN
556   l_fact_time_dim_table_count := 0;
557   OPEN c_facttimedimcol(p_fact_name);
558   LOOP
559     FETCH c_facttimedimcol INTO l_fact_time_dim;
560     EXIT WHEN c_facttimedimcol%NOTFOUND;
561     IF (CHECK_VALIDILITY( p_fact_name, l_fact_time_dim)) THEN
562       l_fact_time_dim_table(l_fact_time_dim_table_count) := l_fact_time_dim;
563       l_fact_time_dim_table_count := l_fact_time_dim_table_count + 1;
564     ELSE
565       LOG(NULL, FAILED, '  Corrupted metadata definition, ' || l_fact_time_dim || ', in ' || p_fact_name);
566     END IF;
567   END LOOP;
568   CLOSE c_facttimedimcol;
569   RETURN l_fact_time_dim_table;
570 END GET_FACT_TIME_DIM_COL;
571 
572 
573 FUNCTION GET_FACT_NONTIME_DIM_COL(
574   p_fact_name IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE
575 )RETURN FactDimColTable IS
576   l_fact_nontime_dim              EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_NAME%TYPE;
577   l_fact_nontime_dim_table        FactDimColTable;
578   l_fact_nontime_dim_table_count  BINARY_INTEGER;
579 BEGIN
580   l_fact_nontime_dim_table_count := 0;
581   OPEN c_factnontimedimcol(p_fact_name);
582   LOOP
583     FETCH c_factnontimedimcol INTO l_fact_nontime_dim;
584     EXIT WHEN c_factnontimedimcol%NOTFOUND;
585     IF (CHECK_VALIDILITY( p_fact_name, l_fact_nontime_dim)) THEN
586       l_fact_nontime_dim_table(l_fact_nontime_dim_table_count) := l_fact_nontime_dim;
587       l_fact_nontime_dim_table_count := l_fact_nontime_dim_table_count + 1;
588     ELSE
589       LOG(NULL, FAILED, '  Corrupted metadata definition, ' || l_fact_nontime_dim || ', in ' || p_fact_name);
590     END IF;
591   END LOOP;
592   CLOSE c_factnontimedimcol;
593   RETURN l_fact_nontime_dim_table;
594 END GET_FACT_NONTIME_DIM_COL;
595 
596 /*
597 FUNCTION GET_USER_INFO
598 RETURN VARCHAR2 IS
599   l_usrname   USER_USERS.USERNAME%TYPE;
600   CURSOR c_userinfo IS
601   SELECT
602     USERNAME
603    FROM USER_USERS;
604 BEGIN
605   OPEN c_userinfo;
606   FETCH c_userinfo INTO l_usrname;
607   CLOSE c_userinfo;
608   RETURN l_usrname;
609 END GET_USER_INFO;
610 */
611 
612 FUNCTION CHECK_FACT_VALIDILITY(
613   p_fact_name          IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE
614 ) RETURN VARCHAR2 IS
615   l_object              USER_OBJECTS.OBJECT_NAME%TYPE := NULL;
616 BEGIN
617   OPEN c_factvalidity_t(p_fact_name);
618   FETCH c_factvalidity_t INTO l_object;
619   CLOSE c_factvalidity_t;
620 
621   IF (l_object IS NULL) THEN
622     LOG(NULL, FAILED, '  Table ' || p_fact_name || ' is not accessible or not defined');
623     RETURN NOTVALID;
624   ELSE
625     l_object := null;
626     OPEN c_factvalidity_s(p_fact_name);
627     FETCH c_factvalidity_s INTO l_object;
628     CLOSE c_factvalidity_s;
629     IF(l_object IS NOT NULL  )THEN
630       RETURN VALID;
631     ELSE
632       LOG(NULL, FAILED, '  No synonym defined for Table ' || p_fact_name);
633       RETURN NOSYNONYM;
634     END IF;
635   END IF;
636 END;
637 
638 PROCEDURE LOG(
639     p_code              EDW_CALSUM4_BSC_LOG.CODE%TYPE
640   , p_text              EDW_CALSUM4_BSC_LOG.TEXT%TYPE
641   , p_info              EDW_CALSUM4_BSC_LOG.INFO%TYPE
642 ) IS
643 BEGIN
644   INSERT INTO EDW_CALSUM4_BSC_LOG(CODE, TEXT, INFO, LAST_UPDATE_DATE, CREATION_DATE)
645     VALUES(p_code, p_text, p_info, SYSDATE, SYSDATE);
646   COMMIT;
647 END LOG;
648 
649 
650 FUNCTION GET_SQL_STMT(
651   p_fact_id                IN EDW_FACT_ATTRIBUTES_MD_V.FACT_ID%TYPE,
652   p_fact_name              IN EDW_FACT_ATTRIBUTES_MD_V.FACT_NAME%TYPE,
653   p_fact_time_dim_table    IN FactDimColTable,
654   p_fact_nontime_dim_table IN FactDimColTable,
655   p_fact_measure           IN EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_NAME%TYPE,
656   p_fact_measure_id        IN EDW_FACT_ATTRIBUTES_MD_V.ATTRIBUTE_ID%TYPE,
657   p_hier                   IN VARCHAR
658 ) RETURN VARCHAR2 IS
659   l_calsum_stmt_psudo         VARCHAR2(1000)  := NULL;
660   l_calsum_stmt               VARCHAR2(30000) := NULL;
661   l_calsum_stmt_tmp           VARCHAR2(4000)  := NULL;
662   l_calsum_fromwhere_clause   VARCHAR2(30000) := NULL;
663   l_ErrorCode       EDW_CALSUM4_BSC_LOG.CODE%TYPE;
664   l_ErrorText       EDW_CALSUM4_BSC_LOG.TEXT%TYPE;
665   l_err_info        EDW_CALSUM4_BSC_LOG.INFO%TYPE;
669 
666   l_fact_dim_index  BINARY_INTEGER;
667   l_start           BINARY_INTEGER;
668 BEGIN
670   LOG(NULL, SCRIPTING, '-->Statement generating for ' || p_hier );
671   l_calsum_fromwhere_clause :=
672   ' FROM '|| p_fact_name  || ' FACT, '||
673   '  EDW_TIME_M DIM '||
674   'WHERE '||
675   'FACT.'||p_fact_measure || ' IS NOT NULL ' ||
676   'AND DIM.CDAY_CAL_DAY_PK_KEY != 0 ' ||
677   'AND ( DIM.CDAY_CAL_DAY_PK_KEY = FACT.';
678 
679   l_fact_dim_index := p_fact_time_dim_table.FIRST;
680   l_start := p_fact_time_dim_table.FIRST;
681   LOOP
682     IF(l_fact_dim_index = l_start) THEN
683       l_calsum_fromwhere_clause := l_calsum_fromwhere_clause || p_fact_time_dim_table(l_fact_dim_index);
684     ELSE
685       l_calsum_fromwhere_clause := l_calsum_fromwhere_clause ||
686       ' OR DIM.CDAY_CAL_DAY_PK_KEY = FACT.' || p_fact_time_dim_table(l_fact_dim_index);
687     END IF;
688     EXIT WHEN l_fact_dim_index = p_fact_time_dim_table.LAST;
689     l_fact_dim_index := p_fact_time_dim_table.NEXT(l_fact_dim_index);
690   END LOOP;
691   l_calsum_fromwhere_clause := l_calsum_fromwhere_clause || ' )';
692 
693   IF (p_fact_nontime_dim_table.COUNT > 0 ) THEN
694     l_calsum_fromwhere_clause := l_calsum_fromwhere_clause || ' AND (';
695   END IF;
696 
697   l_fact_dim_index := p_fact_nontime_dim_table.FIRST;
698   l_start := p_fact_nontime_dim_table.FIRST;
699   LOOP
700     IF(l_fact_dim_index = l_start ) THEN
701       l_calsum_fromwhere_clause := l_calsum_fromwhere_clause || ' FACT. ' || p_fact_nontime_dim_table(l_fact_dim_index) || ' <> 0 ';
702     ELSE
703       l_calsum_fromwhere_clause := l_calsum_fromwhere_clause || ' OR FACT. ' || p_fact_nontime_dim_table(l_fact_dim_index) || ' <> 0 ';
704     END IF;
705     EXIT WHEN l_fact_dim_index = p_fact_nontime_dim_table.LAST;
706     l_fact_dim_index := p_fact_nontime_dim_table.NEXT(l_fact_dim_index);
707   END LOOP;
708   l_calsum_fromwhere_clause := l_calsum_fromwhere_clause || ' )';
709 
710   l_calsum_stmt_psudo := ' ''' || p_fact_name || ''', '  || p_fact_id || ', '''|| p_fact_measure || ''', ' || p_fact_measure_id || ', ';
711 
712   l_calsum_stmt_tmp :=
713     'INSERT INTO EDW_CALSUM4_BSC(FACT, FACT_ID, MEASURE, MEASURE_ID, TIMEHIER, HIERID, CALSUMMARY, CALSUM_ID, LAST_UPDATE_DATE, CREATION_DATE) ';
714   l_calsum_stmt := l_calsum_stmt_tmp;
715 
716   IF(p_hier = '445') THEN
717     l_calsum_stmt_tmp :=
718     'SELECT DISTINCT'
719     || l_calsum_stmt_psudo
720     || '''445'''        || ', '
721     || GET_TIME_HIER_ID('TIME45')
722     || ', DIM.P445_NAME '
723     || ', DIM.P445_PERIOD_445_PK_KEY, SYSDATE, SYSDATE'
724     || l_calsum_fromwhere_clause
725     || ' AND DIM.P445_PERIOD_445_PK_KEY IS NOT NULL'
726     || ' AND DIM.P445_PERIOD_445_PK_KEY != 0 '
727     || ' AND DIM.P445_PERIOD_445_PK_KEY != -1 ';
728     l_calsum_stmt := l_calsum_stmt || l_calsum_stmt_tmp;
729   ELSIF (p_hier = 'PA') THEN
730     l_calsum_stmt_tmp :=
731     'SELECT DISTINCT'
732     || l_calsum_stmt_psudo
733     || '''PA'''         || ', '
734     || GET_TIME_HIER_ID('TIMEPA')
735     || ', DIM.CNAM_CAL_NAME '
736     || ', DIM.CNAM_CAL_NAME_PK_KEY  , SYSDATE, SYSDATE'
737     || l_calsum_fromwhere_clause
738     || ' AND DIM.PPER_PA_PERIOD_PK_KEY IS NOT NULL'
739     || ' AND DIM.CNAM_CAL_NAME_PK_KEY IS NOT NULL'
740     || ' AND DIM.CNAM_CAL_NAME_PK_KEY != 0 '
741     || ' AND DIM.CNAM_CAL_NAME_PK_KEY != -1 ';
742     l_calsum_stmt := l_calsum_stmt || l_calsum_stmt_tmp;
743   ELSIF (p_hier = 'GL') THEN
744     l_calsum_stmt_tmp :=
745     'SELECT DISTINCT'
746     || l_calsum_stmt_psudo
747     || '''GL'''         || ', '
748     || GET_TIME_HIER_ID('TIMEGL')
749     || ', DIM.CNAM_CAL_NAME '
750     || ', DIM.CNAM_CAL_NAME_PK_KEY  , SYSDATE, SYSDATE'
751     || l_calsum_fromwhere_clause
752     || ' AND DIM.CNAM_CAL_NAME_PK_KEY IS NOT NULL'
753     || ' AND DIM.CNAM_CAL_NAME_PK_KEY != 0 '
754     || ' AND DIM.CNAM_CAL_NAME_PK_KEY != -1 ';
755     l_calsum_stmt := l_calsum_stmt || l_calsum_stmt_tmp;
756   ELSIF (p_hier = 'GREGERION') THEN
757     l_calsum_stmt_tmp :=
758     'SELECT DISTINCT'
759     || l_calsum_stmt_psudo
760     || '''GREGERION'''  || ', '
761     || GET_TIME_HIER_ID('TIMEGR')
762     || ', DIM.YEAR_NAME '
763     || ', DIM.YEAR_YEAR_PK_KEY , SYSDATE, SYSDATE'
764     || l_calsum_fromwhere_clause
765     || ' AND DIM.YEAR_YEAR_PK_KEY IS NOT NULL'
766     || ' AND DIM.YEAR_YEAR_PK_KEY != 0 '
767     || ' AND DIM.YEAR_YEAR_PK_KEY != -1 ';
768     l_calsum_stmt := l_calsum_stmt || l_calsum_stmt_tmp;
769   ELSIF (p_hier = 'ENTERPRISE') THEN
770     l_calsum_stmt_tmp :=
771     'SELECT DISTINCT'
772     || l_calsum_stmt_psudo
773     || '''ENTERPRISE''' || ', '
774     || GET_TIME_HIER_ID('TIMEEP')
775     || ', DIM.ECNM_CAL_NAME '
776     || ', DIM.ECNM_CAL_NAME_PK_KEY  , SYSDATE, SYSDATE'
777     || l_calsum_fromwhere_clause
778     || ' AND DIM.ECNM_CAL_NAME_PK_KEY IS NOT NULL'
779     || ' AND DIM.ECNM_CAL_NAME_PK_KEY != 0 '
780     || ' AND DIM.ECNM_CAL_NAME_PK_KEY != -1 ';
781     l_calsum_stmt := l_calsum_stmt || l_calsum_stmt_tmp;
782   END IF;
783   LOG(NULL, DEBUG, '---->' || l_calsum_stmt);
784   LOG(NULL, SCRIPTED, '<--Statement generated for ' || p_hier );
785   RETURN l_calsum_stmt;
786   EXCEPTION
787     WHEN OTHERS THEN
788       l_ErrorCode := SQLCODE;
792       LOOP
789       l_ErrorText := SQLERRM;
790       l_err_info  := 'Error happened when scripting for ' || p_fact_measure || ' and ' || p_hier ;
791       l_fact_dim_index := p_fact_time_dim_table.FIRST;
793         l_err_info := l_err_info || ', '|| p_fact_time_dim_table(l_fact_dim_index);
794         EXIT WHEN l_fact_dim_index = p_fact_time_dim_table.LAST;
795         l_fact_dim_index := p_fact_time_dim_table.NEXT(l_fact_dim_index);
796       END LOOP;
797       l_err_info := l_err_info || ' in ' || p_fact_name;
798       LOG(l_ErrorCode, l_ErrorText, l_err_info);
799       LOG(NULL, FAILED, '<-Statement generating failed for Fact: ' || p_fact_name || ', ' || ' Measure: ' || p_fact_measure || ', Hier: ' || p_hier);
800       RAISE e_DynamicSqlStmtErr;
801 END GET_SQL_STMT;
802 
803 
804 FUNCTION CHECK_VALIDILITY(
805   p_tbl_name ALL_TAB_COLUMNS.TABLE_NAME%TYPE ,
806   p_col_name ALL_TAB_COLUMNS.COLUMN_NAME%TYPE)
807 RETURN BOOLEAN IS
808   l_count    NUMBER;
809 BEGIN
810   OPEN c_att_validity( p_tbl_name , p_col_name);
811   FETCH c_att_validity INTO l_count;
812   CLOSE c_att_validity;
813   IF(l_count =1 ) THEN
814     RETURN TRUE;
815   ELSE
816     RETURN FALSE;
817   END IF;
818 END CHECK_VALIDILITY;
819 
820 FUNCTION GET_DIM_ID(
821   p_object_name EDW_DIMENSIONS_MD_V.DIM_NAME%TYPE
822 ) RETURN EDW_DIMENSIONS_MD_V.DIM_ID%TYPE
823 IS
824   l_id   EDW_DIMENSIONS_MD_V.DIM_ID%TYPE;
825 BEGIN
826   OPEN dim_id(p_object_name);
827   FETCH dim_id INTO l_id;
828   CLOSE dim_id;
829   RETURN l_id;
830 END GET_DIM_ID;
831 
832 FUNCTION GET_TIME_ID
833 RETURN EDW_DIMENSIONS_MD_V.DIM_ID%TYPE
834 IS
835 BEGIN
836   IF (v_time_dimension_id IS NULL) THEN
837     v_time_dimension_id := GET_DIM_ID('EDW_TIME_M');
838   END IF;
839   RETURN v_time_dimension_id;
840 END GET_TIME_ID;
841 
842 PROCEDURE INITIALIZE IS
843 BEGIN
844   LOG(NULL, STARTED, 'Initializing, EDW_TIME_ID: ' || GET_TIME_ID);
845 END;
846 
847 PROCEDURE FINALIZE IS
848 BEGIN
849   LOG(NULL, DONE, 'EDW_CALSUM4_BSC table was populated successfully!');
850 END;
851 
852 FUNCTION GET_FACT_ID(
853    p_fact_name IN EDW_FACTS_MD_V.FACT_NAME%TYPE
854 ) RETURN EDW_FACTS_MD_V.FACT_ID%TYPE IS
855 BEGIN
856   IF(v_fact_name IS NULL OR  v_fact_name <> p_fact_name) THEN
857     v_fact_name := p_fact_name;
858     OPEN c_factid(p_fact_name);
859     FETCH c_factid INTO v_fact_id;
860     CLOSE c_factid;
861   END IF;
862   RETURN v_fact_id;
863 END GET_FACT_ID;
864 
865 
866 FUNCTION GET_TIME_HIER_ID(
867   p_hier_prefix          IN EDW_HIERARCHIES_MD_V.HIER_PREFIX%TYPE
868 ) RETURN NUMBER IS
869 BEGIN
870   IF p_hier_prefix = 'TIME45' THEN
871     IF v_445_id IS NOT NULL THEN
872       RETURN v_445_id;
873     ELSE
874       v_445_id := GET_HIER_ID('TIME45');
875       RETURN v_445_id;
876     END IF;
877   ELSIF p_hier_prefix = 'TIMEGL' THEN
878     IF v_gl_id IS NOT NULL THEN
879       RETURN v_gl_id;
880     ELSE
881       v_gl_id := GET_HIER_ID('TIMEGL');
882       RETURN v_gl_id;
883     END IF;
884   ELSIF p_hier_prefix = 'TIMEPA' THEN
885     IF v_pa_id IS NOT NULL THEN
886       RETURN v_pa_id;
887     ELSE
888       v_pa_id := GET_HIER_ID('TIMEPA');
889       RETURN v_pa_id;
890     END IF;
891   ELSIF p_hier_prefix = 'TIMEEP' THEN
892     IF v_enterprise_id IS NOT NULL THEN
893       RETURN v_enterprise_id;
894     ELSE
895       v_enterprise_id := GET_HIER_ID('TIMEEP');
896       RETURN v_enterprise_id;
897     END IF;
898   ELSIF p_hier_prefix = 'TIMEGR' THEN
899     IF v_gregerion_id IS NOT NULL THEN
900       RETURN v_gregerion_id;
901     ELSE
902       v_gregerion_id := GET_HIER_ID('TIMEGR');
903       RETURN v_gregerion_id;
904     END IF;
905   END IF;
906 END GET_TIME_HIER_ID;
907 
908 
909 FUNCTION GET_HIER_ID(
910   p_hier_prefix          IN EDW_HIERARCHIES_MD_V.HIER_PREFIX%TYPE
911 ) RETURN NUMBER IS
912   l_hier_id    EDW_HIERARCHIES_MD_V.HIER_ID%TYPE;
913 BEGIN
914   OPEN c_time_hier_id(p_hier_prefix);
915   FETCH c_time_hier_id INTO l_hier_id;
916   CLOSE c_time_hier_id;
917   RETURN l_hier_id;
918 END GET_HIER_ID;
919 
920 FUNCTION GET_LOWEST_LEVEL(
921     p_dim  IN EDW_DIMENSIONS_MD_V.DIM_NAME%TYPE
922 ) RETURN VARCHAR2 IS
923   l_level_name EDW_DIMENSIONS_MD_V.DIM_NAME%TYPE;
924 BEGIN
925   select level_name into l_level_name
926   from edw_levels_md_v lvl
927   where dim_name = p_dim
928   and not exists(
929   select 1 from
930     edw_hierarchy_level_md_v hier
931   where
932        hier.dim_name = lvl.dim_name
933   and  hier.parent_lvl_id = lvl.level_id);
934 
935   RETURN l_level_name;
936 END GET_LOWEST_LEVEL;
937 
938 FUNCTION GET_LOWEST_LEVEL(
939   p_dim_id IN NUMBER
940 ) RETURN VARCHAR2 IS
941   l_level_name EDW_LEVELS_MD_V.LEVEL_NAME%TYPE;
942 BEGIN
943   select level_name into l_level_name
944   from edw_levels_md_v lvl
945   where dim_id = p_dim_id
946   and not exists(
947   select 1 from
948     edw_hierarchy_level_md_v hier
949   where
950        hier.dim_name = lvl.dim_name
951   and  hier.parent_lvl_id = lvl.level_id);
952 
953   RETURN l_level_name;
954 END GET_LOWEST_LEVEL;
955 
956 
957 
958 
959 END EDW_BSC_BRIDGE;