DBA Data[Home] [Help]

PACKAGE BODY: APPS.ICX_CAT_R12_DATA_EXCEP_RPT_PVT

Source


1 PACKAGE BODY ICX_CAT_R12_DATA_EXCEP_RPT_PVT AS
2 /* $Header: ICXVDERB.pls 120.17 2006/07/21 10:04:28 mkohale noship $*/
3 
4 --Constant for R12 used to
5 --populate Updated_by and Created_by Columns
6 UPGRADE_USER_ID NUMBER := -12;
7 
8 -- Package name constant used in debug
9 g_pkg_name VARCHAR2(40) := 'ICX_CAT_R12_DATA_EXCEP_RPT_PVT';
10 
11 /**
12  ** Private functions used in Populating the XML Data
13  **
14  **/
15 -- Private Functions declaration Start
16 PROCEDURE generate_header_section(p_interface_header_id IN number, x_header_XML IN OUT NOCOPY CLOB) ;
17 PROCEDURE generate_lines_section(p_interface_header_id IN NUMBER,
18                                  p_category_id IN NUMBER,
19                                  p_language IN VARCHAR2,
20                                  x_lines_XML IN OUT NOCOPY CLOB);
21 PROCEDURE populate_namevalue_xmltag(p_category_id IN NUMBER);
22 PROCEDURE populate_language_map;
23 PROCEDURE populate_upg_error_msgs(p_interface_header_id_tbl IN DBMS_SQL.NUMBER_TABLE);
24 -- Private Functions declaration End
25 
26 /**
27  ** Procedure : cleanup_tables
28  ** Synopsis  : To delete the existing data from
29  **             upgraded tables
30  **/
31 PROCEDURE cleanup_tables
32 IS
33   l_log_string varchar2(400);
34   l_module_name varchar2(200);
35   l_proc_name varchar2(100) := 'cleanup_tables';
36   l_icx_schema_name VARCHAR2(30) ;
37   l_start_date          DATE;
38   l_end_date            DATE;
39 
40 BEGIN
41 
42   l_start_date := sysdate;
43 
44   IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
45       FND_LOG.string(FND_LOG.LEVEL_UNEXPECTED,
46         ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name, l_proc_name),
47         'Started at:' || TO_CHAR(l_start_date, 'DD-MON-YYYY HH24:MI:SS'));
48   END IF;
49 
50   l_icx_schema_name := ICX_CAT_UTIL_PVT.getIcxSchemaName;
51 
52   --Data removed from data migration tables
53   EXECUTE IMMEDIATE 'TRUNCATE TABLE '||l_icx_schema_name||'.ICX_CAT_R12_UPG_EXCEP_FILES';
54 
55   IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
56     l_log_string := 'ICX_CAT_R12_DATA_EXCEP_RPT_PVT.cleanup_tables deleting data
57                      from icx_cat_r12_upg_error_msgs';
58     l_module_name := ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name,l_proc_name);
59     FND_LOG.string(FND_LOG.LEVEL_UNEXPECTED, l_module_name, l_log_string);
60   END IF;
61 
62   EXECUTE IMMEDIATE 'TRUNCATE TABLE '||l_icx_schema_name||'.ICX_CAT_R12_UPG_ERROR_MSGS';
63 
64   l_end_date := sysdate;
65 
66   IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
67       FND_LOG.string(FND_LOG.LEVEL_UNEXPECTED,
68         ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name, l_proc_name),
69        ' done in:' || ICX_CAT_UTIL_PVT.getTimeStats(l_start_date, l_end_date));
70   END IF;
71 END;
72 
73 /**
74  ** Procedure : populate_language_map
75  ** Synopsis  : To populate the languages map
76  **/
77 PROCEDURE populate_language_map
78 IS
79   l_language_code_tbl DBMS_SQL.VARCHAR2_TABLE;
80   l_iso_territory_tbl DBMS_SQL.VARCHAR2_TABLE;
81   l_iso_language_tbl DBMS_SQL.VARCHAR2_TABLE;
82   l_nls_territory_tbl DBMS_SQL.VARCHAR2_TABLE;
83   l_nls_language_tbl DBMS_SQL.VARCHAR2_TABLE;
84   l_progress pls_integer;
85   l_log_string varchar2(400);
86   l_module_name varchar2(200);
87   l_proc_name varchar2(100) := 'populate_language_map';
88 
89 BEGIN
90   l_progress := 100;
91 
92   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
93     l_log_string := 'ICX_CAT_R12_DATA_EXCEP_RPT_PVT.populate_language_map started :--> '||
94                     'l_progress:' ||l_progress;
95     l_module_name := ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name,l_proc_name);
96     FND_LOG.string(FND_LOG.LEVEL_PROCEDURE, l_module_name, l_log_string);
97   END IF;
98 
99   -- Populating the territories list for each language
100   -- This list is used while populating the Catalog XML File
101   SELECT iso_territory, language_code, iso_language,nls_territory,nls_language BULK COLLECT INTO
102          l_iso_territory_tbl,
103          l_language_code_tbl,
104          l_iso_language_tbl,
105          l_nls_territory_tbl,
106          l_nls_language_tbl
107   FROM fnd_languages
108   WHERE installed_flag in ('B','I');
109 
110   l_progress := 110;
111 
112   FOR i in 1..l_language_code_tbl.COUNT
113   LOOP
114 
115     IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
116       l_log_string := 'populate_language_map: language code'||l_language_code_tbl(i)||
117                       'iso territory' || l_iso_territory_tbl(i)||
118                       'iso language'|| l_iso_language_tbl(i)||
119                       'nls territory' || l_nls_territory_tbl(i)||
120                       'nls language' || l_nls_language_tbl(i)||
121                       'l_progress:' ||l_progress;
122       l_module_name := ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name,l_proc_name);
123       FND_LOG.string(FND_LOG.LEVEL_STATEMENT, l_module_name, l_log_string);
124     END IF;
125 
126     g_territories(l_language_code_tbl(i)).iso_territory := l_iso_territory_tbl(i);
127     g_territories(l_language_code_tbl(i)).iso_language := l_iso_language_tbl(i);
128     g_territories(l_language_code_tbl(i)).nls_territory := l_nls_territory_tbl(i);
129     g_territories(l_language_code_tbl(i)).nls_language := l_nls_language_tbl(i);
130 
131   END LOOP;
132 
133    IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
134     l_log_string := 'ICX_CAT_R12_DATA_EXCEP_RPT_PVT.populate_language_map completed :--> '||
135                     'l_progress:' ||l_progress;
136     l_module_name := ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name,l_proc_name);
137     FND_LOG.string(FND_LOG.LEVEL_PROCEDURE, l_module_name, l_log_string);
138   END IF;
139 
140 END;
141 
142 /**
143  ** Procedure : process_data_exceptions_report
144  ** Synopsis  : Populates the exceptions file table
145  **
146  ** Parameter: p_batch_id--Batch_id
147  **/
148 PROCEDURE process_data_exceptions_report(p_batch_id IN po_headers_interface.batch_id%TYPE)
149 IS
150 
151   --Cursor fetching data from po_headers_interface
152   CURSOR interface_headers_cursor(p_batch_id NUMBER) IS
153   SELECT distinct pohi.interface_header_id,
154          pohi.vendor_id,
155          pohi.vendor_site_id,
156          pohi.org_id,
157          pohi.currency_code,
158          pohi.cpa_reference,
159          poai.language
160   FROM  po_headers_interface pohi,
161         po_attr_values_tlp_interface poai
162   WHERE pohi.batch_id = p_batch_id
163   AND poai.interface_header_id = pohi.interface_header_id
164   AND EXISTS (SELECT 1
165               FROM po_interface_errors poie
166               WHERE poie.interface_header_id = pohi.interface_header_id
167                   -- to retireve only those languages for which
168                   -- corresponding lines has errors
169               AND (poie.interface_line_id IS NULL OR
170                    poie.interface_line_id = poai.interface_line_id))
171   AND NOT EXISTS (SELECT 1
172 	          FROM icx_cat_r12_upg_excep_files
173 		  WHERE interface_header_id =  pohi.interface_header_id
174                   AND language = poai.language)
175   ORDER BY pohi.interface_header_id;
176 
177   --Tables for fetching Individual values from cursor
178   l_interface_header_id_tbl DBMS_SQL.NUMBER_TABLE;
179   l_vendor_id_tbl DBMS_SQL.NUMBER_TABLE;
180   l_vendor_site_id_tbl DBMS_SQL.NUMBER_TABLE;
181   l_org_id_tbl  DBMS_SQL.NUMBER_TABLE;
182   l_currency_code_tbl  DBMS_SQL.VARCHAR2_TABLE;
183   l_contract_num_tbl  DBMS_SQL.NUMBER_TABLE;
184   l_language_tbl  DBMS_SQL.VARCHAR2_TABLE;
185   l_progress PLS_INTEGER;
186   l_log_string varchar2(400);
187   l_module_name varchar2(200);
188   l_proc_name varchar2(100) := 'process_data_exceptions_report';
189   l_start_date          DATE;
190   l_end_date            DATE;
191 
192 BEGIN
193   l_progress := 100;
194 
195   l_start_date := sysdate;
196 
197   IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
198       FND_LOG.string(FND_LOG.LEVEL_UNEXPECTED,
199         ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name, l_proc_name),
200         'Started at:' || TO_CHAR(l_start_date, 'DD-MON-YYYY HH24:MI:SS') ||
201         'Parameters: p_batch_id:' || p_batch_id);
202   END IF;
203 
204   -- Set Batch Size if null
205   IF (ICX_CAT_UTIL_PVT.g_batch_size IS NULL) THEN
206     ICX_CAT_UTIL_PVT.setBatchSize();
207   END IF;
208 
209   -- clear the data from the upgrade tables
210   cleanup_tables;
211 
212   l_progress := 102;
213   -- populate the maps used in generating the information
214   populate_language_map;
215 
216   l_progress := 104;
217   -- Prepare the attributes list for 0 category id
218   populate_namevalue_xmltag(0);
219 
220   IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
221     l_log_string := 'process_data_exceptions_report :'||'Processing exceptions report for Batch Id : '
222                      ||p_batch_id||'l_progress:' ||l_progress;
223     l_module_name := ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name,l_proc_name);
224     FND_LOG.string(FND_LOG.LEVEL_STATEMENT, l_module_name, l_log_string);
225   END IF;
226 
227   l_progress := 110;
228   OPEN interface_headers_cursor(p_batch_id);
229   LOOP
230     l_interface_header_id_tbl.DELETE;
231     l_vendor_id_tbl.DELETE;
232     l_vendor_site_id_tbl.DELETE;
233     l_org_id_tbl.DELETE;
234     l_currency_code_tbl.DELETE;
235     l_contract_num_tbl.DELETE;
236     l_language_tbl.DELETE;
237 
238     FETCH interface_headers_cursor BULK COLLECT INTO
239           l_interface_header_id_tbl,
240           l_vendor_id_tbl,
241           l_vendor_site_id_tbl,
242           l_org_id_tbl,
243           l_currency_code_tbl,
244           l_contract_num_tbl,
245           l_language_tbl
246     LIMIT ICX_CAT_UTIL_PVT.g_batch_size;
247     EXIT WHEN l_interface_header_id_tbl.COUNT = 0;
248 
249     BEGIN
250       -- Inserting the data into Upgrade Exceptions File Table
251       FORALL headers_index IN 1..l_interface_header_id_tbl.COUNT
252         INSERT INTO icx_cat_r12_upg_excep_files (interface_header_id,
253                                                  vendor_id,
254                                                  vendor_site_id,
255                                                  org_id,
256                                                  currency_code,
257                                                  contract_num,
258                                                  language,
259                                                  data_file,
260                                                  creation_date,
261                                                  created_by,
262                                                  last_update_date,
263                                                  last_updated_by)
264          VALUES (l_interface_header_id_tbl(headers_index),
265                  l_vendor_id_tbl(headers_index),
266                  l_vendor_site_id_tbl(headers_index),
267                  l_org_id_tbl(headers_index),
268                  l_currency_code_tbl(headers_index),
269                  l_contract_num_tbl(headers_index),
270                  l_language_tbl(headers_index),
271                  EMPTY_CLOB(),
272                  SYSDATE,
273                  UPGRADE_USER_ID,
274                  SYSDATE,
275                  UPGRADE_USER_ID);
276 
277       l_progress := 120;
278       -- Populate the error messages table
279       populate_upg_error_msgs(l_interface_header_id_tbl);
280 
281       -- invoke procedure to update the record with the XML file.
282       populate_catalog_files(l_interface_header_id_tbl,
283                              l_vendor_id_tbl,
284                              l_vendor_site_id_tbl,
285                              l_org_id_tbl,
286                              l_currency_code_tbl,
287                              l_contract_num_tbl,
288                              l_language_tbl);
289 
290       COMMIT;
291     EXCEPTION
292       WHEN ICX_CAT_UTIL_PVT.g_snap_shot_too_old THEN
293         -- delete the data for which the xml file is not
294         -- yet generated. So that these lines can be
295         -- retrieved again
296        IF (FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
297          l_log_string := 'process_data_exceptions_report : Snapshot too old encountered'||
298                          'Deleting data from ICX_CAT_R12_UPG_EXCEP_FILES table'||
299                          'l_progress:' ||l_progress ||' '||SQLERRM;
300          l_module_name := ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name,l_proc_name);
301          FND_LOG.string(FND_LOG.LEVEL_EXCEPTION, l_module_name, l_log_string);
302        END IF;
303        DELETE FROM icx_cat_r12_upg_excep_files
304        WHERE file_name is null;
305        COMMIT;
306 
307         IF (interface_headers_cursor%ISOPEN) THEN
308           CLOSE interface_headers_cursor;
309           OPEN  interface_headers_cursor(p_batch_id);
310         END IF;
311     END;
312   END LOOP;
313 
314   IF (interface_headers_cursor%ISOPEN) THEN
315     CLOSE interface_headers_cursor;
316   END IF;
317 
318   l_end_date := sysdate;
319 
320   IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
321       FND_LOG.string(FND_LOG.LEVEL_UNEXPECTED,
322         ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name, l_proc_name),
323        ' done in:' || ICX_CAT_UTIL_PVT.getTimeStats(l_start_date, l_end_date));
324   END IF;
325 
326 EXCEPTION
327   WHEN OTHERS THEN
328   ICX_CAT_UTIL_PVT.logUnexpectedException(
329       g_pkg_name, l_proc_name,' --> l_progress:' ||l_progress||' '|| SQLERRM);
330   RAISE;
331 END process_data_exceptions_report;
332 
333 /**
334  ** Procedure : populate_catalog_files
335  ** Synopsis  : Populates the exceptions file in XML Format
336  **
337  ** Parameter:
338  **     IN     p_interface_header_id_tbl
339  **            p_vendor_id_tbl
340  **            p_vendor_site_id_tbl
341  **            p_org_id_tbl
342  **            p_currency_code_tbl
343  **            p_contract_num_tbl
344  **            p_language_tbl
345  **/
346 PROCEDURE populate_catalog_files(p_interface_header_id_tbl IN DBMS_SQL.NUMBER_TABLE,
347                                  p_vendor_id_tbl           IN DBMS_SQL.NUMBER_TABLE,
348                                  p_vendor_site_id_tbl      IN DBMS_SQL.NUMBER_TABLE,
349                                  p_org_id_tbl              IN DBMS_SQL.NUMBER_TABLE,
350                                  p_currency_code_tbl       IN DBMS_SQL.VARCHAR2_TABLE,
351                                  p_contract_num_tbl        IN DBMS_SQL.NUMBER_TABLE,
352                                  p_language_tbl            IN DBMS_SQL.VARCHAR2_TABLE)
353 IS
354   -- List of category ids for which the line exists in
355   -- interface errors and attr values tlp tables.
356   Cursor category_ids_cursor(p_interface_header_id number,
357                              p_language varchar2) is
358     SELECT distinct poli.ip_category_id
359     FROM   po_lines_interface poli
360     WHERE  poli.interface_header_id = p_interface_header_id
361       AND  EXISTS (SELECT 1
362                    FROM  po_interface_errors poie
363                    WHERE poie.interface_header_id = poli.interface_header_id
364   	                 AND (poie.interface_line_id IS NULL OR
365 	                       poie.interface_line_id = poli.interface_line_id))
366       AND  EXISTS (SELECT 1
367                    FROM  po_attr_values_tlp_interface poai
368                    WHERE poai.interface_header_id = poli.interface_header_id
369                      AND poai.interface_line_id = poli.interface_line_id
370 	                   AND poai.language = p_language);
371 
372   l_ip_category_id_tbl DBMS_SQL.NUMBER_TABLE;
373   l_mainXML CLOB;
374   l_headerXML CLOB;
375   l_linesXML CLOB;
376 
377   l_progress PLS_INTEGER;
378 
379   l_interface_header_id NUMBER;
380   l_ip_category_id NUMBER;
381   l_language icx_cat_r12_upg_excep_files.language%TYPE;
382 
383   langCount number := 1;
384   l_file_name icx_cat_r12_upg_excep_files.file_name%TYPE;
385   l_table_count NUMBER;
386   l_prev_interface_header_id NUMBER := 0;
387   l_log_string varchar2(400);
388   l_module_name varchar2(200);
389   l_proc_name varchar2(100) := 'populate_catalog_files';
390   l_start_date          DATE;
391   l_end_date            DATE;
392   headers_index NUMBER := 1;
393 BEGIN
394    l_progress := 100;
395 
396    l_start_date := sysdate;
397 
398    IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
399       FND_LOG.string(FND_LOG.LEVEL_UNEXPECTED,
400         ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name, l_proc_name),
401         'Started at:' || TO_CHAR(l_start_date, 'DD-MON-YYYY HH24:MI:SS'));
402    END IF;
403    l_table_count := p_interface_header_id_tbl.COUNT;
404    -- iterate through the interface headers in the PL/SQL table
405    WHILE headers_index <= l_table_count  LOOP
406      l_interface_header_id := p_interface_header_id_tbl(headers_index);
407      l_language := p_language_tbl(headers_index);
408 
409      IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
410        l_log_string := 'populate_catalog_files; '||' interface header id '|| l_interface_header_id
411                        ||'Session Alter to nls language'||g_territories(l_language).nls_language
412                        ||'and nls territory'|| g_territories(l_language).nls_territory;
413        l_module_name := ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name,l_proc_name);
414        FND_LOG.string(FND_LOG.LEVEL_STATEMENT, l_module_name, l_log_string);
415      END IF;
416 
417      EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_LANGUAGE = '''|| g_territories(l_language).nls_language ||'''';
418      EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_TERRITORY ='''|| g_territories(l_language).nls_territory||'''';
419 
420 
421      l_progress := 120;
422      -- Prepare the XML containing header information
423      IF ( l_interface_header_id <> l_prev_interface_header_id) THEN
424        generate_header_section(l_interface_header_id, l_mainXML);
425        l_prev_interface_header_id := l_interface_header_id;
426      END IF;
427 
428      l_progress := 130;
429      l_headerXML := l_mainXML;
430      l_linesXML := EMPTY_CLOB();
431 
432      l_progress := 140;
433      -- Prepare Line Level XML loop through the categories
434      OPEN category_ids_cursor(l_interface_header_id, l_language);
435      LOOP
436        l_ip_category_id_tbl.DELETE;
437        FETCH category_ids_cursor BULK COLLECT INTO
438 	     l_ip_category_id_tbl
439        LIMIT ICX_CAT_UTIL_PVT.g_batch_size;
440 
441        l_progress := 150;
442        EXIT when l_ip_category_id_tbl.COUNT=0;
443 
444        l_progress := 160;
445        -- Loop through each category
446        FOR category_index in 1..l_ip_category_id_tbl.COUNT
447        LOOP
448          l_ip_category_id := l_ip_category_id_tbl(category_index);
449 
450          IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
451            l_log_string := 'populate_catalog_files; '||' category id '|| l_ip_category_id;
452            l_module_name := ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name,l_proc_name);
453            FND_LOG.string(FND_LOG.LEVEL_STATEMENT, l_module_name, l_log_string);
454          END IF;
455 
456          l_progress := 170;
457          -- Generate Lines section for the lines that have the category id
458          -- as l_ip_category_id
459          generate_lines_section(l_interface_header_id, l_ip_category_id, l_language,
460                                 l_linesXML);
461          l_progress := 180;
462        END LOOP;  -- end of categories FOR Loop
463      END LOOP; -- end of categories lines cursor
464 
465      IF (category_ids_cursor%ISOPEN) THEN
466        CLOSE category_ids_cursor;
467      END IF;
468 
469      l_progress := 190;
470      replace_clob('R12_ITEM_DET', l_linesXML, l_headerXML, false);
471      replace_clob('<CATALOG>',
472                   '<CATALOG xml:lang="'||
473 			g_territories(l_language).iso_language||'-'||
474 			g_territories(l_language).iso_territory||'">',
475                   l_headerXML, false);
476      l_file_name := 'ItemException_'||l_language||'.xml';
477      -- if current language is same as the language in the PL/SQL Table
478      -- then update the current row
479      l_progress := 200;
480 
481      IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
482        l_log_string := 'populate_catalog_files : updating existing rows';
483        l_module_name := ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name,l_proc_name);
484        FND_LOG.string(FND_LOG.LEVEL_STATEMENT, l_module_name, l_log_string);
485      END IF;
486      --update the table
487 
488      UPDATE icx_cat_r12_upg_excep_files
489      SET  file_name = l_file_name,
490           data_file = l_headerXML
491      WHERE interface_header_id = l_interface_header_id
492        AND language = l_language;
493 
494     headers_index := headers_index + 1 ;
495   END LOOP; -- end of interface header ids for loop
496 
497   l_end_date := sysdate;
498 
499   IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
500       FND_LOG.string(FND_LOG.LEVEL_UNEXPECTED,
501         ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name, l_proc_name),
502        ' done in:' || ICX_CAT_UTIL_PVT.getTimeStats(l_start_date, l_end_date));
503   END IF;
504 
505 EXCEPTION
506   WHEN OTHERS THEN
507     ICX_CAT_UTIL_PVT.logUnexpectedException(
508       g_pkg_name, l_proc_name,' --> l_progress:' ||l_progress||' '|| SQLERRM);
509   RAISE;
510 END populate_catalog_files;
511 
512 /**
513  ** Procedure : populate_upg_error_msgs
514  ** Synopsis  : Procedure For Populating
515  **             ICX_CAT_R12_UPG_Error_Msgs Table.
516  ** Parameter:
517  **     IN     p_interface_header_id_tbl  --table of interface_header_ids
518  **/
519 PROCEDURE populate_upg_error_msgs(p_interface_header_id_tbl IN DBMS_SQL.NUMBER_TABLE)
520 IS
521   --cursor for fetching column value to be populated
522   -- as token value in the error messages table
523   CURSOR interface_errors_cursor(p_interface_header_id po_interface_errors.INTERFACE_HEADER_ID%TYPE)
524   IS
525    SELECT error_message_name,
526           LTRIM(replace(MAX(SYS_CONNECT_BY_PATH(column_value, '**R12MDIGREPL**'))
527           KEEP (DENSE_RANK LAST ORDER BY curr),'**R12MDIGREPL**', ','),',') AS token_value
528    FROM (SELECT error_message_name,
529                  column_value,
530                  ROW_NUMBER() OVER (PARTITION BY error_message_name ORDER BY column_value) AS curr,
531                  ROW_NUMBER() OVER (PARTITION BY error_message_name ORDER BY column_value) -1 AS prev
532            FROM po_interface_errors
533            WHERE interface_header_id = p_interface_header_id
534              AND error_message_name <> 'ICX_CAT_UPG_ALL_LINES_FAILED'
535            GROUP BY error_message_name, column_value)
536     GROUP BY error_message_name
537     CONNECT BY prev = PRIOR curr AND error_message_name = PRIOR error_message_name
538     START WITH curr = 1;
539 
540   l_po_msg_tbl DBMS_SQL.VARCHAR2_TABLE;
541   l_column_value_tbl DBMS_SQL.VARCHAR2_TABLE;
542   l_interface_header_id NUMBER;
543   l_prev_interface_header_id NUMBER := 0;
544   l_progress PLS_integer;
545   l_log_string varchar2(400);
546   l_module_name varchar2(200);
547   l_start_date          DATE;
548   l_end_date            DATE;
549   l_proc_name varchar2(100) := 'populate_upg_error_msgs';
550 
551 BEGIN
552   l_progress :=100;
553 
554   l_start_date := sysdate;
555 
556   IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
557      FND_LOG.string(FND_LOG.LEVEL_UNEXPECTED,
558        ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name, l_proc_name),
559        'Started at:' || TO_CHAR(l_start_date, 'DD-MON-YYYY HH24:MI:SS'));
560   END IF;
561 
562   FOR header_id_index IN 1..p_interface_header_id_tbl.COUNT
563   LOOP
564     --Loop to through interface errors cursor
565     l_interface_header_id := p_interface_header_id_tbl(header_id_index);
566 
567     IF (l_interface_header_id <> l_prev_interface_header_id) THEN
568 
569       IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
570         l_log_string := 'populate_upg_error_msgs:'||'Inserting messages for interface header id'
571                         ||l_interface_header_id|| 'l_progress:' ||l_progress;
572         l_module_name := ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name,l_proc_name);
573         FND_LOG.string(FND_LOG.LEVEL_UNEXPECTED, l_module_name, l_log_string);
574       END IF;
575 
576       OPEN interface_errors_cursor(p_interface_header_id_tbl(header_id_index));
577       LOOP
578         FETCH interface_errors_cursor BULK COLLECT INTO
579               l_po_msg_tbl,
580               l_column_value_tbl
581         LIMIT ICX_CAT_UTIL_PVT.g_batch_size;
582 
583         l_progress := 110;
584         EXIT WHEN l_po_msg_tbl.COUNT = 0;
585 
586         l_progress := 120;
587         FORALL i IN 1..l_po_msg_tbl.COUNT
588           INSERT INTO icx_cat_r12_upg_error_msgs(interface_header_id,
589                                                  error_message_name,
590                                                  token_value,
591                                                  creation_date,
592                                                  created_by,
593                                                  last_update_date,
594                                                  last_updated_by,
595                                                  last_update_login)
596           VALUES (p_interface_header_id_tbl(header_id_index),
597                   l_po_msg_tbl(i),
598                   l_column_value_tbl(i),
599                   SYSDATE,
600                   UPGRADE_USER_ID,
601                   SYSDATE,
602                   UPGRADE_USER_ID,
603                   NULL);
604       END LOOP;
605 
606       IF (interface_errors_cursor%ISOPEN) THEN
607         CLOSE interface_errors_cursor;
608       END IF;
609     END IF;
610 
611      l_prev_interface_header_id := l_interface_header_id;
612 
613   END LOOP;
614 
615   l_end_date := sysdate;
616 
617   IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
618       FND_LOG.string(FND_LOG.LEVEL_UNEXPECTED,
619         ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name, l_proc_name),
620        ' done in:' || ICX_CAT_UTIL_PVT.getTimeStats(l_start_date, l_end_date));
621   END IF;
622 
623 EXCEPTION
624   WHEN OTHERS THEN
625     ICX_CAT_UTIL_PVT.logUnexpectedException(
626       g_pkg_name, l_proc_name,' --> l_progress:' ||l_progress||' '|| SQLERRM);
627   RAISE;
628 END populate_upg_error_msgs;
629 
630 /**
631  ** Procedure : generate_header_section
632  ** Synopsis  : Function that returns the XML containing
633  **             Header details
634  **
635  ** Parameter:
636  **     IN     p_interface_header_id  -- interface header id
637  **     IN OUT
638  **            x_header_XML         -- Clob containing header XML
639  **/
640 PROCEDURE generate_header_section(p_interface_header_id IN number,
641                                   x_header_XML IN OUT NOCOPY CLOB)
642 IS
643   l_qryString VARCHAR2(4000);
644   l_params xml_bind_params;
645   l_progress PLS_INTEGER;
646   l_log_string varchar2(400);
647   l_module_name varchar2(200);
648   l_start_date          DATE;
649   l_end_date            DATE;
650   l_proc_name varchar2(100) := 'generate_header_section';
651 
652 BEGIN
653   l_progress := 100;
654 
655   l_start_date := sysdate;
656 
657   IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
658      FND_LOG.string(FND_LOG.LEVEL_UNEXPECTED,
659        ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name, l_proc_name),
660        'Started at:' || TO_CHAR(l_start_date, 'DD-MON-YYYY HH24:MI:SS') ||
661        'Parameters: p_interface_header_id:' || p_interface_header_id);
662   END IF;
663 
664   l_qryString := 'SELECT XMLConcat(
665               XMLElement("ADMIN",
666  	       XMLElement("NAME", ''CATALOG EXT''),
667 	       XMLElement("INFORMATION",
668 	        XMLElement("SOURCE", ''RELEASE 12 UPGRADE''),
669 	        XMLElement("DATE", sysdate))),
670                XMLElement("DATA",
671 	        XMLElement("DOCUMENT",
672                  XMLAttributes(''GBPA'' as "type"),
673 	          XMLElement("HEADER",
674                    XMLElement("DOCUMENT_NUMBER", pohi.document_num),
675                    XMLElement("OPERATING_UNIT",
676 		   XMLElement("OWNING_ORG", hro.name)),
677   		   XMLElement("SUPPLIER_NAME", pv.vendor_name),
678                    XMLElement("SUPPLIER_SITE", pvs.vendor_site_Code),
679  		   XMLElement("CURRENCY", pohi.currency_code)),
680 		   XMLElement("LINES", ''R12_ITEM_DET'')))) AS CATALOG
681       FROM  po_headers_interface pohi, HR_ALL_ORGANIZATION_UNITS hro,
682             po_vendors pv, po_vendor_sites_all pvs
683       WHERE pohi.interface_header_id = :INTERFACE_HEADER_ID
684         AND pohi.org_id = hro.organization_id (+)
685         AND pohi.vendor_id = pv.vendor_id (+)
686         AND pohi.vendor_site_id = pvs.vendor_site_id (+)';
687 
688   IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
689    l_log_string := 'generate_lines_section:'||'Binding parameters :interface header id'
690                    ||p_interface_header_id;
691    l_module_name := ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name,l_proc_name);
692    FND_LOG.string(FND_LOG.LEVEL_STATEMENT, l_module_name, l_log_string);
693  END IF;
694 
695   -- Set the bind parameter values
696   l_params := xml_bind_params(null);
697   l_params(1).name := 'INTERFACE_HEADER_ID';
698   l_params(1).value := to_char(p_interface_header_id);
699 
700   l_progress := 110;
701   x_header_XML := get_xml(l_qryString, l_params);
702 
703   l_end_date := sysdate;
704 
705   IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
706       FND_LOG.string(FND_LOG.LEVEL_UNEXPECTED,
707         ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name, l_proc_name),
708        ' done in:' || ICX_CAT_UTIL_PVT.getTimeStats(l_start_date, l_end_date));
709   END IF;
710 
711 EXCEPTION
712  WHEN OTHERS THEN
713   ICX_CAT_UTIL_PVT.logUnexpectedException(
714       g_pkg_name, l_proc_name,' --> l_progress:' ||l_progress||' '|| SQLERRM);
715   RAISE;
716 END generate_header_section;
717 
718 /*
719  ** Procedure : generate_lines_section
720  ** Synopsis  : Function that returns the XML containing
721  **             Line Level Data
722  **
723  ** Parameter:
724  **     IN     p_interface_header_id  -- interface header id
725  **            p_interface_line_id -- interface line id
726  **            p_category_id       -- Category id
727  **     IN OUT
728  **            x_lines_XML         -- Clob containing Lines XML
729  **/
730 PROCEDURE generate_lines_section(p_interface_header_id IN NUMBER,
731                                  p_category_id IN NUMBER,
732 		                 p_language IN VARCHAR2,
733 		                 x_lines_XML IN OUT NOCOPY CLOB)
734 IS
735   l_qryString varchar2(30000);
736   l_params xml_bind_params;
737   x_result CLOB;
738   l_attr_list varchar2(18000);
739   l_progress PLS_INTEGER;
740   l_shopping_category icx_cat_categories_tl.key%TYPE;
741   l_att_list_qry  varchar2(20000);
742   l_log_string varchar2(400);
743   l_module_name varchar2(200);
744   l_start_date          DATE;
745   l_end_date            DATE;
746   l_proc_name varchar2(100) := 'generate_lines_section';
747 BEGIN
748 
749   l_start_date := sysdate;
750 
751   IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
752      FND_LOG.string(FND_LOG.LEVEL_UNEXPECTED,
753        ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name, l_proc_name),
754        'Started at:' || TO_CHAR(l_start_date, 'DD-MON-YYYY HH24:MI:SS') ||
755        'Parameters: p_interface_header_id:' || p_interface_header_id||
756        ',p_category_id'|| p_category_id||
757        ',p_language'||p_language);
758   END IF;
759 
760   l_progress := 100;
761   -- Retrieve the descriptors list (NameValue string).
762   -- If the lines in two different interface headers have the
763   -- same category id then there is no need to populate the list
764   -- again for the lines of second interface header id.
765   -- Hence invoke the call to populate if data doesn't exist.
766   BEGIN
767     l_progress := 110;
768     IF (p_category_id IS NULL) THEN
769       l_attr_list := ' ';
770     ELSE
771       l_attr_list := g_descriptors_list(p_category_id);
772     END IF;
773   EXCEPTION
774     when no_data_found then
775       IF (FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
776         l_log_string := 'generate_lines_section:'||'No data found in g_descriptors_list'||
777                         'Invoking populate_namevalue_xmltag for category id'||p_category_id;
778         l_module_name := ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name, l_proc_name);
779         FND_LOG.string(FND_LOG.LEVEL_EXCEPTION, l_module_name, l_log_string);
780       END IF;
781       populate_namevalue_xmltag(p_category_id);
782       l_attr_list := g_descriptors_list(p_category_id);
783   END;
784 
785   l_progress := 120;
786   BEGIN
787     SELECT distinct icat.key
788     INTO l_shopping_category
789     FROM icx_cat_categories_tl icat
790     WHERE icat.rt_category_id = p_category_id;
791   EXCEPTION
792     when no_data_found then
793       IF (FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
794         l_log_string := 'generate_lines_section:'||'No data found in icx_cat_categories_tl'||
795                         'Assigning '' '' to shopping category for category id :'||p_category_id;
796         l_module_name := ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name, l_proc_name);
797         FND_LOG.string(FND_LOG.LEVEL_EXCEPTION, l_module_name, l_log_string);
798       END IF;
799       l_shopping_category := ' ';
800   END;
801 
802   l_att_list_qry := ' ';
803   if (length(l_attr_list) > 2) then
804     l_att_list_qry :=
805          'XMLElement("DMIG_NVP", '|| l_attr_list ||'),';
806    end if;
807 
808    l_progress := 130;
809    l_qryString :=
810          'SELECT XMLAgg(
811     	      XMLElement("ITEM",
812   	      XMLAttributes(''SYNC'' as "action"),
813               XMLElement("SHOPPING_CATEGORY", :SHOPPING_CAT),
814 	      XMLELEMENT("SUPPLIER_PART_NUM", nvl(to_char(poli.vendor_product_num), ''  '')),
815               XMLElement("SUPPLIER_PART_AUXID", nvl(decode (poli.supplier_part_auxid,''##NULL##'','' '',
816                                                             poli.supplier_part_auxid),''  '')),
817 	      XMLElement("DMIG_NVP", '|| g_descriptors_list(0) ||'),
818 	      '|| l_att_list_qry ||'
819 	      XMLElement("PRICE",
820               XMLAttributes(nvl(poli.negotiated_by_preparer_flag, '' '') as "negotiated"),
821  	      XMLElement("UNIT_PRICE", poli.unit_price),
822 	      XMLElement("UNIT_OF_MEASURE", poli.uom_code)
823 	      ))) AS ITEMS_INF
824            FROM po_lines_interface poli, po_attr_values_tlp_interface poavti, po_attr_values_interface poavi
825           WHERE poli.interface_header_id = :INTERFACE_HEADER_ID
826             AND poli.ip_category_id = :IP_CATEGORY_ID
827             AND poavi.interface_header_id = poli.interface_header_id
828             AND poavi.interface_line_id = poli.interface_line_id
829             AND poavti.interface_header_id = poli.interface_header_id
830             AND poavti.interface_line_id = poli.interface_line_id
831             AND poavti.language = :LANGUAGE
832 	    AND EXISTS (SELECT 1 FROM po_interface_errors poie
833                          WHERE poie.interface_header_id = poli.interface_header_id
834   	                   AND (poie.interface_line_id IS NULL OR
835 	                        poie.interface_line_id = poli.interface_line_id))';
836 
837 
838  IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
839    l_log_string := 'generate_lines_section:'||'Binding parameters :interface header id'
840                    ||p_interface_header_id||', IP CATEGORY ID:'|| p_category_id
841                    ||', LANGUAGE'|| p_language ||', SHOPPING CATEGORY' || l_shopping_category;
842    l_module_name := ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name,l_proc_name);
843    FND_LOG.string(FND_LOG.LEVEL_UNEXPECTED, l_module_name, l_log_string);
844  END IF;
845 
846   -- Set the bind parameter values
847   l_params := xml_bind_params(null, null, null, null);
848   l_params(1).name := 'SHOPPING_CAT';
849   l_params(1).value := nvl(l_shopping_category, ' ');
850 
851   l_params(2).name := 'INTERFACE_HEADER_ID';
852   l_params(2).value := to_char(p_interface_header_id);
853 
854   l_params(3).name := 'IP_CATEGORY_ID';
855   l_params(3).value := to_char(p_category_id);
856 
857   l_params(4).name := 'LANGUAGE';
858   l_params(4).value := to_char(p_language);
859 
860   l_progress := 140;
861   x_result := get_xml(l_qryString, l_params);
862 
863 
864   l_progress := 150;
865   -- replace the <DMIG_NVP> tags with null. These are appeneded as
866   -- a part of building the name value pair in the above query.
867   replace_clob('<DMIG_NVP>', ' ', x_result);
868   replace_clob('</DMIG_NVP>', ' ', x_result);
869   replace_clob('<ITEMS_INF>', ' ', x_result);
870   replace_clob('</ITEMS_INF>', ' ', x_result);
871   replace_clob('<?xml version="1.0"?>', ' ', x_result, false);
872 
873   l_progress := 160;
874 
875   IF (dbms_lob.getlength(x_lines_XML) > 0) THEN
876     dbms_lob.append(x_lines_XML, x_result);
877   ELSE
878      x_lines_XML := x_result;
879   END IF;
880 
881   l_end_date := sysdate;
882 
883   IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
884       FND_LOG.string(FND_LOG.LEVEL_UNEXPECTED,
885         ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name, l_proc_name),
886        ' done in:' || ICX_CAT_UTIL_PVT.getTimeStats(l_start_date, l_end_date));
887   END IF;
888 
889 EXCEPTION
890  WHEN OTHERS THEN
891   ICX_CAT_UTIL_PVT.logUnexpectedException(
892       g_pkg_name, l_proc_name,' --> l_progress:' ||l_progress||' '|| SQLERRM);
893   RAISE;
894 END generate_lines_section;
895 
896 /**
897  ** Procedure : get_xml
898  ** Synopsis  : To create an XML
899  **
900  ** Parameter:
901  **     IN     p_qryctx     --  Query String
902  **            p_bind_params -- Bind Parameters for the XML Query
903  **            p_row_tag     -- Row Tag to set, default NULL
904  **            p_row_settag  -- Row SetTag to set, default NULL
905  ** Retruns    XML object.
906  **/
907 FUNCTION get_xml(p_qryString IN VARCHAR2,
908  	               p_bind_params IN xml_bind_params,
909  	               p_row_tag IN VARCHAR2,
910  	               p_row_settag IN VARCHAR2)
911   RETURN CLOB
912 IS
913   x_result CLOB;
914   l_progress PLS_INTEGER;
915   l_qryctx DBMS_XMLGEN.ctxhandle;
916   l_log_string varchar2(400);
917   l_module_name varchar2(200);
918   l_start_date          DATE;
919   l_end_date            DATE;
920   l_proc_name varchar2(100) := 'get_xml';
921 BEGIN
922   l_progress := 100;
923   l_start_date := sysdate;
924   IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
925      FND_LOG.string(FND_LOG.LEVEL_UNEXPECTED,
926        ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name, l_proc_name),
927        'Started at:' || TO_CHAR(l_start_date, 'DD-MON-YYYY HH24:MI:SS'));
928   END IF;
929   -- Set the bind parameters
930   l_qryctx := DBMS_XMLGEN.newcontext(p_qryString);
931 
932   FOR i in 1..p_bind_params.COUNT
933   LOOP
934     DBMS_XMLGEN.setBindValue(l_qryctx, p_bind_params(i).name,
935                              p_bind_params(i).value);
936   END LOOP;
937 
938   l_progress := 110;
939   -- Set the row tag and rowset tag
940   DBMS_XMLGEN.setRowTag(l_qryctx, p_row_tag);
941   DBMS_XMLGEN.setRowsetTag(l_qryctx, p_row_settag);
942 
943   DBMS_XMLGEN.setNullHandling(l_qryctx, DBMS_XMLGEN.EMPTY_TAG);
944   DBMS_XMLGEN.setConvertSpecialChars(l_qryctx, TRUE);
945 
946   IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
947     l_log_string := 'get_xml: Invoking XMLgen for XML generation';
948     l_module_name := ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name,l_proc_name);
949     FND_LOG.string(FND_LOG.LEVEL_STATEMENT, l_module_name, l_log_string);
950   END IF;
951 
952   l_progress := 120;
953   x_result:=DBMS_XMLGEN.getXML(l_qryctx);
954 
955   l_progress := 130;
956   DBMS_XMLGEN.closecontext(l_qryctx);
957 
958   l_progress := 140;
959   return x_result;
960 
961   l_end_date := sysdate;
962 
963   IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
964       FND_LOG.string(FND_LOG.LEVEL_UNEXPECTED,
965         ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name, l_proc_name),
966        ' done in:' || ICX_CAT_UTIL_PVT.getTimeStats(l_start_date, l_end_date));
967   END IF;
968 
969 EXCEPTION
970  WHEN OTHERS THEN
971    ICX_CAT_UTIL_PVT.logUnexpectedException(
972       g_pkg_name, l_proc_name,' --> l_progress:' ||l_progress||' '|| SQLERRM);
973   RAISE;
974 END get_xml;
975 
976 /**
977  ** Procedure : populate_namevalue_xmltag
978  ** Synopsis  : To Populate the Attribute Value List that contains
979  **             key, stored in columns of both the translatable
980  **             and non-translatable interface tables.
981  **
982  ** Parameter:
983  **     IN     p_category_id -- Category Id
984  **/
985 PROCEDURE populate_namevalue_xmltag(p_category_id IN NUMBER)
986 IS
987   TYPE descriptors_rec_type IS RECORD(
988            key              icx_cat_attributes_tl.KEY%TYPE,
989 	   stored_in_table  icx_cat_attributes_tl.STORED_IN_TABLE%TYPE,
990 	   stored_in_column icx_cat_attributes_tl.STORED_IN_COLUMN%TYPE);
991 
992   TYPE descriptors_tbl_type IS TABLE OF descriptors_rec_type;
993   l_descriptors_tbl descriptors_tbl_type;
994 
995   l_attr_list VARCHAR2(18000);
996   l_progress PLS_INTEGER;
997   l_log_string varchar2(400);
998   l_module_name varchar2(200);
999   l_start_date          DATE;
1000   l_end_date            DATE;
1001   l_proc_name varchar2(100):= 'populate_namevalue_xmltag' ;
1002 BEGIN
1003   l_progress := 100;
1004 
1005   l_start_date := sysdate;
1006 
1007   IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1008      FND_LOG.string(FND_LOG.LEVEL_UNEXPECTED,
1009        ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name, l_proc_name),
1010        'Started at:' || TO_CHAR(l_start_date, 'DD-MON-YYYY HH24:MI:SS'));
1011   END IF;
1012 
1013   -- Query to select the attributes of a category
1014   SELECT distinct replace(key, '''', ''''''),
1015 	 decode(stored_in_table,
1016             'PO_ATTRIBUTE_VALUES', 'poavi',
1017             'PO_ATTRIBUTE_VALUES_TLP', 'poavti')
1018                stored_in_table,
1019 	 stored_in_column
1020   BULK COLLECT INTO l_descriptors_tbl
1021   FROM icx_cat_attributes_tl
1022   WHERE rt_category_id = p_category_id
1023     AND stored_in_Table is not null
1024     AND stored_in_column is not null;
1025 
1026   l_progress := 110;
1027 
1028   IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1029     l_log_string := 'populate_namevalue_xmltag: Concatenating values to generate XML Query String';
1030     l_module_name := ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name,l_proc_name);
1031     FND_LOG.string(FND_LOG.LEVEL_STATEMENT, l_module_name, l_log_string);
1032   END IF;
1033 
1034   IF (l_descriptors_tbl.COUNT = 0) THEN
1035     l_attr_list := ' ';
1036   ELSE
1037     l_progress := 120;
1038     -- Forming a string that contains the key, stored in columns as
1039     -- XMLElement("NAMEVALUE", XMLAttributes( key as "name),
1040     --      stored_in_table.stored_in_column)
1041     l_attr_list := 'XMLElement("NAMEVALUE", XMLAttributes('''||
1042                    l_descriptors_tbl(1).key||''' as "name"),'||
1043                    l_descriptors_tbl(1).stored_in_table||'.'||
1044                    l_descriptors_tbl(1).stored_in_column|| ')';
1045 
1046     FOR n in 2..l_descriptors_tbl.COUNT
1047     LOOP
1048       l_attr_list := l_attr_list || ', XMLElement("NAMEVALUE", XMLAttributes('''||
1049                      l_descriptors_tbl(n).key||''' as "name"),'||
1050                      l_descriptors_tbl(n).stored_in_table||'.'||
1051                      l_descriptors_tbl(n).stored_in_column|| ')';
1052     END LOOP;
1053   END IF;
1054 
1055   l_progress := 130;
1056   -- Assign this string to the descriptors list hash
1057   g_descriptors_list(p_category_id) := l_attr_list;
1058 
1059   l_end_date := sysdate;
1060 
1061   IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1062       FND_LOG.string(FND_LOG.LEVEL_UNEXPECTED,
1063         ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name, l_proc_name),
1064        ' done in:' || ICX_CAT_UTIL_PVT.getTimeStats(l_start_date, l_end_date));
1065   END IF;
1066 
1067 EXCEPTION
1068   WHEN OTHERS THEN
1069   ICX_CAT_UTIL_PVT.logUnexpectedException(
1070       g_pkg_name, l_proc_name,' --> l_progress:' ||l_progress||' '|| SQLERRM);
1071   RAISE;
1072 END populate_namevalue_xmltag;
1073 
1074 /*
1075  ** Procedure : replace_clob
1076  ** Synopsis  : Replaces the substring of the CLOB with
1077  **             given string
1078  **
1079  ** Parameter:
1080  **     IN     p_replace_str  -- String to be replaced
1081  **            p_replace_with -- String to replace with
1082  **     IN OUT p_src_clob     -- source object
1083  **/
1084 PROCEDURE replace_clob (p_replace_str IN VARCHAR2,
1085                         p_replace_with IN CLOB,
1086                         p_src_clob IN OUT NOCOPY CLOB,
1087                         p_replace_mutliple_occurances IN BOOLEAN)
1088 IS
1089   x_result CLOB := ' ';
1090   l_variablePosition number;
1091   l_new_variablePosition number;
1092   l_progress PLS_INTEGER;
1093   l_replace_str_length number;
1094   l_replace_with_length number;
1095   l_repeated_flag boolean := FALSE;
1096   l_log_string varchar2(400);
1097   l_module_name varchar2(200);
1098   l_proc_name varchar2(100):= 'replace_clob' ;
1099 
1100 BEGIN
1101   l_progress := 110;
1102 
1103   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1104     l_log_string := 'ICX_CAT_R12_DATA_EXCEP_RPT_PVT.replace_clob started:-->'||
1105                   'l_progress:' ||l_progress;
1106     l_module_name := ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name,l_proc_name);
1107     FND_LOG.string(FND_LOG.LEVEL_PROCEDURE, l_module_name, l_log_string);
1108   END IF;
1109 
1110    IF (dbms_lob.getlength(p_src_clob) > 0 and length(p_replace_with) > 0)THEN
1111     dbms_lob.createtemporary(x_result, false);
1112     l_variablePosition := DBMS_LOB.INSTR(p_src_clob, p_replace_str );
1113 
1114    l_progress := 120;
1115    IF (l_variablePosition >=1) THEN
1116      l_replace_str_length := length(p_replace_str);
1117      l_replace_with_length := length(p_replace_with);
1118 
1119      l_progress := 130;
1120      IF (l_variablePosition > 1) THEN
1121        dbms_lob.copy(x_result, p_src_clob, l_variablePosition-1, 1, 1);
1122      END IF;
1123      l_progress := 140;
1124      dbms_lob.append(x_result,p_replace_with);
1125      l_progress := 150;
1126      l_variablePosition := l_variablePosition + l_replace_str_length;
1127 
1128       IF (p_replace_mutliple_occurances) THEN
1129         LOOP
1130           l_progress := 160;
1131           l_new_variablePosition := DBMS_LOB.INSTR(p_src_clob,
1132                                       p_replace_str, l_variablePosition);
1133           EXIT WHEN l_new_variablePosition < 1;
1134 
1135           l_progress := 170;
1136           IF (l_new_variablePosition > 1 and
1137             l_new_variablePosition <> l_variablePosition ) THEN
1138             dbms_lob.copy(x_result, p_src_clob,
1139             l_new_variablePosition - l_variablePosition,
1140             dbms_lob.getlength(x_result)+1, l_variablePosition);
1141           END IF;
1142 
1143           l_progress := 180;
1144           dbms_lob.writeappend(x_result, l_replace_with_length, p_replace_with);
1145 
1146           l_progress := 190;
1147           l_variablePosition := l_new_variablePosition + l_replace_str_length;
1148           l_repeated_flag := TRUE;
1149               END LOOP;
1150         IF (l_repeated_flag) THEN
1151           l_variablePosition := l_variablePosition + l_replace_str_length;
1152         END IF;
1153       END IF;
1154 
1155       l_progress := 200;
1156       IF ( (dbms_lob.getlength(p_src_clob)) - (l_variablePosition) > 0) then
1157         if (l_repeated_flag) then
1158           dbms_lob.copy(x_result, p_src_clob,
1159           dbms_lob.getlength(p_src_clob)-l_variablePosition+l_replace_str_length+1,
1160           dbms_lob.getlength(x_result)+1, l_variablePosition-l_replace_str_length);
1161         else
1162           dbms_lob.copy(x_result, p_src_clob,
1163           dbms_lob.getlength(p_src_clob)-l_variablePosition+1,
1164           dbms_lob.getlength(x_result)+1, l_variablePosition);
1165         end if;
1166       END IF;
1167       l_progress := 210;
1168       p_src_clob := x_result;
1169     END IF;
1170       dbms_lob.freetemporary(x_result);
1171   END IF;
1172 
1173   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1174     l_log_string := 'ICX_CAT_R12_DATA_EXCEP_RPT_PVT.replace_clob completed:-->'||
1175                   'l_progress:' ||l_progress;
1176     l_module_name := ICX_CAT_UTIL_PVT.getModuleNameForDebug(g_pkg_name,l_proc_name);
1177     FND_LOG.string(FND_LOG.LEVEL_PROCEDURE, l_module_name, l_log_string);
1178   END IF;
1179 
1180 EXCEPTION
1181 WHEN OTHERS THEN
1182   ICX_CAT_UTIL_PVT.logUnexpectedException(
1183       g_pkg_name, l_proc_name,' --> l_progress:' ||l_progress||' '|| SQLERRM);
1184   RAISE;
1185 END replace_clob;
1186 
1187 END ICX_CAT_R12_DATA_EXCEP_RPT_PVT;