DBA Data[Home] [Help]

PACKAGE BODY: APPS.ENI_DENORM_HRCHY

Source


1 PACKAGE BODY ENI_DENORM_HRCHY AS
2 /* $Header: ENIDENHB.pls 120.5 2011/06/27 22:31:19 sreharih ship $  */
3 
4   g_func_area_id  NUMBER := 11;  -- Variable To Hold Functional Area For Product Functional Area
5   g_catset_id     NUMBER := ENI_DENORM_HRCHY.GET_CATEGORY_SET_ID;  -- Variable To Hold Product Catalog Category Set
6   g_tab_schema    VARCHAR2(20) := 'ENI';
7 
8 -- This Public Function will return the Default Category Set Associated with
9 -- Product Reporting Functional Area
10 FUNCTION GET_CATEGORY_SET_ID RETURN NUMBER IS
11  l_catset_id  NUMBER;
12 BEGIN
13   SELECT CATEGORY_SET_ID INTO l_catset_id
14   FROM MTL_DEFAULT_CATEGORY_SETS
15   WHERE FUNCTIONAL_AREA_ID = g_func_area_id;
16 
17   RETURN l_catset_id;
18 EXCEPTION
19   WHEN NO_DATA_FOUND THEN
20     RETURN NULL;
21   WHEN OTHERS THEN
22     RAISE;
23 END GET_CATEGORY_SET_ID;
24 
25 -- This is a Private function, which will return 'Y', if DBI is installed, else 'N'
26 FUNCTION IS_DBI_INSTALLED RETURN VARCHAR2 IS
27   l_count NUMBER;
28 BEGIN
29   SELECT 1 INTO l_count
30   FROM ALL_OBJECTS
31   WHERE OBJECT_NAME = 'ENI_OLTP_ITEM_STAR'
32     AND OBJECT_TYPE = 'TABLE'
33     AND OWNER = g_tab_schema;
34 
35   RETURN 'Y';
36 EXCEPTION WHEN NO_DATA_FOUND THEN
37   RETURN 'N';
38 END IS_DBI_INSTALLED;
39 
40 -- ER: 3154516
41 -- This Public Function will return the last updated date for Product Catalog from de-norm table
42 FUNCTION GET_LAST_CATALOG_UPDATE_DATE RETURN DATE IS
43   l_date DATE;
44 BEGIN
45   SELECT MAX(LAST_UPDATE_DATE) INTO l_date
46   FROM ENI_DENORM_HIERARCHIES
47   WHERE OBJECT_ID = g_catset_id
48     AND OBJECT_TYPE = 'CATEGORY_SET';
49 
50   RETURN l_date;
51 END GET_LAST_CATALOG_UPDATE_DATE;
52 
53 -- This Public Procedure is used to insert records in the Staging Table
54 -- The staging table will be used in the Incremental Load of Denorm Table.
55 -- All the deleted/modified/new records in the Product Catalog Hierarchy has to be
56 -- there in the Staging table, which has to be done by calling this procedure.
57 PROCEDURE INSERT_INTO_STAGING(
58       p_object_type     IN VARCHAR2,
59       p_object_id       IN NUMBER,
60       p_child_id        IN NUMBER,
61       p_parent_id       IN NUMBER,
62       p_mode_flag       IN VARCHAR2,
63       x_return_status   OUT NOCOPY VARCHAR2,
64       x_msg_count       OUT NOCOPY NUMBER,
65       x_msg_data        OUT NOCOPY VARCHAR2,
66       p_language_code   IN VARCHAR2 DEFAULT NULL) IS
67 
68   l_language_code VARCHAR2(4);
69   l_count NUMBER;
70 BEGIN
71 -- validating parameters bug 3134719
72   IF p_mode_flag NOT IN ('A', 'M', 'D', 'C', 'S', 'E') THEN
73     x_return_status := 'E';
74     IF FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
75       FND_MSG_PUB.ADD_EXC_MSG('ENI_DENORM_HRCHY', 'INSERT_INTO_STAGING', 'Invalid Mode Flag');
76     END IF;
77     FND_MSG_PUB.COUNT_AND_GET( P_COUNT => x_msg_count, P_DATA => x_msg_data);
78     RETURN;
79   END IF;
80 
81   IF p_object_type <> 'CATEGORY_SET' THEN
82     x_return_status := 'E';
83     IF FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
84       FND_MSG_PUB.ADD_EXC_MSG('ENI_DENORM_HRCHY', 'INSERT_INTO_STAGING', 'Invalid Object Type. Must be CATEGORY_SET');
85     END IF;
86     FND_MSG_PUB.COUNT_AND_GET( P_COUNT => x_msg_count, P_DATA => x_msg_data);
87     RETURN;
88   END IF;
89 
90   IF p_object_id IS NULL THEN
91     x_return_status := 'E';
92     IF FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
93       FND_MSG_PUB.ADD_EXC_MSG('ENI_DENORM_HRCHY', 'INSERT_INTO_STAGING', 'Object ID can not be NULL.');
94     END IF;
95     FND_MSG_PUB.COUNT_AND_GET( P_COUNT => x_msg_count, P_DATA => x_msg_data);
96     RETURN;
97   END IF;
98 
99   IF p_child_id IS NULL THEN
100     x_return_status := 'E';
101     IF FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
102       FND_MSG_PUB.ADD_EXC_MSG('ENI_DENORM_HRCHY', 'INSERT_INTO_STAGING', 'Child Category ID can not be NULL.');
103     END IF;
104     FND_MSG_PUB.COUNT_AND_GET( P_COUNT => x_msg_count, P_DATA => x_msg_data);
105     RETURN;
106   END IF;
107 
108 -- for sales and marketing enhancement
109 -- if changes in description, skip flag, effective date then inserting separate record
110   IF p_mode_flag IN ('A', 'M', 'D') THEN
111     UPDATE ENI_DENORM_HRCHY_STG
112     SET PARENT_ID = p_parent_id,
113         MODE_FLAG = DECODE(p_mode_flag, 'A', DECODE(MODE_FLAG, 'D', 'M', 'A'), p_mode_flag)
114     WHERE OBJECT_TYPE = p_object_type
115       AND OBJECT_ID = p_object_id
116       AND CHILD_ID = p_child_id
117       AND BATCH_FLAG = 'NEXT_BATCH';
118 
119     IF SQL%NOTFOUND THEN
120       INSERT INTO ENI_DENORM_HRCHY_STG (
121         OBJECT_TYPE,
122         OBJECT_ID,
123         CHILD_ID,
124         PARENT_ID,
125         MODE_FLAG,
126         BATCH_FLAG)
127       VALUES (
128         p_object_type,
129         p_object_id,
130         p_child_id,
131         p_parent_id,
132         p_mode_flag,
133         'NEXT_BATCH');
134     END IF;
135   ELSIF p_mode_flag IN ('S', 'U', 'E') THEN
136   -- S - EXCLUDE_USER_VIEW column set to 'Y'
137   -- U - EXCLUDE_USER_VIEW column set to 'N'
138   -- E - Change in DISABLE_DATE column of a category
139   -- mode flag value 'S' will override the values 'C', 'E'
143         MODE_FLAG = DECODE(MODE_FLAG, 'S', DECODE(p_mode_flag, 'E', 'S', 'S', 'U', p_mode_flag),
140   -- if mode flag 'S' is sent twice, we will toggle mode flag to 'S', 'U'
141     UPDATE ENI_DENORM_HRCHY_STG
142     SET PARENT_ID = p_parent_id,
144                                       'U', DECODE(p_mode_flag, 'E', 'U', 'S', 'S', p_mode_flag), p_mode_flag)
145     WHERE OBJECT_TYPE = p_object_type
146       AND OBJECT_ID = p_object_id
147       AND CHILD_ID = p_child_id
148       AND MODE_FLAG IN ('S', 'U', 'E', 'C')
149       AND BATCH_FLAG = 'NEXT_BATCH';
150 
151     IF SQL%NOTFOUND THEN
152       INSERT INTO ENI_DENORM_HRCHY_STG (
153         OBJECT_TYPE,
154         OBJECT_ID,
155         CHILD_ID,
156         PARENT_ID,
157         MODE_FLAG,
158         BATCH_FLAG)
159       VALUES (
160         p_object_type,
161         p_object_id,
162         p_child_id,
163         p_parent_id,
164         p_mode_flag,
165         'NEXT_BATCH');
166     END IF;
167   ELSIF p_mode_flag = 'C' THEN
168   -- C - change in Category Description
169   -- mode flag 'C' can only override itself. i.e. if mode flag is already 'S', 'E' then no changes in mode flag
170   -- if more than one record's source_lang is = language code then language code will be updated to NULL.
171   -- this is because actually more than one record is updated for description in this case
172   -- also if user updates the description of same category in more than one language
173   -- then the language code will be updated to NULL.
174     IF p_language_code IS NOT NULL THEN
175       BEGIN
176         SELECT 1 INTO l_count
177         FROM MTL_CATEGORIES_TL
178         WHERE CATEGORY_ID = p_child_id
179           AND SOURCE_LANG = p_language_code;
180 
181         l_language_code := p_language_code;
182       EXCEPTION
183         WHEN TOO_MANY_ROWS THEN
184           l_language_code := NULL;
185         WHEN NO_DATA_FOUND THEN
186           x_return_status := 'E';
187           IF FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
188             FND_MSG_PUB.ADD_EXC_MSG('ENI_DENORM_HRCHY', 'INSERT_INTO_STAGING', 'Invalid Category ID, Language combination');
189           END IF;
190           FND_MSG_PUB.COUNT_AND_GET( P_COUNT => x_msg_count, P_DATA => x_msg_data);
191           RETURN;
192       END;
193     ELSE
194       -- Selecting userenv('LANG') into language code based on
195       -- the discussion with Wasi and advised by him.
196 
197       select userenv('LANG') into l_language_code from dual;
198     END IF;
199 
200     UPDATE ENI_DENORM_HRCHY_STG
201     SET PARENT_ID = p_parent_id,
202         MODE_FLAG = DECODE(MODE_FLAG, 'S', 'S', 'U', 'U', 'E', 'E', p_mode_flag),
203         LANGUAGE_CODE = DECODE(MODE_FLAG, 'C', DECODE(LANGUAGE_CODE, l_language_code, l_language_code, NULL), NULL)
204     WHERE OBJECT_TYPE = p_object_type
205       AND OBJECT_ID = p_object_id
206       AND CHILD_ID = p_child_id
207       AND MODE_FLAG IN ('S', 'U', 'E', 'C')
208       AND BATCH_FLAG = 'NEXT_BATCH';
209 
210     IF SQL%NOTFOUND THEN
211       INSERT INTO ENI_DENORM_HRCHY_STG (
212         OBJECT_TYPE,
213         OBJECT_ID,
214         CHILD_ID,
215         PARENT_ID,
216         MODE_FLAG,
217         BATCH_FLAG,
218         LANGUAGE_CODE)
219       VALUES (
220         p_object_type,
221         p_object_id,
222         p_child_id,
223         p_parent_id,
224         p_mode_flag,
225         'NEXT_BATCH',
226         l_language_code);
227     END IF;
228   END IF;
229 
230   x_return_status := 'S';
231   x_msg_count := 0;
232   x_msg_data := null;
233 EXCEPTION WHEN OTHERS THEN
234   x_return_status := 'U';
235   IF FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
236     FND_MSG_PUB.ADD_EXC_MSG('ENI_DENORM_HRCHY', 'INSERT_INTO_STAGING', SQLERRM);
237   END IF;
238   FND_MSG_PUB.COUNT_AND_GET( P_COUNT => x_msg_count, P_DATA => x_msg_data);
239 END INSERT_INTO_STAGING;
240 
241 -- for sales and marketing enhancement
242 -- This procedure loads the denorm parents table
243 -- this procedure is called from the main procedure if sales and marketing is installed.
244 PROCEDURE LOAD_DENORM_PARENTS_PROD_HRCHY(errbuf OUT NOCOPY VARCHAR2, retcode OUT NOCOPY VARCHAR2) IS
245   CURSOR C1 IS
246     SELECT TL.LANGUAGE_CODE, C.CATEGORY_ID, B.DISABLE_DATE
247     FROM MTL_CATEGORY_SET_VALID_CATS C, MTL_CATEGORIES_B B, FND_LANGUAGES TL
248     WHERE C.CATEGORY_SET_ID = g_catset_id
249       AND TL.INSTALLED_FLAG IN ('I', 'B')
250       AND B.CATEGORY_ID = C.CATEGORY_ID
251       AND NOT EXISTS (SELECT NULL FROM EGO_PROD_CAT_SALES_MARKET_AGV A
252                       WHERE A.CATEGORY_SET_ID = g_catset_id
253                       AND A.CATEGORY_ID = C.CATEGORY_ID
254                       AND NVL(A.EXCLUDE_USER_VIEW, 'N') = 'Y');
255 
256   CURSOR C3(l_child_id NUMBER, l_language VARCHAR2) IS
257     SELECT TL.DESCRIPTION CHILD_DESC, C.CATEGORY_ID CHILD_ID
258     FROM MTL_CATEGORIES_TL TL,
259       (SELECT
260          CATEGORY_ID, LEVEL hrchy
261        FROM MTL_CATEGORY_SET_VALID_CATS
262        START WITH CATEGORY_ID = l_child_id AND CATEGORY_SET_ID = g_catset_id
263        CONNECT BY PRIOR PARENT_CATEGORY_ID = CATEGORY_ID AND CATEGORY_SET_ID = g_catset_id) C
264     WHERE C.CATEGORY_ID = TL.CATEGORY_ID
265       AND TL.LANGUAGE = l_language
266       AND NOT EXISTS (SELECT NULL FROM EGO_PROD_CAT_SALES_MARKET_AGV A
267                       WHERE A.CATEGORY_SET_ID = g_catset_id
268                       AND A.CATEGORY_ID = C.CATEGORY_ID
269                       AND NVL(A.EXCLUDE_USER_VIEW, 'N') = 'Y')
270 		      ORDER BY hrchy ASC; -- Bug 4749088
271 
272   l_concat_desc VARCHAR2(4001);
273   l_desc        VARCHAR2(240);
274   l_attr_grp_id NUMBER;
275   l_eff_level   NUMBER;
279 
276   l_imm_par_id  NUMBER;
277   l_length      NUMBER;
278   l_count       NUMBER;
280   l_user_id          NUMBER := FND_GLOBAL.USER_ID;
281   l_conc_request_id  NUMBER := FND_GLOBAL.CONC_REQUEST_ID;
282   l_prog_appl_id     NUMBER := FND_GLOBAL.PROG_APPL_ID;
283   l_conc_program_id  NUMBER := FND_GLOBAL.CONC_PROGRAM_ID;
284 
285 BEGIN
286   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Initial Load of Denorm Hierarchy Parents table begining');
287   FND_FILE.PUT_LINE(FND_FILE.LOG, ' ');
288   -- getting attribute group id for sales and marketing
289   -- this id will be inserted into the denorm hrchy parents table
290   BEGIN
291     SELECT ATTR_GROUP_ID INTO l_attr_grp_id
292     FROM EGO_FND_DSC_FLX_CTX_EXT
293     WHERE APPLICATION_ID = 431
294       AND DESCRIPTIVE_FLEXFIELD_NAME = 'EGO_PRODUCT_CATEGORY_SET'
295       AND DESCRIPTIVE_FLEX_CONTEXT_CODE = 'SalesAndMarketing';
296   EXCEPTION
297     WHEN NO_DATA_FOUND THEN
298     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Error: Attribute Group not found for Sales and Marketing');
299     RAISE;
300   END;
301 
302   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Deleting Denorm Hierarchy Parents table');
303   DELETE ENI_DENORM_HRCHY_PARENTS;
304 
305   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Populating Denorm Hierarchy Parents table');
306   -- for each language installed and each category in hierarchy
307   l_count := 0;
308   FOR i IN C1 LOOP
309     -- initializing all variables
310     l_concat_desc := NULL;
311     l_desc := NULL;
312     l_eff_level := 0;
313     l_imm_par_id := null;
314     l_length := 0;
315 
316     -- for each node in the hierarchy upto the top_node
317     -- preparing the concatenated descriptions
318     FOR k IN C3(i.CATEGORY_ID, i.LANGUAGE_CODE) LOOP
319       -- to trim from the start of the string onwards to accommodate more descriptions towards the end of the string.
320       -- trim upto 4000 chars
321       l_length := LENGTH(k.CHILD_DESC || '/' || l_concat_desc);
322 
323       IF l_length > 4001 THEN
324         l_length := -4001;
325       ELSE
326         l_length := 0;
327       END IF;
328 
329       -- concatenating the descriptions
330       l_concat_desc := SUBSTR(k.CHILD_DESC || '/' || l_concat_desc, l_length, 4001);
331       -- incrementing the effective level
332       l_eff_level := l_eff_level + 1;
333 
334       IF i.CATEGORY_ID = k.CHILD_ID THEN
335         l_desc := k.CHILD_DESC;
336       ELSIF l_imm_par_id IS NULL THEN
337         l_imm_par_id := k.CHILD_ID;
338       END IF;
339     END LOOP;
340 
341     INSERT INTO ENI_DENORM_HRCHY_PARENTS (
342       OBJECT_TYPE,
343       OBJECT_ID,
344       ATTRIBUTE_GROUP_ID,
345       CATEGORY_ID,
346       LANGUAGE,
347       CATEGORY_DESC,
348       CONCAT_CAT_PARENTAGE,
349       CATEGORY_LEVEL_NUM,
350       DISABLE_DATE,
351       CATEGORY_PARENT_ID,
352       CREATED_BY,
353       CREATION_DATE,
354       LAST_UPDATED_BY,
355       LAST_UPDATE_DATE,
356       LAST_UPDATE_LOGIN,
357       REQUEST_ID,
358       PROGRAM_APPLICATION_ID,
359       PROGRAM_UPDATE_DATE,
360       PROGRAM_ID)
361     VALUES (
362       'CATEGORY_SET',
363       g_catset_id,
364       l_attr_grp_id,
365       i.CATEGORY_ID,
366       i.LANGUAGE_CODE,
367       l_desc,
368       RTRIM(l_concat_desc, '/'),
369       l_eff_level,
370       i.DISABLE_DATE,
371       l_imm_par_id,
372       l_user_id,
373       SYSDATE,
374       l_user_id,
375       SYSDATE,
376       l_user_id,
377       l_conc_request_id,
378       l_prog_appl_id,
379       SYSDATE,
380       l_conc_program_id);
381 
382     l_count := l_count + 1;
383   END LOOP;
384 
385   FND_FILE.PUT_LINE(FND_FILE.LOG, l_count||' records inserted into Denorm Hierarchy Parents table.');
386 
387   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Gathering statistics on table: ENI_DENORM_HRCHY_PARENTS ');
388   FND_STATS.gather_table_stats (ownname=>'ENI', tabname=>'ENI_DENORM_HRCHY_PARENTS');
389 
390   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Initial Load of Denorm Hierarchy Parents table Complete.');
391 EXCEPTION
392    WHEN  NO_DATA_FOUND THEN
393       FND_FILE.PUT_LINE(FND_FILE.LOG, 'Error: No Data Found. Transaction will be rolled back');
394       errbuf := 'No data found ' || sqlerrm;
395       retcode := 2;
396       ROLLBACK;
397       RAISE;
398    WHEN OTHERS THEN
399      if( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
400       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, 'ENI_DENORM_HRCHY.LOAD_DENORM_PARENTS_PROD_HRCHY', 'Error: ' ||
401                                                   sqlerrm || ' .Transaction will be rolled back');
402      end if;
403       errbuf := 'Error :' || sqlerrm;
404       retcode := 2;
405       ROLLBACK;
406       RAISE;
407 END LOAD_DENORM_PARENTS_PROD_HRCHY;
408 
409 -- for sales and marketing enhancement
410 -- incremental load of denorm hierarchy parents table
411 -- this procedure is called from the incremental load of denorm table procedure only if
412 -- sales and marketing is installed
413 PROCEDURE SYNC_DENORM_PARENTS_PROD_HRCHY(errbuf OUT NOCOPY VARCHAR2, retcode OUT NOCOPY VARCHAR2) IS
414   CURSOR C1 IS
415     SELECT TL.LANGUAGE_CODE, S.CHILD_ID, S.MODE_FLAG, S.LANGUAGE_CODE STG_LANG
416     FROM ENI_DENORM_HRCHY_STG S, FND_LANGUAGES TL
417     WHERE S.OBJECT_ID = g_catset_id
418       AND S.OBJECT_TYPE = 'CATEGORY_SET'
419       AND TL.INSTALLED_FLAG IN ('I', 'B')
420       AND S.MODE_FLAG <> 'D'
421       AND S.BATCH_FLAG <> 'NEXT_BATCH';
422 
423   CURSOR C2(p_child NUMBER) IS
424     SELECT D.CATEGORY_ID, B.DISABLE_DATE FROM
425       (SELECT C.CATEGORY_ID
426        FROM MTL_CATEGORY_SET_VALID_CATS C
430                            AND NVL(A.EXCLUDE_USER_VIEW, 'N') = 'Y')
427        WHERE NOT EXISTS (SELECT NULL FROM EGO_PROD_CAT_SALES_MARKET_AGV A
428                          WHERE A.CATEGORY_SET_ID = g_catset_id
429                            AND A.CATEGORY_ID = C.CATEGORY_ID
431        START WITH CATEGORY_ID = p_child AND CATEGORY_SET_ID = g_catset_id
432        CONNECT BY PARENT_CATEGORY_ID = PRIOR CATEGORY_ID AND CATEGORY_SET_ID = g_catset_id) D, MTL_CATEGORIES_B B
433     WHERE B.CATEGORY_ID = D.CATEGORY_ID;
434 
435   CURSOR C3(l_child_id NUMBER, l_language VARCHAR2) IS
436     SELECT TL.DESCRIPTION CHILD_DESC, C.CATEGORY_ID CHILD_ID
437     FROM MTL_CATEGORIES_TL TL,
438       (SELECT
439         CATEGORY_ID, LEVEL hrchy
440        FROM MTL_CATEGORY_SET_VALID_CATS
441        START WITH CATEGORY_ID = l_child_id AND CATEGORY_SET_ID = g_catset_id
442        CONNECT BY PRIOR PARENT_CATEGORY_ID = CATEGORY_ID AND CATEGORY_SET_ID = g_catset_id) C
443     WHERE C.CATEGORY_ID = TL.CATEGORY_ID
444       AND TL.LANGUAGE = l_language
445       AND NOT EXISTS (SELECT NULL FROM EGO_PROD_CAT_SALES_MARKET_AGV A
446                       WHERE A.CATEGORY_SET_ID = g_catset_id
447                       AND A.CATEGORY_ID = C.CATEGORY_ID
448                       AND NVL(A.EXCLUDE_USER_VIEW, 'N') = 'Y')
449       		      ORDER BY hrchy ASC; -- Bug 4749088
450 
451   l_concat_desc  VARCHAR2(4001);
452   l_desc         VARCHAR2(240);
453   l_attr_grp_id  NUMBER;
454   l_include_flag VARCHAR2(1);
455   l_eff_level    NUMBER;
456   l_imm_par_id   NUMBER;
457   l_length       NUMBER;
458   l_count        NUMBER := 0;
459 
460   l_user_id          NUMBER := FND_GLOBAL.USER_ID;
461   l_conc_request_id  NUMBER := FND_GLOBAL.CONC_REQUEST_ID;
462   l_prog_appl_id     NUMBER := FND_GLOBAL.PROG_APPL_ID;
463   l_conc_program_id  NUMBER := FND_GLOBAL.CONC_PROGRAM_ID;
464 
465 BEGIN
466   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Incremental Load of Denorm Hierarchy Parents table begining.');
467 
468   BEGIN
469     SELECT ATTR_GROUP_ID INTO l_attr_grp_id
470     FROM EGO_FND_DSC_FLX_CTX_EXT
471     WHERE APPLICATION_ID = 431
472       AND DESCRIPTIVE_FLEXFIELD_NAME = 'EGO_PRODUCT_CATEGORY_SET'
473       AND DESCRIPTIVE_FLEX_CONTEXT_CODE = 'SalesAndMarketing';
474 
475   EXCEPTION
476     WHEN NO_DATA_FOUND THEN
477     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Error: Attribute Group not found for Sales and Marketing');
478     RAISE;
479   END;
480 
481  /* Bug : 5233230
482   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Deleting records of all disabled languages from Denorm Hierarchy Parents table');
483   -- Deleting all languages, which are being deactivated
484   DELETE FROM ENI_DENORM_HRCHY_PARENTS B
485   WHERE NOT EXISTS (SELECT NULL FROM FND_LANGUAGES L
486                     WHERE L.INSTALLED_FLAG IN ('I', 'B')
487                       AND B.LANGUAGE = L.LANGUAGE_CODE);
488 
489   l_count := SQL%ROWCOUNT;
490   FND_FILE.PUT_LINE(FND_FILE.LOG, l_count||' records deleted.');
491 Bug 5233230 */
492 
493   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Deleting all categories which are deleted from hierarchy OR excluded from user view.');
494   -- Deleting all deleted nodes
495   DELETE FROM ENI_DENORM_HRCHY_PARENTS B
496   WHERE B.OBJECT_TYPE = 'CATEGORY_SET'
497     AND B.OBJECT_ID = g_catset_id
498     AND EXISTS (SELECT NULL FROM ENI_DENORM_HRCHY_STG S
499                 WHERE S.OBJECT_TYPE = 'CATEGORY_SET'
500                   AND S.OBJECT_ID = g_catset_id
501                   AND S.CHILD_ID = B.CATEGORY_ID
502                   AND S.MODE_FLAG IN ('D', 'S')
503                   AND S.BATCH_FLAG <> 'NEXT_BATCH');
504 
505   l_count := SQL%ROWCOUNT;
506   FND_FILE.PUT_LINE(FND_FILE.LOG, l_count||' records deleted.');
507 
508   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Inserting/Updating into Denorm Hierarchy Parents table');
509 
510   l_count := 0;
511   FOR i IN C1 LOOP
512 
513     -- description only modified in a particular language so do not update other language records
514     IF i.MODE_FLAG = 'C' AND i.LANGUAGE_CODE <> i.STG_LANG THEN
515       NULL;
516     ELSE
517       FOR j IN C2(i.CHILD_ID) LOOP
518         l_concat_desc := NULL;
519         l_desc := NULL;
520         l_eff_level := 0;
521         l_imm_par_id := null;
522         l_length := 0;
523 
524         FOR k IN C3(j.CATEGORY_ID, i.LANGUAGE_CODE) LOOP
525           -- to trim from the start of the string onwards to accommodate more descriptions towards the end of the string.
526           -- trim upto 4000 chars
527           l_length := LENGTH(k.CHILD_DESC || '/' || l_concat_desc);
528 
529           IF l_length > 4001 THEN
530             l_length := -4001;
531           ELSE
532             l_length := 0;
533           END IF;
534 
535           -- concatenating the descriptions
536           l_concat_desc := SUBSTR(k.CHILD_DESC || '/' || l_concat_desc, l_length, 4001);
537           -- incrementing the effective level
538           l_eff_level := l_eff_level + 1;
539           IF j.CATEGORY_ID = k.CHILD_ID THEN
540             l_desc := k.CHILD_DESC;
541           ELSIF l_imm_par_id IS NULL THEN
542             l_imm_par_id := k.CHILD_ID;
543           END IF;
544         END LOOP;
545 
546         UPDATE ENI_DENORM_HRCHY_PARENTS B
547         SET CATEGORY_DESC = l_desc,
548             CONCAT_CAT_PARENTAGE = RTRIM(l_concat_desc, '/'),
549             CATEGORY_LEVEL_NUM = l_eff_level,
550             DISABLE_DATE = j.DISABLE_DATE,
551             CATEGORY_PARENT_ID = l_imm_par_id,
552             LAST_UPDATED_BY = l_user_id,
553             LAST_UPDATE_DATE = SYSDATE,
554             LAST_UPDATE_LOGIN = l_user_id,
555             REQUEST_ID = l_conc_request_id,
559         WHERE OBJECT_TYPE = 'CATEGORY_SET'
556             PROGRAM_APPLICATION_ID = l_prog_appl_id,
557             PROGRAM_UPDATE_DATE = SYSDATE,
558             PROGRAM_ID = l_conc_program_id
560           AND OBJECT_ID = g_catset_id
561           AND CATEGORY_ID = j.CATEGORY_ID
562           AND LANGUAGE = i.LANGUAGE_CODE;
563 
564         IF SQL%NOTFOUND THEN
565           INSERT INTO ENI_DENORM_HRCHY_PARENTS (
566             OBJECT_TYPE,
567             OBJECT_ID,
568             ATTRIBUTE_GROUP_ID,
569             CATEGORY_ID,
570             LANGUAGE,
571             CATEGORY_DESC,
572             CONCAT_CAT_PARENTAGE,
573             CATEGORY_LEVEL_NUM,
574             DISABLE_DATE,
575             CATEGORY_PARENT_ID,
576             CREATED_BY,
577             CREATION_DATE,
578             LAST_UPDATED_BY,
579             LAST_UPDATE_DATE,
580             LAST_UPDATE_LOGIN,
581             REQUEST_ID,
582             PROGRAM_APPLICATION_ID,
583             PROGRAM_UPDATE_DATE,
584             PROGRAM_ID)
585           VALUES (
586             'CATEGORY_SET',
587             g_catset_id,
588             l_attr_grp_id,
589             j.CATEGORY_ID,
590             i.LANGUAGE_CODE,
591             l_desc,
592             RTRIM(l_concat_desc, '/'),
593             l_eff_level,
594             j.DISABLE_DATE,
595             l_imm_par_id,
596             l_user_id,
597             SYSDATE,
598             l_user_id,
599             SYSDATE,
600             l_user_id,
601             l_conc_request_id,
602             l_prog_appl_id,
603             SYSDATE,
604             l_conc_program_id);
605         END IF;
606         l_count := l_count + 1;
607       END LOOP;  -- end C2
608     END IF;
609   END LOOP;  -- end C1
610 
611   FND_FILE.PUT_LINE(FND_FILE.LOG, l_count || ' records inserted/updated into Denorm Hierarchy Parents table');
612   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Incremental Load of Denorm Hierarchy Parents table Complete.');
613 EXCEPTION
614   WHEN OTHERS THEN
615     ROLLBACK;
616     UPDATE ENI_DENORM_HRCHY_STG
617     SET BATCH_FLAG = 'NEXT_BATCH'
618     WHERE BATCH_FLAG <> 'NEXT_BATCH'
619       AND OBJECT_TYPE = 'CATEGORY_SET'
620       AND OBJECT_ID = g_catset_id;
621     COMMIT;
622      if( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
623       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, 'ENI_DENORM_HRCHY.SYNC_DENORM_PARENTS_PROD_HRCHY', 'Error: ' ||
624                                                 sqlerrm || ' .Transaction will be rolled back');
625      end if;
626     errbuf := 'Error :' || sqlerrm;
627     retcode := 2;
628     RAISE;
629 END SYNC_DENORM_PARENTS_PROD_HRCHY;
630 
631 -- This Procedure Denormalizes the Product Catalog Hierarchy into Denorm Table
632 -- This is an Initial Load Procedure, so the Denorm Table will be Truncated first.
633 -- This procedure will be called from LOAD_PRODUCT_HIERARCHY procedure
634 PROCEDURE LOAD_HIERARCHY(errbuf OUT NOCOPY VARCHAR2, retcode OUT NOCOPY VARCHAR2) IS
635 
636   CURSOR c1 IS
637     SELECT
638       T.PARENT_CATEGORY_ID     PARENT_ID,
639       T.CATEGORY_ID            CHILD_ID,
640       D.TOP_NODE_FLAG,
641       D1.LEAF_NODE_FLAG
642     FROM MTL_CATEGORY_SET_VALID_CATS T, ENI_DENORM_HIERARCHIES D, ENI_DENORM_HIERARCHIES D1
643     WHERE T.CATEGORY_SET_ID = g_catset_id
644       AND T.PARENT_CATEGORY_ID IS NOT NULL
645       AND D.OBJECT_TYPE = 'CATEGORY_SET'
646       AND D.OBJECT_ID = g_catset_id
647       AND D.PARENT_ID = T.PARENT_CATEGORY_ID
648       AND D.CHILD_ID = T.PARENT_CATEGORY_ID
649       AND D1.OBJECT_TYPE = 'CATEGORY_SET'
650       AND D1.OBJECT_ID = g_catset_id
651       AND D1.PARENT_ID = T.CATEGORY_ID
652       AND D1.CHILD_ID = T.CATEGORY_ID;
653 
654 
655   l_count NUMBER := 0;
656   l_dbi_installed    VARCHAR2(1) := IS_DBI_INSTALLED;  -- variable to hold installation flag for DBI
657   l_user_id          NUMBER := FND_GLOBAL.USER_ID;
658   l_conc_request_id  NUMBER := FND_GLOBAL.CONC_REQUEST_ID;
659   l_prog_appl_id     NUMBER := FND_GLOBAL.PROG_APPL_ID;
660   l_conc_program_id  NUMBER := FND_GLOBAL.CONC_PROGRAM_ID;
661   l_hrchy_enabled    VARCHAR2(1);
662   l_sql              VARCHAR2(32000);
663   l_validate_flag    VARCHAR2(1);  -- Bug# 3306212
664   l_struct_id        NUMBER;  -- Bug# 3306212
665 
666 BEGIN
667   FND_FILE.PUT_LINE(FND_FILE.LOG,'Denorm table Initial Load Start');
668 
669   -- Finding whether Hierarchy is enabled or not
670   BEGIN  -- Bug# 3013192, Bug# 3306212
671     SELECT HIERARCHY_ENABLED, VALIDATE_FLAG, STRUCTURE_ID INTO l_hrchy_enabled, l_validate_flag, l_struct_id
672     FROM MTL_CATEGORY_SETS_B
673     WHERE CATEGORY_SET_ID = g_catset_id;
674   EXCEPTION WHEN NO_DATA_FOUND THEN
675     FND_FILE.PUT_LINE(FND_FILE.LOG,'Invalid Category Set associated with Product Reporting functional area');
676     RAISE;
677   END;
678 
679   -- Deleting records from Denorm Table for object_type = CATEGORY_SET
680   FND_FILE.PUT_LINE(FND_FILE.LOG,'Deleting Records from Denorm Table for Product Catalog');
681 
682   DELETE FROM ENI_DENORM_HIERARCHIES
683   WHERE OBJECT_TYPE = 'CATEGORY_SET';
684 
685   -- Bug# 3047381, moved delete of staging table from last to begining. So that any changes in hierarchy, during Load is running
686   -- will be captured in next incremental load.
687   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Deleting records from Staging table');
688   -- deleting records from staging table, since all the changes are already there in Denorm table
689   DELETE FROM ENI_DENORM_HRCHY_STG
693   l_count := SQL%ROWCOUNT;
690   WHERE OBJECT_TYPE = 'CATEGORY_SET'
691     AND OBJECT_ID = g_catset_id;
692 
694   FND_FILE.PUT_LINE(FND_FILE.LOG, l_count||' records deleted from Staging table');
695 
696   -- Inserting Self-referencing Nodes
697   IF (NVL(l_validate_flag, 'N') = 'N' AND NVL(l_hrchy_enabled, 'N') = 'N') THEN
698     -- Inserting Self-referencing Nodes from mtl_categories
699     -- since enforce list of valid categories is not true and
700     -- hierarchy is not enabled
701     FND_FILE.PUT_LINE(FND_FILE.LOG,'Inserting Self Referencing Nodes');
702 
703     INSERT INTO ENI_DENORM_HIERARCHIES(
704       PARENT_ID,
705       IMM_CHILD_ID,
706       CHILD_ID,
707       OBJECT_TYPE,
708       OBJECT_ID,
709       TOP_NODE_FLAG,
710       LEAF_NODE_FLAG,
711       ITEM_ASSGN_FLAG,
712       DBI_FLAG,
713       OLTP_FLAG,
714       CREATED_BY,
715       CREATION_DATE,
716       LAST_UPDATED_BY,
717       LAST_UPDATE_DATE,
718       LAST_UPDATE_LOGIN,
719       REQUEST_ID,
720       PROGRAM_APPLICATION_ID,
721       PROGRAM_UPDATE_DATE,
722       PROGRAM_ID)
723     SELECT
724       CATEGORY_ID,
725       CATEGORY_ID,
726       CATEGORY_ID,
727       'CATEGORY_SET',
728       g_catset_id,
729       'Y' TOP_NODE_FLAG,
730       'Y' LEAF_NODE_FLAG,
731       'N' ITEM_ASSGN_FLAG,
732       'Y' DBI_FLAG,
733       'Y' OLTP_FLAG,
734       l_user_id,
735       SYSDATE,
736       l_user_id,
737       SYSDATE,
738       l_user_id,
739       l_conc_request_id,
740       l_prog_appl_id,
741       SYSDATE,
742       l_conc_program_id
743     FROM MTL_CATEGORIES_B
744     WHERE STRUCTURE_ID = l_struct_id;
745   ELSE
746     -- Inserting Self-referencing Nodes
747     FND_FILE.PUT_LINE(FND_FILE.LOG,'Inserting Self Referencing Nodes');
748     -- Using execute immediate to set ITEM_ASSGN_FLAG and LEAF_NODE_FLAG
749     -- the same insert statement doesn't works without execute immediate
750     l_sql :=
751     'INSERT INTO ENI_DENORM_HIERARCHIES(
752       PARENT_ID,
753       IMM_CHILD_ID,
754       CHILD_ID,
755       OBJECT_TYPE,
756       OBJECT_ID,
757       TOP_NODE_FLAG,
758       LEAF_NODE_FLAG,
759       ITEM_ASSGN_FLAG,
760       DBI_FLAG,
761       OLTP_FLAG,
762       CREATED_BY,
763       CREATION_DATE,
764       LAST_UPDATED_BY,
765       LAST_UPDATE_DATE,
766       LAST_UPDATE_LOGIN,
767       REQUEST_ID,
768       PROGRAM_APPLICATION_ID,
769       PROGRAM_UPDATE_DATE,
770       PROGRAM_ID)
771     SELECT
772       T.CATEGORY_ID,
773       T.CATEGORY_ID,
774       T.CATEGORY_ID,
775       ''CATEGORY_SET'',
776       :g_catset_id,
777       DECODE(:l_hrchy_enabled, ''Y'', DECODE(T.PARENT_CATEGORY_ID, NULL, ''Y'', ''N''), ''Y''),
778       NVL((SELECT ''N'' FROM MTL_CATEGORY_SET_VALID_CATS X
779            WHERE X.CATEGORY_SET_ID = T.CATEGORY_SET_ID
780              AND X.PARENT_CATEGORY_ID = T.CATEGORY_ID
781             AND ROWNUM = 1), ''Y'') LEAF_NODE_FLAG,
782       ''N'',
783       ''Y'',
784       ''Y'',
785       :l_user_id,
786       SYSDATE,
787       :l_user_id,
788       SYSDATE,
789       :l_user_id,
790       :l_conc_request_id,
791       :l_prog_appl_id,
792       SYSDATE,
793       :l_conc_program_id
794     FROM MTL_CATEGORY_SET_VALID_CATS T
795     WHERE T.CATEGORY_SET_ID = :g_catset_id';
796 
797     EXECUTE IMMEDIATE l_sql USING g_catset_id, l_hrchy_enabled, l_user_id, l_user_id, l_user_id
798       , l_conc_request_id, l_prog_appl_id, l_conc_program_id, g_catset_id;
799 
800   END IF;
801 
802   l_count := SQL%ROWCOUNT;
803   FND_FILE.PUT_LINE(FND_FILE.LOG,'Inserted '||l_count||' Self-referencing records');
804 
805   IF NVL(l_hrchy_enabled, 'N') = 'Y' THEN  -- Bug# 3013192
806     l_count := 0;
807     -- For Inserting Parent, Immchild, Child Relationships
808     FND_FILE.PUT_LINE(FND_FILE.LOG,'Hierarchy is enabled'); -- Bug# 3013192
809     FND_FILE.PUT_LINE(FND_FILE.LOG,'Inserting Hierarchical records');
810 
811     FOR i in c1 LOOP
812       INSERT INTO ENI_DENORM_HIERARCHIES (
813         PARENT_ID,
814         IMM_CHILD_ID,
815         CHILD_ID,
816         OBJECT_TYPE,
817         OBJECT_ID,
818         TOP_NODE_FLAG,
819         LEAF_NODE_FLAG,
820         ITEM_ASSGN_FLAG,
821         DBI_FLAG,
822         OLTP_FLAG,
823         CREATED_BY,
824         CREATION_DATE,
825         LAST_UPDATED_BY,
826         LAST_UPDATE_DATE,
827         LAST_UPDATE_LOGIN,
828         REQUEST_ID,
829         PROGRAM_APPLICATION_ID,
830         PROGRAM_UPDATE_DATE,
831         PROGRAM_ID)
832       SELECT
833         i.PARENT_ID,
834         i.CHILD_ID,
835         A.CATEGORY_ID,
836         'CATEGORY_SET',
837         g_catset_id,
838         i.TOP_NODE_FLAG,
839         i.LEAF_NODE_FLAG,
840         'N',
841         'Y',
842         'Y',
843         l_user_id,
844         SYSDATE,
845         l_user_id,
846         SYSDATE,
847         l_user_id,
848         l_conc_request_id,
849         l_prog_appl_id,
850         SYSDATE,
851         l_conc_program_id
852       FROM MTL_CATEGORY_SET_VALID_CATS A
853       START WITH A.CATEGORY_ID = i.CHILD_ID AND A.CATEGORY_SET_ID = g_catset_id
857     END LOOP;
854       CONNECT BY A.PARENT_CATEGORY_ID = PRIOR A.CATEGORY_ID AND A.CATEGORY_SET_ID = g_catset_id;
855 
856       l_count := l_count + SQL%ROWCOUNT;
858 
859     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Inserted '||l_count||' Hierarchical records');
860   END IF;
861 
862 --  IF l_dbi_installed = 'Y' THEN -- ER# 3185516, updating Item Assignment Flag even in non-DBI env.
863   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Updating Item Assignment Flag');
864   -- updating Item Assignment flag for all categories, which have items attached to it
865   UPDATE ENI_DENORM_HIERARCHIES B
866   SET ITEM_ASSGN_FLAG = 'Y'
867   WHERE B.OBJECT_TYPE = 'CATEGORY_SET'
868     AND B.OBJECT_ID = g_catset_id
869     AND EXISTS (SELECT NULL
870                 FROM MTL_ITEM_CATEGORIES C
871                 WHERE C.CATEGORY_SET_ID = g_catset_id
872                   AND C.CATEGORY_ID = B.CHILD_ID);
873 
874   l_count := SQL%ROWCOUNT;
875 
876   FND_FILE.PUT_LINE(FND_FILE.LOG, l_count||' Records Updated for Item Assignment Flag');
877 
878   FND_FILE.PUT_LINE(FND_FILE.LOG,'Checking Item Assignments for Unassigned');
879   -- Checking Item assignment flag for Unassigned category
880   -- if all items are attached to some categories within this category set then
881   -- Item assignment flag for Unassigned node will be 'N'
882   BEGIN
883     SELECT 1 INTO l_count
884     FROM MTL_SYSTEM_ITEMS_B IT
885     WHERE ROWNUM = 1
886       AND NOT EXISTS (SELECT NULL FROM MTL_ITEM_CATEGORIES C
887                       WHERE C.CATEGORY_SET_ID = g_catset_id
888                         AND C.INVENTORY_ITEM_ID = IT.INVENTORY_ITEM_ID
889                         AND C.ORGANIZATION_ID = IT.ORGANIZATION_ID);
890   EXCEPTION WHEN NO_DATA_FOUND THEN
891     FND_FILE.PUT_LINE(FND_FILE.LOG,'All Items are assigned to Product Catalog');
892     l_count := 0;
893   END;
894 /* ER# 3185516, updating Item Assignment Flag even in non-DBI env.
895   ELSE
896     l_count := 0;
897   END IF;
898 */
899 
900   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Inserting Unassigned Node');
901   INSERT INTO ENI_DENORM_HIERARCHIES (
902     PARENT_ID,
903     IMM_CHILD_ID,
904     CHILD_ID,
905     OBJECT_TYPE,
906     OBJECT_ID,
907     TOP_NODE_FLAG,
908     LEAF_NODE_FLAG,
909     ITEM_ASSGN_FLAG,
910     DBI_FLAG,
911     OLTP_FLAG,
912     CREATED_BY,
913     CREATION_DATE,
914     LAST_UPDATED_BY,
915     LAST_UPDATE_DATE,
916     LAST_UPDATE_LOGIN,
917     REQUEST_ID,
918     PROGRAM_APPLICATION_ID,
919     PROGRAM_UPDATE_DATE,
920     PROGRAM_ID)
921   VALUES(
922     -1,
923     -1,
924     -1,
925     'CATEGORY_SET',
926     g_catset_id,
927     'Y',
928     'Y',
929     DECODE(l_count, 1, 'Y', 'N'),
930     'Y',
931     'N',
932     l_user_id,
933     SYSDATE,
934     l_user_id,
935     SYSDATE,
936     l_user_id,
937     l_conc_request_id,
938     l_prog_appl_id,
939     SYSDATE,
940     l_conc_program_id);
941 
942   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Gathering statistics on table: ENI_DENORM_HIERARCHIES ');
943   FND_STATS.gather_table_stats (ownname=>'ENI', tabname=>'ENI_DENORM_HIERARCHIES');
944 
945   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Denorm table Initial Load completed successfully');
946 EXCEPTION
947   WHEN  NO_DATA_FOUND THEN
948     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Error: No Data Found. Transaction will be rolled back');
949     errbuf := 'No data found ' || sqlerrm;
950     retcode := 2;
951     ROLLBACK;
952     RAISE;
953   WHEN OTHERS THEN
954      if( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
955         FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, 'ENI_DENORM_HRCHY.LOAD_HIERARCHY', 'Error: ' ||
956                                                 sqlerrm || ' .Transaction will be rolled back');
957      end if;
958     errbuf := 'Error :' || sqlerrm;
959     retcode := 2;
960     ROLLBACK;
961     RAISE;
962 END LOAD_HIERARCHY;
963 
964 -- This Procedure Updates The Denorm Table In Incremental Mode, Wrt To Changes Made In Product Catalog Hierarchy
965 -- This Procedure picks up records to be added/modified from Staging table
966 PROCEDURE SYNC_HIERARCHY(errbuf OUT NOCOPY VARCHAR2, retcode OUT NOCOPY VARCHAR2) IS
967 
968   CURSOR top_nodes IS
969   SELECT DISTINCT TOP_NODE_ID
970   FROM ENI_DENORM_HRCHY_STG
971   WHERE BATCH_FLAG <> 'NEXT_BATCH'
972     AND OBJECT_TYPE = 'CATEGORY_SET'
973     AND OBJECT_ID = g_catset_id
974     AND MODE_FLAG IN ('A', 'M');  -- modified for sales and marketing enhancement
975 
976   l_affected_child   NUMBER;
977   l_affected_level   NUMBER;
978   l_count            NUMBER := 0;
979   l_dbi_installed    VARCHAR2(1) := IS_DBI_INSTALLED;  -- variable to hold installation flag for DBI
980   l_user_id          NUMBER := FND_GLOBAL.USER_ID;
981   l_conc_request_id  NUMBER := FND_GLOBAL.CONC_REQUEST_ID;
982   l_prog_appl_id     NUMBER := FND_GLOBAL.PROG_APPL_ID;
983   l_conc_program_id  NUMBER := FND_GLOBAL.CONC_PROGRAM_ID;
984   l_sql              VARCHAR2(32000);
985   l_validate_flag    VARCHAR2(1);  -- Bug# 3306212
986   l_struct_id        NUMBER;  -- Bug# 3306212
987 
988 BEGIN
989   BEGIN -- Bug# 3306212
990     SELECT VALIDATE_FLAG, STRUCTURE_ID INTO l_validate_flag, l_struct_id
991     FROM MTL_CATEGORY_SETS_B
992     WHERE CATEGORY_SET_ID = g_catset_id;
993   EXCEPTION WHEN NO_DATA_FOUND THEN
994     FND_FILE.PUT_LINE(FND_FILE.LOG,'Invalid Category Set associated with Product Reporting functional area');
998   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Denorm table Incremental Load begining');
995     RAISE;
996   END;
997 
999 
1000   IF NVL(l_validate_flag, 'N') = 'N' THEN -- Bug# 3306212
1001     INSERT INTO ENI_DENORM_HIERARCHIES(
1002       PARENT_ID,
1003       IMM_CHILD_ID,
1004       CHILD_ID,
1005       OBJECT_TYPE,
1006       OBJECT_ID,
1007       TOP_NODE_FLAG,
1008       LEAF_NODE_FLAG,
1009       ITEM_ASSGN_FLAG,
1010       DBI_FLAG,
1011       OLTP_FLAG,
1012       CREATED_BY,
1013       CREATION_DATE,
1014       LAST_UPDATED_BY,
1015       LAST_UPDATE_DATE,
1016       LAST_UPDATE_LOGIN,
1017       REQUEST_ID,
1018       PROGRAM_APPLICATION_ID,
1019       PROGRAM_UPDATE_DATE,
1020       PROGRAM_ID)
1021     SELECT
1022       B.CATEGORY_ID,
1023       B.CATEGORY_ID,
1024       B.CATEGORY_ID,
1025       'CATEGORY_SET',
1026       g_catset_id,
1027       'Y' TOP_NODE_FLAG,
1028       'Y' LEAF_NODE_FLAG,
1029       'N' ITEM_ASSGN_FLAG,
1030       'Y' DBI_FLAG,
1031       'Y' OLTP_FLAG,
1032       l_user_id,
1033       SYSDATE,
1034       l_user_id,
1035       SYSDATE,
1036       l_user_id,
1040       l_conc_program_id
1037       l_conc_request_id,
1038       l_prog_appl_id,
1039       SYSDATE,
1041     FROM MTL_CATEGORIES_B B
1042     WHERE B.STRUCTURE_ID = l_struct_id
1043       AND NOT EXISTS (SELECT NULL FROM ENI_DENORM_HIERARCHIES H
1044                       WHERE H.OBJECT_TYPE = 'CATEGORY_SET'
1045                         AND H.OBJECT_ID = g_catset_id
1046                         AND H.PARENT_ID = B.CATEGORY_ID
1047                         AND H.CHILD_ID = B.CATEGORY_ID);
1048   ELSE -- Bug# 3306212 end
1049     -- To Get The Top Node And Child Level In Temp Table
1050     UPDATE ENI_DENORM_HRCHY_STG T
1051     SET (TOP_NODE_ID, CHILD_LEVEL)=
1052                 (SELECT X.CATEGORY_ID, LEVEL
1053                  FROM MTL_CATEGORY_SET_VALID_CATS X
1054                  WHERE X.PARENT_CATEGORY_ID IS NULL
1055                  START WITH X.CATEGORY_ID = T.CHILD_ID AND X.CATEGORY_SET_ID = g_catset_id
1056                  CONNECT BY X.CATEGORY_ID = PRIOR X.PARENT_CATEGORY_ID AND X.CATEGORY_SET_ID = g_catset_id),
1057       BATCH_FLAG = 'CURRENT_BATCH'
1058     WHERE OBJECT_TYPE = 'CATEGORY_SET'
1059       AND T.OBJECT_ID = g_catset_id;
1060 
1064     -- commiting to release Lock on ENI_DENORM_HRCHY_STG table. If any exception occurs then
1061     l_count := SQL%ROWCOUNT;
1062     FND_FILE.PUT_LINE(FND_FILE.LOG, l_count||' Records found in Staging Table for Incremental Load');
1063 
1065     -- batch_flag will be updated back to 'NEXT_BATCH' and commited.
1066     COMMIT;
1067 
1068     -- Deleting Nodes from Denorm Table, which are deleted i.e. MODE_FLAG='D'
1069     -- If a parent node is deleted from hierarchy, then all its children are also deleted from hierarchy
1070     -- and all the nodes actually deleted from hierarchy will be inserted into the staging table with
1071     -- mode_flag = 'D'. So we need to delete all records from denorm table, where child_id = child_id in staging table
1072     -- and mode_flag = 'D'
1073     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Deleting Nodes from Denorm Table, which are deleted from Hierarchy');
1074 
1075     -- Bug# 3047381 , removed use of ROWID , instead using PK columns
1076     DELETE FROM ENI_DENORM_HIERARCHIES B  -- changed the statement due to performance reasons
1077     WHERE OBJECT_TYPE = 'CATEGORY_SET'
1078       AND OBJECT_ID = g_catset_id
1079       AND EXISTS (SELECT NULL
1080                   FROM ENI_DENORM_HRCHY_STG S
1081                   WHERE S.OBJECT_TYPE = B.OBJECT_TYPE
1082                     AND S.OBJECT_ID = B.OBJECT_ID
1083                     AND S.CHILD_ID = B.CHILD_ID
1084                     AND S.MODE_FLAG = 'D'
1085                     AND S.BATCH_FLAG = 'CURRENT_BATCH');
1086 
1087     l_count := SQL%ROWCOUNT;
1088     FND_FILE.PUT_LINE(FND_FILE.LOG, l_count||' Records deleted from denorm table');
1089 
1090     -- Inserting Self Referencing Nodes For New Nodes Into Denorm Table
1091     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Inserting Self-referencing nodes for new nodes');
1092     INSERT INTO ENI_DENORM_HIERARCHIES(
1093       PARENT_ID,
1094       IMM_CHILD_ID,
1095       CHILD_ID,
1096       OBJECT_TYPE,
1097       OBJECT_ID,
1098       TOP_NODE_FLAG,
1099       LEAF_NODE_FLAG,
1100       ITEM_ASSGN_FLAG,
1101       DBI_FLAG,
1102       OLTP_FLAG,
1103       CREATED_BY,
1104       CREATION_DATE,
1105       LAST_UPDATED_BY,
1106       LAST_UPDATE_DATE,
1107       LAST_UPDATE_LOGIN,
1108       REQUEST_ID,
1109       PROGRAM_APPLICATION_ID,
1110       PROGRAM_UPDATE_DATE,
1111       PROGRAM_ID)
1112     SELECT
1113       S.CHILD_ID,
1114       CHILD_ID,
1115       CHILD_ID,
1116       'CATEGORY_SET',
1117       g_catset_id,
1118       DECODE(CHILD_ID, TOP_NODE_ID, 'Y', 'N'), -- Bug# 3047381, removed use of SIGN function
1119       'N',
1120       'N',
1121       'Y',
1122       'Y',
1123       l_user_id,
1124       SYSDATE,
1125       l_user_id,
1126       SYSDATE,
1127       l_user_id,
1128       l_conc_request_id,
1129       l_prog_appl_id,
1130       SYSDATE,
1131       l_conc_program_id
1132     FROM ENI_DENORM_HRCHY_STG S
1133     WHERE S.OBJECT_TYPE = 'CATEGORY_SET'
1134       AND S.OBJECT_ID = g_catset_id
1135       AND S.MODE_FLAG = 'A'
1136       AND S.BATCH_FLAG = 'CURRENT_BATCH';
1137 
1138     l_count := SQL%ROWCOUNT;
1139     FND_FILE.PUT_LINE(FND_FILE.LOG, l_count||' Records inserted as Self-referencing nodes');
1140 
1141     l_count := 0;
1142     -- Deleting all rows, which will no longer be a part of Hierarchy
1143     -- whenever a node is moved i.e. MODE_FLAG='M', there will be some records in denorm table
1144     -- which needs to be deleted, as they will no longer will be a part of the hierarhcy
1145     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Deleting records, which are no longer required, due to movement in Hierarchy');
1146     FOR i IN (SELECT * FROM ENI_DENORM_HRCHY_STG
1147               WHERE OBJECT_TYPE = 'CATEGORY_SET'
1148                 AND OBJECT_ID = g_catset_id
1149                 AND MODE_FLAG = 'M'
1150                 AND BATCH_FLAG = 'CURRENT_BATCH'
1151                 ORDER BY CHILD_LEVEL DESC) LOOP  -- Bug# 3047381, removed TOP_NODE_ID ASC from order by clause
1152 
1153       DELETE FROM ENI_DENORM_HIERARCHIES B
1154       WHERE B.OBJECT_TYPE = 'CATEGORY_SET'
1155         AND B.OBJECT_ID = g_catset_id
1156         AND EXISTS (SELECT NULL FROM ENI_DENORM_HIERARCHIES T  -- all records with child = i.child_id or children of i.child_id
1157                     WHERE T.OBJECT_TYPE = B.OBJECT_TYPE
1158                       AND T.OBJECT_ID = B.OBJECT_ID
1159                       AND B.CHILD_ID = T.CHILD_ID
1160                       AND T.PARENT_ID = i.CHILD_ID)
1161         AND NOT EXISTS (SELECT NULL FROM ENI_DENORM_HIERARCHIES D  -- Hierarchy below the i.child_id must not be deleted
1162                       WHERE D.OBJECT_TYPE = B.OBJECT_TYPE
1163                           AND D.OBJECT_ID = B.OBJECT_ID
1164                           AND B.PARENT_ID = D.CHILD_ID
1165                         AND D.PARENT_ID = i.CHILD_ID)
1166         AND NOT EXISTS (-- Find New Parents, All Records Which Are A Part Of New Hierarchy
1167                         SELECT NULL
1168                         FROM MTL_CATEGORY_SET_VALID_CATS C
1169                         WHERE C.PARENT_CATEGORY_ID IS NOT NULL
1173                         CONNECT BY C.CATEGORY_ID = PRIOR C.PARENT_CATEGORY_ID AND C.CATEGORY_SET_ID = g_catset_id);
1170                           AND C.PARENT_CATEGORY_ID = B.PARENT_ID
1171                           AND C.CATEGORY_ID = B.IMM_CHILD_ID
1172                         START WITH C.CATEGORY_ID = i.PARENT_ID AND C.CATEGORY_SET_ID = g_catset_id
1174 
1175       l_count := l_count + SQL%ROWCOUNT;
1176     END LOOP;
1177 
1178     FND_FILE.PUT_LINE(FND_FILE.LOG, l_count||' Records deleted');
1179 
1180     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Inserting new relations');
1181     l_count := 0;
1182     -- Creating Records For Changes In The Hierarchy
1183     FOR i IN top_nodes LOOP
1184       LOOP
1185         -- selecting lowest level child first
1186         BEGIN
1187           SELECT CHILD_ID , CHILD_LEVEL
1188             INTO l_affected_child , l_affected_level
1189           FROM
1190             (SELECT CHILD_ID, CHILD_LEVEL
1191              FROM ENI_DENORM_HRCHY_STG T
1192              WHERE OBJECT_TYPE = 'CATEGORY_SET'
1193                AND OBJECT_ID = g_catset_id
1194                AND TOP_NODE_ID = i.TOP_NODE_ID
1195                AND BATCH_FLAG = 'CURRENT_BATCH'
1196                AND MODE_FLAG IN ('A', 'M')  -- modified for sales and marketing enhancement
1197              ORDER BY CHILD_LEVEL DESC)
1198           WHERE ROWNUM=1;
1199         EXCEPTION
1200           WHEN NO_DATA_FOUND THEN
1201           l_affected_child := NULL;
1202           l_affected_level := NULL;
1203           EXIT;
1204         END;
1205 
1206         -- Inserting records due to change in hierarchy
1207         INSERT INTO ENI_DENORM_HIERARCHIES (
1208           PARENT_ID,
1209           IMM_CHILD_ID,
1210           CHILD_ID,
1211           OBJECT_TYPE,
1212           OBJECT_ID,
1213           TOP_NODE_FLAG,
1214           LEAF_NODE_FLAG,
1215           ITEM_ASSGN_FLAG,
1216           DBI_FLAG,
1217           OLTP_FLAG,
1218           CREATED_BY,
1219           CREATION_DATE,
1220           LAST_UPDATED_BY,
1221           LAST_UPDATE_DATE,
1222           LAST_UPDATE_LOGIN,
1223           REQUEST_ID,
1224           PROGRAM_APPLICATION_ID,
1225           PROGRAM_UPDATE_DATE,
1226           PROGRAM_ID)
1227         SELECT
1228           A.PARENT_ID,
1229           A.IMM_CHILD_ID,
1230           B.CHILD_ID,
1231           'CATEGORY_SET',
1232           g_catset_id,
1233           DECODE(A.PARENT_ID, i.TOP_NODE_ID, 'Y', 'N'), -- Bug# 3047381, removed use of SIGN function
1234           'N',
1235           'N',
1236           'Y',
1237           'Y',
1238           l_user_id,
1239           SYSDATE,
1240           l_user_id,
1241           SYSDATE,
1242           l_user_id,
1243           l_conc_request_id,
1244           l_prog_appl_id,
1245           SYSDATE,
1246           l_conc_program_id
1247         FROM
1248           (SELECT PARENT_CATEGORY_ID PARENT_ID, CATEGORY_ID IMM_CHILD_ID
1249            FROM MTL_CATEGORY_SET_VALID_CATS
1250            WHERE PARENT_CATEGORY_ID IS NOT NULL
1251            START WITH CATEGORY_ID = l_affected_child AND CATEGORY_SET_ID = g_catset_id
1252            CONNECT BY CATEGORY_ID = PRIOR PARENT_CATEGORY_ID AND CATEGORY_SET_ID = g_catset_id) A,
1253           (SELECT CATEGORY_ID CHILD_ID
1254            FROM MTL_CATEGORY_SET_VALID_CATS A
1255            START WITH CATEGORY_ID = l_affected_child AND A.CATEGORY_SET_ID = g_catset_id
1256            CONNECT BY PARENT_CATEGORY_ID = PRIOR CATEGORY_ID AND A.CATEGORY_SET_ID = g_catset_id) B
1257         WHERE NOT EXISTS (SELECT NULL FROM ENI_DENORM_HIERARCHIES P
1258                           WHERE P.OBJECT_TYPE = 'CATEGORY_SET'
1259                             AND P.OBJECT_ID = g_catset_id
1260                             AND P.PARENT_ID = A.PARENT_ID
1261                             AND P.IMM_CHILD_ID = A.IMM_CHILD_ID
1262                             AND P.CHILD_ID = B.CHILD_ID);
1263 
1264         l_count := l_count + SQL%ROWCOUNT;
1265 
1266         -- Updating STG Table, making current child as PROCESSED, so that it will not be picked up again
1267         UPDATE ENI_DENORM_HRCHY_STG SET BATCH_FLAG = 'PROCESSED'
1268         WHERE OBJECT_TYPE = 'CATEGORY_SET'
1269           AND OBJECT_ID = g_catset_id
1270           AND CHILD_ID = l_affected_child
1271           AND BATCH_FLAG = 'CURRENT_BATCH';
1272 
1273       END LOOP;
1274     END LOOP;  -- End Loop For Top Nodes
1275 
1276     FND_FILE.PUT_LINE(FND_FILE.LOG, l_count||' Records inserted');
1277 
1278     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Updating Leaf Node Flag');
1279     -- updating leaf node flag for all records where new leaf_node_flag <> current leaf_node_flag
1280     -- Using Execute Immediate because the same code doesn't compiles without Execute immediate
1281     -- Bug# 3045649, added WHO columns in update statements
1282     l_sql :=
1283     'UPDATE ENI_DENORM_HIERARCHIES B
1284     SET LEAF_NODE_FLAG = DECODE(B.LEAF_NODE_FLAG, ''N'', ''Y'', ''N'') ,
1285         LAST_UPDATE_DATE = SYSDATE,
1286         LAST_UPDATED_BY = :l_user_id,
1287         LAST_UPDATE_LOGIN = :l_user_id,
1288         REQUEST_ID = :l_conc_request_id,
1289         PROGRAM_APPLICATION_ID = :l_prog_appl_id,
1290         PROGRAM_UPDATE_DATE = SYSDATE,
1291         PROGRAM_ID = :l_conc_program_id
1292     WHERE B.OBJECT_TYPE = ''CATEGORY_SET''
1293       AND B.OBJECT_ID = :g_catset_id
1294       AND B.CHILD_ID <> -1
1295       AND B.LEAF_NODE_FLAG <> NVL((SELECT ''N''
1296                                    FROM MTL_CATEGORY_SET_VALID_CATS C
1297                                    WHERE C.CATEGORY_SET_ID = :g_catset_id
1298                                      AND B.IMM_CHILD_ID = C.PARENT_CATEGORY_ID
1299                                      AND ROWNUM = 1), ''Y'')';
1300 
1301     EXECUTE IMMEDIATE l_sql USING l_user_id, l_user_id, l_conc_request_id, l_prog_appl_id, l_conc_program_id, g_catset_id, g_catset_id;
1302 
1303     l_count := SQL%ROWCOUNT;
1304 
1305     FND_FILE.PUT_LINE(FND_FILE.LOG, l_count||' Records Updated for Leaf Node Flag');
1306 
1307     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Updating Top Node Flag');
1308     -- updating top node flag for all records where new top_node_flag <> current top_node_flag
1309     -- using a inline view to improve the performance
1310     -- Bug# 3045649, added WHO columns in update statements
1311 
1312     --
1313     -- Bug 12615896. Inline view update statement failing
1314     -- after online patching changes. So modified it to use
1315     -- merge.
1316     -- sreharih. Mon Jun 27 12:36:38 PDT 2011
1317     --
1318 
1319    MERGE INTO ENI_DENORM_HIERARCHIES B
1320    USING ( SELECT category_id, category_set_id, DECODE(PARENT_CATEGORY_ID, null, 'Y', 'N') NEW_TOP_NODE
1321             FROM MTL_CATEGORY_SET_VALID_CATS) C
1322      ON (   B.OBJECT_ID = C.CATEGORY_SET_ID
1323         AND B.PARENT_ID = C.CATEGORY_ID
1324         AND B.OBJECT_TYPE = 'CATEGORY_SET'
1325         AND B.OBJECT_ID =  g_catset_id
1326         )
1327   WHEN matched THEN
1328   UPDATE SET TOP_NODE_FLAG =  DECODE(TOP_NODE_FLAG, 'N', 'Y', 'N'),--C.new_top_node,
1329         LAST_UPDATE_DATE = SYSDATE,
1330         LAST_UPDATED_BY = l_user_id,
1331         LAST_UPDATE_LOGIN = l_user_id,
1332         REQUEST_ID = l_conc_request_id,
1333         PROGRAM_APPLICATION_ID = l_prog_appl_id,
1334         PROGRAM_UPDATE_DATE = SYSDATE,
1335         PROGRAM_ID = l_conc_program_id
1336  WHERE  C.new_top_node <> B.TOP_NODE_FLAG;
1337 
1338   /* Commented out for 12615896
1339     UPDATE (
1340             SELECT B.PARENT_ID, DECODE(C.PARENT_CATEGORY_ID, NULL, 'Y', 'N') NEW_TOP_NODE, B.TOP_NODE_FLAG,
1341               B.LAST_UPDATE_DATE, B.LAST_UPDATED_BY, B.LAST_UPDATE_LOGIN, B.REQUEST_ID, B.PROGRAM_APPLICATION_ID,
1342               B.PROGRAM_UPDATE_DATE, B.PROGRAM_ID
1343             FROM ENI_DENORM_HIERARCHIES B, MTL_CATEGORY_SET_VALID_CATS C
1347               AND C.CATEGORY_ID = B.PARENT_ID)
1344             WHERE B.OBJECT_TYPE = 'CATEGORY_SET'
1345               AND B.OBJECT_ID = g_catset_id
1346               AND C.CATEGORY_SET_ID = B.OBJECT_ID
1348       SET
1349         TOP_NODE_FLAG = DECODE(TOP_NODE_FLAG, 'N', 'Y', 'N'),
1350         LAST_UPDATE_DATE = SYSDATE,
1351         LAST_UPDATED_BY = l_user_id,
1352         LAST_UPDATE_LOGIN = l_user_id,
1353         REQUEST_ID = l_conc_request_id,
1354         PROGRAM_APPLICATION_ID = l_prog_appl_id,
1355         PROGRAM_UPDATE_DATE = SYSDATE,
1356         PROGRAM_ID = l_conc_program_id
1357     WHERE NEW_TOP_NODE <> TOP_NODE_FLAG;
1358   */
1359 
1360     l_count := SQL%ROWCOUNT;
1361     FND_FILE.PUT_LINE(FND_FILE.LOG, l_count||' Records Updated for Top Node Flag');
1362   END IF; -- Bug# 3306212
1363 
1364 --  IF l_dbi_installed = 'Y' THEN -- ER# 3185516, updating Item Assignment Flag even in non-DBI env.
1365   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Updating Item Assignment Flag');
1366   -- updating Item Assignment flag to 'Y', if item assignment is present and current Item assgn flag is not 'Y'
1367   -- Bug# 3045649, added WHO columns in update statements
1368   UPDATE ENI_DENORM_HIERARCHIES B
1369   SET
1370     ITEM_ASSGN_FLAG = 'Y',
1371     LAST_UPDATE_DATE = SYSDATE,
1372     LAST_UPDATED_BY = l_user_id,
1373     LAST_UPDATE_LOGIN = l_user_id,
1374     REQUEST_ID = l_conc_request_id,
1375     PROGRAM_APPLICATION_ID = l_prog_appl_id,
1376     PROGRAM_UPDATE_DATE = SYSDATE,
1377     PROGRAM_ID = l_conc_program_id
1378   WHERE B.OBJECT_TYPE = 'CATEGORY_SET'
1379     AND B.OBJECT_ID = g_catset_id
1380     AND B.CHILD_ID <> -1
1381     AND B.ITEM_ASSGN_FLAG <> 'Y'
1382     AND EXISTS (SELECT NULL
1383                 FROM MTL_ITEM_CATEGORIES C
1384                 WHERE C.CATEGORY_SET_ID = g_catset_id
1385                   AND C.CATEGORY_ID = B.CHILD_ID);
1386 
1387   l_count := SQL%ROWCOUNT;
1388 
1389   -- updating Item Assignment flag to 'N', if item assignment is not present and current Item assgn flag is not 'N'
1390   UPDATE ENI_DENORM_HIERARCHIES B
1391   SET
1392     ITEM_ASSGN_FLAG = 'N',
1393     LAST_UPDATE_DATE = SYSDATE,
1394     LAST_UPDATED_BY = l_user_id,
1395     LAST_UPDATE_LOGIN = l_user_id,
1396     REQUEST_ID = l_conc_request_id,
1397     PROGRAM_APPLICATION_ID = l_prog_appl_id,
1398     PROGRAM_UPDATE_DATE = SYSDATE,
1399     PROGRAM_ID = l_conc_program_id
1400   WHERE B.OBJECT_TYPE = 'CATEGORY_SET'
1401     AND B.OBJECT_ID = g_catset_id
1402     AND B.CHILD_ID <> -1
1403     AND B.ITEM_ASSGN_FLAG <> 'N'
1404     AND NOT EXISTS (SELECT NULL
1405                     FROM MTL_ITEM_CATEGORIES C
1406                     WHERE C.CATEGORY_SET_ID = g_catset_id
1407                       AND C.CATEGORY_ID = B.CHILD_ID);
1408 
1409   l_count := l_count + SQL%ROWCOUNT;
1410   FND_FILE.PUT_LINE(FND_FILE.LOG, l_count||' Records Updated for Item Assignment Flag');
1411 --  END IF; -- ER# 3185516, updating Item Assignment Flag even in non-DBI env.
1412 
1413   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Incremental Load of Denorm table complete');
1414 EXCEPTION
1415   WHEN OTHERS THEN
1416      if( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
1417       FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, 'ENI_DENORM_HRCHY.SYNC_HIERARCHY', 'Error: ' ||
1418                                                 sqlerrm || ' .Transaction will be rolled back');
1419      end if;
1420     errbuf := 'Error :' || sqlerrm;
1421     retcode := 2;
1422     ROLLBACK;
1423     -- if any error occurs, then updating staging table's batch_flag back to 'NEXT_BATCH'
1424     -- so that it can be picked up in next incremental load.
1425     UPDATE ENI_DENORM_HRCHY_STG
1426     SET BATCH_FLAG = 'NEXT_BATCH'
1427     WHERE BATCH_FLAG <> 'NEXT_BATCH'
1428       AND OBJECT_TYPE = 'CATEGORY_SET'
1429       AND OBJECT_ID = g_catset_id;
1430     COMMIT;
1431     RAISE;
1432 END SYNC_HIERARCHY;
1433 
1434 -- This Procedure Denormalizes the Product Catalog Hierarchy into Denorm Table
1435 -- This will accept the parameter as 'FULL' or 'PARTIAL', depending on which, Initial or
1436 -- Incremental Load will be called
1437 PROCEDURE LOAD_PRODUCT_HIERARCHY(errbuf OUT NOCOPY VARCHAR2, retcode OUT NOCOPY VARCHAR2, p_refresh_mode IN VARCHAR2) IS
1438   err VARCHAR2(2000);
1439   ret VARCHAR2(100);
1440   l_cnt NUMBER; -- Bug# 3057568
1441   l_AS_installed  BOOLEAN := FALSE; -- for Oracle Sales
1442   l_AMS_installed BOOLEAN := FALSE; -- for Oracle Marketing Online
1443   l_OZF_installed BOOLEAN := FALSE; -- for Oracle Trade Management
1444   l_ASN_installed BOOLEAN := FALSE; --Bug 4728981
1445   l_installed     BOOLEAN := FALSE;
1446   l_status        VARCHAR2(1) := 'N';
1447   l_industry      VARCHAR2(1) := NULL;
1448 
1449 BEGIN
1450   -- checking installation of 'AS' (Oracle Sales) , 'AMS' (Oracle Marketing Online), 'OZF' (Oracle Trade Management)
1451   -- AS - 279
1452   -- AMS - 530
1453   -- OZF - 682
1454 
1455   -- checking installation of 'AS' (Oracle Sales)
1456   l_status := NULL;
1457   l_installed := fnd_installation.get(appl_id => 279, dep_appl_id => 279, status => l_status, industry => l_industry );
1458   IF NVL(l_status, 'N') = 'I' THEN
1459     l_AS_installed := TRUE;
1460     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Oracle Sales (AS) is installed.');
1461   END IF;
1462 
1463   -- checking installation of 'AMS' (Oracle Marketing Online)
1464   l_status := NULL;
1465   l_installed := fnd_installation.get(appl_id => 530, dep_appl_id => 530, status => l_status, industry => l_industry );
1466   IF NVL(l_status, 'N') = 'I' THEN
1467     l_AMS_installed := TRUE;
1468     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Oracle Marketing Online (AMS) is installed.');
1469   END IF;
1470 
1471   -- checking installation of 'OZF' (Oracle Trade Management)
1472   l_status := NULL;
1473   l_installed := fnd_installation.get(appl_id => 682, dep_appl_id => 682, status => l_status, industry => l_industry );
1474   IF NVL(l_status, 'N') = 'I' THEN
1475     l_OZF_installed := TRUE;
1476     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Oracle Trade Management (OZF) is installed.');
1477   END IF;
1478 
1479   -- checking installation of 'ASN'
1480   l_status := NULL;
1481   l_installed := fnd_installation.get(appl_id => 280, dep_appl_id => 280, status => l_status, industry => l_industry );
1482   IF NVL(l_status, 'N') = 'I' THEN
1483     l_ASN_installed := TRUE;
1484     FND_FILE.PUT_LINE(FND_FILE.LOG, 'ASN is installed.');
1485   END IF;
1486 
1487   -- if any of the above applications are installed then load de-norm parents table
1488   IF l_AS_installed OR l_AMS_installed OR l_OZF_installed OR l_ASN_installed THEN
1489     l_installed := TRUE;
1490   ELSE
1491     l_installed := FALSE;
1492   END IF;
1493 
1494   IF p_refresh_mode = 'FULL' THEN
1495     LOAD_HIERARCHY(err, ret);
1496     errbuf := err;
1497     retcode := ret;
1498 
1499     -- if sales and marketing is installed then call loading of denorm hierarchy parents table
1500     IF NVL(retcode, 0) <> 2 AND l_installed THEN
1501       err := null;
1502       ret := null;
1503 
1504       LOAD_DENORM_PARENTS_PROD_HRCHY(err, ret);
1505       errbuf := err;
1506       retcode := ret;
1507     END IF;
1508 
1509   ELSIF p_refresh_mode = 'PARTIAL' THEN
1510     BEGIN  -- Bug# 3057568 Start
1511       -- Checking if De-norm table is empty then calling Initial Load, else Incr. Load
1512       SELECT 1 INTO l_cnt
1513       FROM ENI_DENORM_HIERARCHIES
1514       WHERE OBJECT_TYPE = 'CATEGORY_SET'
1515         AND ROWNUM = 1;
1516 
1517       SYNC_HIERARCHY(err, ret);
1518       errbuf := err;
1519       retcode := ret;
1520 
1521       -- if sales and marketing is installed then call loading of denorm hierarchy parents table
1522       IF NVL(retcode, 0) <> 2 AND l_installed THEN
1523         err := null;
1524         ret := null;
1525         -- if de-norm parents table is empty then call full load of only de-norm parents table
1526         BEGIN
1527           SELECT 1 INTO l_cnt
1528           FROM ENI_DENORM_HRCHY_PARENTS
1529           WHERE OBJECT_TYPE = 'CATEGORY_SET'
1530             AND ROWNUM = 1;
1531 
1532           SYNC_DENORM_PARENTS_PROD_HRCHY(err, ret);
1533           errbuf := err;
1534           retcode := ret;
1535         EXCEPTION WHEN NO_DATA_FOUND THEN
1536           FND_FILE.PUT_LINE(FND_FILE.LOG, 'De-norm parents table is empty, calling Initial Load for de-norm parents table...');
1537           LOAD_DENORM_PARENTS_PROD_HRCHY(err, ret);
1538           errbuf := err;
1539           retcode := ret;
1540         END;
1541       END IF;
1542 
1543       -- deleting all nodes from staging table, where batch_flag is not 'NEXT_BATCH', since the batch_flag can be
1544       -- CURRENT_BATCH or PROCESSED
1545       DELETE FROM ENI_DENORM_HRCHY_STG
1546       WHERE BATCH_FLAG <> 'NEXT_BATCH'
1547         AND OBJECT_TYPE = 'CATEGORY_SET'
1548         AND OBJECT_ID = g_catset_id;
1549 
1550     EXCEPTION WHEN NO_DATA_FOUND THEN
1551       FND_FILE.PUT_LINE(FND_FILE.LOG, 'De-norm table is empty, calling Initial Load...');
1552       LOAD_HIERARCHY(err, ret);
1553       errbuf := err;
1554       retcode := ret;
1555 
1556       -- if sales and marketing is installed then call loading of denorm hierarchy parents table
1557       IF NVL(retcode, 0) <> 2 AND l_installed THEN
1558         err := null;
1559         ret := null;
1560 
1561         LOAD_DENORM_PARENTS_PROD_HRCHY(err, ret);
1562         errbuf := err;
1563         retcode := ret;
1564       END IF;
1565     END; -- Bug# 3057568 end
1566   END IF;
1567 
1568   -- synchronizing intermedia index
1569   BEGIN
1570     AD_CTX_DDL.SYNC_INDEX(g_tab_schema || '.ENI_DEN_HRCHY_PAR_IM1');
1571   EXCEPTION WHEN OTHERS THEN
1572     NULL;
1573   END;
1574 EXCEPTION
1575   WHEN OTHERS THEN
1576      if( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
1577         FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, 'ENI_DENORM_HRCHY.LOAD_PRODUCT_HIERARCHY', 'Error: ' ||
1578                                                 sqlerrm || ' .Transaction will be rolled back');
1579      end if;
1580     errbuf := 'Error :' || sqlerrm;
1581     retcode := 2;
1582     ROLLBACK;
1583     -- synchronizing intermedia index even if error occurs
1584     BEGIN
1585       AD_CTX_DDL.SYNC_INDEX(g_tab_schema || '.ENI_DEN_HRCHY_PAR_IM1');
1586     EXCEPTION WHEN OTHERS THEN
1587       NULL;
1588     END;
1589     RAISE;
1590 END LOAD_PRODUCT_HIERARCHY;
1591 
1592 -- ER# 3185516
1593 -- This is a wrapper procedure, which will be called whenever there is a change in item assignment
1594 -- this in turn determines whether DBI is installed or not and calls the star pkg. if installed.
1595 PROCEDURE SYNC_CATEGORY_ASSIGNMENTS(
1596        p_api_version         NUMBER,
1597        p_init_msg_list       VARCHAR2 := 'F',
1598        p_inventory_item_id   NUMBER,
1599        p_organization_id     NUMBER,
1600        x_return_status       OUT NOCOPY VARCHAR2,
1601        x_msg_count           OUT NOCOPY NUMBER,
1602        x_msg_data            OUT NOCOPY VARCHAR2,
1603        p_category_set_id     NUMBER,
1604        p_old_category_id     NUMBER,
1605        p_new_category_id     NUMBER) IS
1606 
1607   l_dbi_installed    VARCHAR2(1) := IS_DBI_INSTALLED;
1608   l_return_status    VARCHAR2(10);
1609   l_msg_count        NUMBER;
1610   l_msg_data         VARCHAR2(4000);
1611 
1612 BEGIN
1613   IF l_dbi_installed = 'Y' THEN
1614     -- calling the star package to Sync up the category assignments
1615     EXECUTE IMMEDIATE
1616       'BEGIN                                              '||
1617       '  ENI_ITEMS_STAR_PKG.SYNC_CATEGORY_ASSIGNMENTS(    '||
1618       '     p_api_version        => :p_api_version,       '||
1619       '     p_init_msg_list      => :p_init_msg_list,     '||
1620       '     p_inventory_item_id  => :p_inventory_item_id, '||
1621       '     p_organization_id    => :p_organization_id,   '||
1622       '     x_return_status      => :l_return_status,     '||
1623       '     x_msg_count          => :l_msg_count,         '||
1624       '     x_msg_data           => :l_msg_data);         '||
1625       'END; '
1626     USING
1627       IN  p_api_version,
1628       IN  p_init_msg_list,
1629       IN  p_inventory_item_id,
1630       IN  p_organization_id,
1631       OUT l_return_status,
1632       OUT l_msg_count,
1633       OUT l_msg_data;
1634 
1635     IF l_return_status = 'U' THEN
1636       x_return_status := l_return_status;
1637       x_msg_count := l_msg_count;
1638       x_msg_data := l_msg_data;
1639       RETURN;
1640     ELSE
1641       x_return_status := 'S';
1642     END IF;
1643 
1644     l_return_status := NULL;
1645     l_msg_count := NULL;
1646     l_msg_data := NULL;
1647   END IF;
1648 
1649   -- if there is item assignment change for Product category set, then
1650   -- update the item assignments flag in de-norm table
1651   IF (p_category_set_id = g_catset_id
1652       AND NVL(p_old_category_id, -1) <> NVL(p_new_category_id, -1)) THEN
1653     ENI_UPD_ASSGN.UPDATE_ASSGN_FLAG(
1654           p_new_category_id => p_new_category_id,
1655           p_old_category_id => p_old_category_id,
1656           x_return_status => l_return_status,
1657           x_msg_count => l_msg_count,
1658           x_msg_data => l_msg_data);
1659 
1660     IF l_return_status = 'U' THEN
1661       x_return_status := l_return_status;
1662       x_msg_count := l_msg_count;
1663       x_msg_data := l_msg_data;
1664       RETURN;
1665     ELSE
1666       x_return_status := 'S';
1667     END IF;
1668   END IF;
1669 
1670 EXCEPTION
1671   WHEN OTHERS THEN
1672     x_return_status := 'U';
1673     IF FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1674        FND_MSG_PUB.ADD_EXC_MSG('ENI_DENORM_HRCHY', 'SYNC_CATEGORY_ASSIGNMENTS', SQLERRM);
1675     END IF;
1676     FND_MSG_PUB.COUNT_AND_GET(p_count => x_msg_count, p_data => x_msg_data);
1677 END SYNC_CATEGORY_ASSIGNMENTS;
1678 
1679 -- ER: 3185516
1680 -- This is a wrapper procedure, which will be called after import items
1681 -- This in calls the star pkg and updates the Item Assignment Flag in De-norm table
1682 PROCEDURE SYNC_STAR_ITEMS_FROM_IOI(
1683       p_api_version         NUMBER,
1684       p_init_msg_list       VARCHAR2 := 'F',
1685       p_set_process_id      NUMBER,
1686       x_return_status       OUT NOCOPY VARCHAR2,
1687       x_msg_count           OUT NOCOPY NUMBER,
1688       x_msg_data            OUT NOCOPY VARCHAR2) IS
1689 
1690   l_dbi_installed    VARCHAR2(1) := IS_DBI_INSTALLED;
1691   l_return_status    VARCHAR2(10);
1692   l_msg_count        NUMBER;
1693   l_msg_data         VARCHAR2(4000);
1694   l_user_id          NUMBER := FND_GLOBAL.USER_ID;
1695   l_conc_request_id  NUMBER := FND_GLOBAL.CONC_REQUEST_ID;
1696   l_prog_appl_id     NUMBER := FND_GLOBAL.PROG_APPL_ID;
1697   l_conc_program_id  NUMBER := FND_GLOBAL.CONC_PROGRAM_ID;
1698   l_count            NUMBER;
1699 BEGIN
1700   IF l_dbi_installed = 'Y' THEN
1701     EXECUTE IMMEDIATE
1702       'BEGIN                                          '||
1703       '  ENI_ITEMS_STAR_PKG.SYNC_STAR_ITEMS_FROM_IOI( '||
1704       '    p_api_version     => :p_api_version,       '||
1705       '    p_init_msg_list   => :p_init_msg_list,     '||
1706       '    p_set_process_id  => :p_set_process_id,    '||
1707       '    x_return_status   => :l_return_status,     '||
1708       '    x_msg_count       => :l_msg_count,         '||
1709       '    x_msg_data        => :l_msg_data);         '||
1710       'END;'
1711     USING
1712       IN  p_api_version,
1713       IN  p_init_msg_list,
1714       IN  p_set_process_id,
1715       OUT l_return_status,
1716       OUT l_msg_count,
1717       OUT l_msg_data;
1718 
1719     IF l_return_status = 'U' THEN
1720       x_return_status := l_return_status;
1721       x_msg_count := l_msg_count;
1722       x_msg_data := l_msg_data;
1723       RETURN;
1724     ELSE
1725       x_return_status := 'S';
1726     END IF;
1727   END IF;
1728 
1729   -- updating Item Assignment flag for all categories, which have items attached to it
1730   UPDATE ENI_DENORM_HIERARCHIES B
1731   SET
1732     ITEM_ASSGN_FLAG = 'Y',
1733     LAST_UPDATE_DATE = SYSDATE,
1734     LAST_UPDATED_BY = l_user_id,
1735     LAST_UPDATE_LOGIN = l_user_id,
1736     REQUEST_ID = l_conc_request_id,
1737     PROGRAM_APPLICATION_ID = l_prog_appl_id,
1738     PROGRAM_UPDATE_DATE = SYSDATE,
1739     PROGRAM_ID = l_conc_program_id
1740   WHERE B.OBJECT_TYPE = 'CATEGORY_SET'
1741     AND B.OBJECT_ID = g_catset_id
1742     AND B.ITEM_ASSGN_FLAG = 'N'
1743     AND EXISTS (SELECT NULL
1744                 FROM MTL_ITEM_CATEGORIES C
1745                 WHERE C.CATEGORY_SET_ID = g_catset_id
1746                   AND C.CATEGORY_ID = B.CHILD_ID);
1747 
1748   -- updating Item Assignment flag for all categories, which does not have items attached to it
1749   UPDATE ENI_DENORM_HIERARCHIES B
1750   SET
1751     ITEM_ASSGN_FLAG = 'N',
1752     LAST_UPDATE_DATE = SYSDATE,
1753     LAST_UPDATED_BY = l_user_id,
1754     LAST_UPDATE_LOGIN = l_user_id,
1755     REQUEST_ID = l_conc_request_id,
1756     PROGRAM_APPLICATION_ID = l_prog_appl_id,
1757     PROGRAM_UPDATE_DATE = SYSDATE,
1758     PROGRAM_ID = l_conc_program_id
1759   WHERE B.OBJECT_TYPE = 'CATEGORY_SET'
1760     AND B.OBJECT_ID = g_catset_id
1761     AND B.ITEM_ASSGN_FLAG = 'Y'
1762     AND B.CHILD_ID <> -1
1763     AND NOT EXISTS (SELECT NULL
1764                     FROM MTL_ITEM_CATEGORIES C
1765                     WHERE C.CATEGORY_SET_ID = g_catset_id
1766                       AND C.CATEGORY_ID = B.CHILD_ID);
1767 
1768   -- Checking Item assignment flag for Unassigned category
1769   -- if all items are attached to some categories within this category set then
1770   -- Item assignment flag for Unassigned node will be 'N'
1771 
1772   l_count := 0;
1773 
1774   BEGIN
1775     SELECT 1 INTO l_count
1776     FROM MTL_SYSTEM_ITEMS_B IT
1777     WHERE ROWNUM = 1
1778       AND NOT EXISTS (SELECT NULL FROM MTL_ITEM_CATEGORIES C
1779                       WHERE C.CATEGORY_SET_ID = g_catset_id
1780                         AND C.INVENTORY_ITEM_ID = IT.INVENTORY_ITEM_ID
1781                         AND C.ORGANIZATION_ID = IT.ORGANIZATION_ID);
1782   EXCEPTION WHEN NO_DATA_FOUND THEN
1783     l_count := 0;
1784   END;
1785 
1786   UPDATE ENI_DENORM_HIERARCHIES B
1787   SET
1788     ITEM_ASSGN_FLAG = DECODE(l_count, 0, 'N', 'Y'),
1789     LAST_UPDATE_DATE = SYSDATE,
1790     LAST_UPDATED_BY = l_user_id,
1791     LAST_UPDATE_LOGIN = l_user_id,
1792     REQUEST_ID = l_conc_request_id,
1793     PROGRAM_APPLICATION_ID = l_prog_appl_id,
1794     PROGRAM_UPDATE_DATE = SYSDATE,
1795     PROGRAM_ID = l_conc_program_id
1796   WHERE B.OBJECT_TYPE = 'CATEGORY_SET'
1797     AND B.OBJECT_ID = g_catset_id
1798     AND B.ITEM_ASSGN_FLAG = DECODE(l_count, 0, 'Y', 'N')
1799     AND B.CHILD_ID = -1
1800     AND B.PARENT_ID = -1;
1801 
1802   x_return_status := 'S';
1803 EXCEPTION
1804   WHEN OTHERS THEN
1805     x_return_status := 'U';
1806     IF FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1807        FND_MSG_PUB.ADD_EXC_MSG('ENI_DENORM_HRCHY', 'SYNC_STAR_ITEMS_FROM_IOI', SQLERRM);
1808     END IF;
1809     FND_MSG_PUB.COUNT_AND_GET(p_count => x_msg_count, p_data => x_msg_data);
1810 END SYNC_STAR_ITEMS_FROM_IOI;
1811 
1812 -- This Function returns nth occurence of string value separated by delimiter parameter
1813 -- The occurence is determined by paramter p_level
1814 FUNCTION split_category_codes(
1815         p_str      VARCHAR2
1816        ,p_level    NUMBER
1817        ,p_delim    VARCHAR2 DEFAULT g_delimiter)
1818 RETURN VARCHAR2 IS
1819 
1820  l_str        VARCHAR2(2000);
1821  l_srch_width NUMBER := Length(p_delim);
1822  l_st         NUMBER;
1823  l_end        NUMBER;
1824 BEGIN
1825   l_str := Trim(p_str);
1826   IF l_str IS NULL THEN RETURN NULL; END IF;
1827 
1828   l_st := InStr(l_str,p_delim);
1829 
1830   IF l_st = 0 THEN
1831      RETURN l_str;
1832   ELSE
1833      l_st := InStr(l_str,p_delim,1,p_level);
1834      IF l_st = 0 THEN -- Searching beyond
1835        l_st  := InStr(l_str,p_delim,-1,2);
1836        l_end := InStr(l_str,p_delim,-1,1);
1837        RETURN SubStr(l_str,l_st + l_srch_width, l_end - l_st - l_srch_width);
1838      ELSE -- First delimiter is found
1839        l_end := InStr(l_str,p_delim,1,p_level + 1);
1840        IF l_end = 0 THEN --We are the end of string return the last node
1841          l_end := l_st;
1842          l_st  := InStr(l_str,p_delim,1,p_level-1);
1843          RETURN SubStr(l_str,l_st + l_srch_width, l_end - l_st - l_srch_width);
1844        ELSE
1845          RETURN SubStr(l_str,l_st + l_srch_width, l_end - l_st - l_srch_width);
1846        END IF;
1847      END IF;
1848   END IF;
1849 END split_category_codes;
1850 
1851 -- This Procedure Denormalizes the Product Catalog Hierarchy into a separate denorm table
1852 -- [ENI_ICAT_CDENORM_HIERARCHIES]. It is designed to support SBA/OBIEE requirements.
1853 -- The program is designed to flatten the hierarchy for levels raning between 5 and 10.
1854 -- The number of levels to denormalize is dynamic and is governed by a profile value.
1855 -- Currently it only supports FULL REFRESH.
1856 PROCEDURE LOAD_OBIEE_HIERARCHY(errbuf OUT NOCOPY VARCHAR2, retcode OUT NOCOPY VARCHAR2) IS
1857   err                 VARCHAR2(2000);
1858   ret                 VARCHAR2(100);
1859   l_count             NUMBER := 0;
1860   l_user_id           NUMBER := FND_GLOBAL.USER_ID;
1861   l_conc_request_id   NUMBER := FND_GLOBAL.CONC_REQUEST_ID;
1862   l_prog_appl_id      NUMBER := FND_GLOBAL.PROG_APPL_ID;
1863   l_conc_program_id   NUMBER := FND_GLOBAL.CONC_PROGRAM_ID;
1864   l_hrchy_enabled     VARCHAR2(1);
1865   l_struct_id         NUMBER;
1866   l_levels_to_flatten NUMBER := 5;
1867   l_sql               VARCHAR2(4000);
1868   l_product_catalog   MTL_CATEGORY_SETS_TL.CATEGORY_SET_NAME%TYPE;
1869 
1870 BEGIN
1871   retcode := 0;
1872   FND_FILE.PUT_LINE(FND_FILE.LOG,'OBIEE Denorm table Initial Load Start');
1873 
1874   -- Finding whether Hierarchy is enabled or not
1875   BEGIN
1876     SELECT HIERARCHY_ENABLED, STRUCTURE_ID INTO l_hrchy_enabled, l_struct_id
1877     FROM MTL_CATEGORY_SETS_B
1878     WHERE CATEGORY_SET_ID   = g_catset_id
1879       AND HIERARCHY_ENABLED = 'Y';
1880   EXCEPTION WHEN NO_DATA_FOUND THEN
1881     FND_FILE.PUT_LINE(FND_FILE.LOG,'Invalid Category Set associated with Product Reporting functional area');
1882     FND_FILE.PUT_LINE(FND_FILE.LOG,'- Or the Category set is not enabled for hierarchies');
1883     RAISE;
1884   END;
1885 
1886   BEGIN
1887      SELECT csvl.category_set_name
1888        INTO l_product_catalog
1889        FROM mtl_default_category_sets mdcs
1890            ,mtl_category_sets_vl csvl
1891       WHERE csvl.category_set_id = mdcs.category_set_id AND mdcs.functional_area_id=11;
1892      EXCEPTION WHEN OTHERS THEN
1893        FND_FILE.PUT_LINE(FND_FILE.LOG,'Exception while searching for functional area 11');
1894        RAISE;
1895   END;
1896 
1897   --Truncate the table first [INITIAL LOAD]
1898   FND_FILE.PUT_LINE(FND_FILE.LOG,'Truncating the DENORM table');
1899 
1900   EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || g_tab_schema || '.ENI_ICAT_CDENORM_HIERARCHIES';
1901 
1902   --Fetch the profile value for No of levels to flatten
1903   fnd_profile.get('ENI_ICAT_DENORM_LEVEL', l_levels_to_flatten);
1904 
1905   IF l_levels_to_flatten IS NULL or l_levels_to_flatten > 10 or l_levels_to_flatten < 5 THEN
1906      FND_FILE.PUT_LINE(FND_FILE.LOG,'Profile [ENI: SBA/OBIEE LEVELS IN HIERARCHY] has incorrect value of: [' || l_levels_to_flatten || ']');
1907      FND_FILE.PUT_LINE(FND_FILE.LOG,'Setting the denormalisation to default level of 5');
1908      l_levels_to_flatten := 5;
1909   END IF;
1910 
1911   --Start populating the denorm table
1912   FND_FILE.PUT_LINE(FND_FILE.LOG,'Denormalizing catalog [' || l_product_catalog || '] to ' || l_levels_to_flatten || ' levels.');
1913   FND_FILE.PUT_LINE(FND_FILE.LOG,'Denormalization is Row + Column flattening');
1914 
1915   l_sql :=
1916     'INSERT INTO eni_icat_cdenorm_hierarchies ( ' ||
1917            '  category_id_level1 ' ||
1918            ' ,category_id_level2 ' ||
1919            ' ,category_id_level3 ' ||
1920            ' ,category_id_level4 ' ||
1921            ' ,category_id_level5 ';
1922 
1923   --Add category_id_level* columns according to the profile value selected
1924   FOR i IN 6..l_levels_to_flatten
1925   LOOP
1926      l_sql := l_sql || ' ,category_id_level' || i;
1927   END LOOP;
1928 
1929 
1930   l_sql := l_sql ||
1931            ' ,leaf_category_id   ' ||
1932            ' ,created_by         ' ||
1933            ' ,creation_date      ' ||
1934            ' ,last_updated_by    ' ||
1935            ' ,last_update_date   ' ||
1936            ' ,last_update_login  ' ||
1937            ' ,request_id         ' ||
1938            ' ,program_application_id ' ||
1939            ' ,program_update_date' ||
1940            ' ,program_id) ';
1941 
1942   --Start of SELECT clause
1943   l_sql := l_sql ||
1944            '( SELECT ' ||
1945          '  ENI_DENORM_HRCHY.split_category_codes(catstr,1,''' || g_delimiter || ''') ' ||
1946          ' ,ENI_DENORM_HRCHY.split_category_codes(catstr,2,''' || g_delimiter || ''') ' ||
1947          ' ,ENI_DENORM_HRCHY.split_category_codes(catstr,3,''' || g_delimiter || ''') ' ||
1948          ' ,ENI_DENORM_HRCHY.split_category_codes(catstr,4,''' || g_delimiter || ''') ' ||
1949          ' ,ENI_DENORM_HRCHY.split_category_codes(catstr,5,''' || g_delimiter || ''') ';
1950 
1951   --Add category_id_level* columns according to the profile value selected
1952   FOR i IN 6..l_levels_to_flatten
1953   LOOP
1954      l_sql := l_sql || ' ,ENI_DENORM_HRCHY.split_category_codes(catstr,' || i || ',''' || g_delimiter || ''') ';
1955   END LOOP;
1956 
1957   l_sql := l_sql ||
1958            ' ,category_id        ' ||
1959          ' ,:cr_by             ' ||
1960            ' ,:cr_date           ' ||
1961            ' ,:upd_by            ' ||
1962            ' ,:l_upd_date        ' ||
1963            ' ,:upd_login         ' ||
1964            ' ,:l_conc_request_id ' ||
1965            ' ,:l_prog_appl_id    ' ||
1966            ' ,:p_upd_date        ' ||
1967            ' ,:l_conc_program_id ' ||
1968          ' FROM ' ||
1969          ' (SELECT (sys_connect_by_path(vcats.category_id,''' || g_delimiter ||
1970          ''') ||''' || g_delimiter || ''') catstr ' ||
1971          '        , vcats.category_id' ||
1972            '  FROM MTL_CATEGORY_SET_VALID_CATS vcats ' ||
1973            ' WHERE CATEGORY_SET_ID = :g_catset_id    ' ||
1974          '/* AND CATEGORY_ID NOT IN (SELECT        ' ||
1975          '   Nvl(vcats1.PARENT_CATEGORY_ID,-99) FROM MTL_CATEGORY_SET_VALID_CATS vcats1 WHERE vcats1.CATEGORY_SET_ID = :g_catset_id2) */' ||
1976            ' START WITH PARENT_CATEGORY_ID IS NULL   ' ||
1977          ' AND CATEGORY_SET_ID = :g_catset_id3     ' ||
1978            ' CONNECT BY PRIOR CATEGORY_ID = PARENT_CATEGORY_ID ' ||
1979          ' AND PRIOR    CATEGORY_SET_ID = CATEGORY_SET_ID ))' ;
1980   -- The NOT IN condition eliminates the row flattened rows from the result
1981   -- Bug 5525229 - commented the NOT IN condition
1982 
1983   EXECUTE IMMEDIATE l_sql
1984   USING l_user_id, SYSDATE, l_user_id, SYSDATE, l_user_id, l_conc_request_id ,l_prog_appl_id ,SYSDATE ,l_conc_program_id
1985        ,g_catset_id, g_catset_id;
1986 
1987   IF SQL%ROWCOUNT > 0 THEN
1988      FND_FILE.PUT_LINE(FND_FILE.LOG, 'Inserted [' || SQL%ROWCOUNT ||'] rows into denorm table.');
1989   ELSE
1990      RAISE NO_DATA_FOUND;
1991   END IF;
1992 
1993   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Insert the UNASSIGNED product category row.');
1994 
1995   INSERT INTO eni_icat_cdenorm_hierarchies (
1996      category_id_level1
1997     ,category_id_level2
1998     ,category_id_level3
1999     ,category_id_level4
2000     ,category_id_level5
2001     ,category_id_level6
2002     ,category_id_level7
2003     ,category_id_level8
2004     ,category_id_level9
2005     ,category_id_level10
2006     ,leaf_category_id
2007     ,created_by
2008     ,creation_date
2009     ,last_updated_by
2010     ,last_update_date
2011     ,last_update_login
2012     ,request_id
2013     ,program_application_id
2014     ,program_update_date
2015     ,program_id)
2016   VALUES (
2017    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1
2018   ,-1
2019   ,l_user_id
2020   ,SYSDATE
2021   ,l_user_id
2022   ,SYSDATE
2023   ,l_user_id
2024   ,l_conc_request_id
2025   ,l_prog_appl_id
2026   ,SYSDATE
2027   ,l_conc_program_id
2028   );
2029 
2030   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Gathering statistics on table: ENI_ICAT_CDENORM_HIERARCHIES ');
2031   FND_STATS.gather_table_stats (ownname=>g_tab_schema, tabname=>'ENI_ICAT_CDENORM_HIERARCHIES');
2032 
2033   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Denorm table Initial Load completed successfully');
2034 
2035   COMMIT;
2036 EXCEPTION
2037   WHEN  NO_DATA_FOUND THEN
2038 
2039     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Error: No Data Found. Transaction will be rolled back');
2040     FND_FILE.PUT_LINE(FND_FILE.LOG, ' Catalog [' || l_product_catalog || '] does not have any categories associated to it.');
2041     errbuf := SQLERRM || ' Catalog [' || l_product_catalog || '] does not have any categories associated to it.';
2042     retcode := 1;
2043     ROLLBACK;
2044   WHEN OTHERS THEN
2045      if( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
2046         FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, 'ENI_DENORM_HRCHY.LOAD_OBIEE_HIERARCHY', 'Error: ' ||
2047                                                 sqlerrm || ' .Transaction will be rolled back');
2048      end if;
2049     errbuf := 'Error :' || sqlerrm;
2050     retcode := 2;
2051     ROLLBACK;
2052 END LOAD_OBIEE_HIERARCHY;
2053 
2054 END ENI_DENORM_HRCHY;