DBA Data[Home] [Help]

PACKAGE BODY: APPS.FEM_DATA_TEMPLATE_UTIL_PKG

Source


1 PACKAGE BODY FEM_DATA_TEMPLATE_UTIL_PKG  AS
2 /* $Header: fem_intg_dtmanip.plb 120.0 2008/01/10 12:40:00 hakumar noship $ */
3 g_api varchar2(50) := 'fem.plsql.fem_data_template_util_pkg';
4 g_nl  varchar2(1) := '
5 ';
6 
7 --
8 -- Procedure
9 --   REPLACE_DT_PROC
10 -- Purpose
11 --   Data Template Replacement Procedure.
12 -- Arguments
13 --   * None *
14 -- Example
15 --   fem_data_template_util_pkg.replace_dt_proc;
16 -- Notes
17 --
18 PROCEDURE replace_dt_proc( x_errbuf  OUT NOCOPY VARCHAR2,
19                            x_retcode OUT NOCOPY VARCHAR2
20                          )
21 IS
22   TYPE r_fem_datatemplates IS RECORD( template_code          VARCHAR2(150),
23                                       template_data          BLOB
24                                      );
25 
26   TYPE t_fem_datatemplates	IS TABLE OF r_fem_datatemplates;
27   l_fem_base_datatemplates t_fem_datatemplates;
28   l_fem_datatemplates t_fem_datatemplates;
29 
30   l_select_list_fem     VARCHAR2(10000);
31   l_from_list_fem       VARCHAR2(10000);
32   l_where_clause_fem    VARCHAR2(10000);
33   l_element_list_fem    VARCHAR2(10000);
34   l_vsmp_xml_elem       VARCHAR2(10000);
35   l_remaining_str       VARCHAR2(100);
36   l_base_templatecode   VARCHAR2(50);
37   l_varchar             VARCHAR2(32767);
38   l_start	              INTEGER := 1;
39   l_buffer              INTEGER :=32767;
40   l_off_write           INTEGER := 1;
41   l_amt_write           INTEGER := 32767;
42   l_start_tag           NUMBER;
43   l_end_tag             NUMBER;
44   l_sub_string          VARCHAR2(32767);
45   l_start_tag_length    NUMBER;
46   l_blob_in             BLOB;
47   l_blob_out            BLOB;
48   l_clob                CLOB;
49 
50   CURSOR c_base_data_templates
51   IS
52           SELECT lob_code,
53                  file_data
54             FROM xdo_lobs
55            WHERE application_short_name = 'FEM'
56              AND lob_type               = 'DATA_TEMPLATE'
57              AND lob_code               = 'FEM_GL_WRTBK_ERROR_SOURCE_BASE';
58   CURSOR c_active_dims
59   IS
60 SELECT ftcb.column_name,
61        SUBSTR(ftcb.column_name, 1, INSTR(ftcb.column_name, '_ID')) || 'NAME' dimension_name,
62        ftcb.display_name,
63        DECODE(ftcb.column_name, 'CHANNEL_ID', 'fem_channels_tl',
64                                 'COMPANY_COST_CENTER_ORG_ID', 'fem_cctr_orgs_tl',
65                                 'CUSTOMER_ID', 'fem_customers_tl',
66                                 'FINANCIAL_ELEM_ID', 'fem_fin_elems_tl',
67                                 'INTERCOMPANY_ID', 'fem_cctr_orgs_tl',
68                                 'LINE_ITEM_ID', 'fem_ln_items_tl',
69                                 'NATURAL_ACCOUNT_ID', 'fem_nat_accts_tl',
70                                 'PRODUCT_ID', 'fem_products_tl',
71                                 'PROJECT_ID', 'fem_projects_tl',
72                                 'TASK_ID', 'fem_tasks_tl',
73                                 'USER_DIM10_ID', 'fem_user_dim10_tl',
74                                 'USER_DIM1_ID', 'fem_user_dim1_tl',
75                                 'USER_DIM2_ID', 'fem_user_dim2_tl',
76                                 'USER_DIM3_ID', 'fem_user_dim3_tl',
77                                 'USER_DIM4_ID', 'fem_user_dim4_tl',
78                                 'USER_DIM5_ID', 'fem_user_dim5_tl',
79                                 'USER_DIM6_ID', 'fem_user_dim6_tl',
80                                 'USER_DIM7_ID', 'fem_user_dim7_tl',
81                                 'USER_DIM8_ID', 'fem_user_dim8_tl',
82                                 'USER_DIM9_ID', 'fem_user_dim9_tl' ) table_name,
83        DECODE(ftcb.column_name, 'CHANNEL_ID', 'fcht',
84                                 'COMPANY_COST_CENTER_ORG_ID', 'fcot',
85                                 'CUSTOMER_ID', 'fcut',
86                                 'FINANCIAL_ELEM_ID', 'ffet',
87                                 'INTERCOMPANY_ID', 'fcit',
88                                 'LINE_ITEM_ID', 'flit',
89                                 'NATURAL_ACCOUNT_ID', 'fnat',
90                                 'PRODUCT_ID', 'fpt',
91                                 'PROJECT_ID', 'fpjt',
92                                 'TASK_ID', 'ftt',
93                                 'USER_DIM10_ID', 'fu10t',
94                                 'USER_DIM1_ID', 'fu1t',
95                                 'USER_DIM2_ID', 'fu2t',
96                                 'USER_DIM3_ID', 'fu3t',
97                                 'USER_DIM4_ID', 'fu4t',
98                                 'USER_DIM5_ID', 'fu5t',
99                                 'USER_DIM6_ID', 'fu6t',
100                                 'USER_DIM7_ID', 'fu7t',
101                                 'USER_DIM8_ID', 'fu8t',
102                                 'USER_DIM9_ID', 'fu9t' ) table_alias,
103        DECODE(ftcb.column_name, 'COMPANY_COST_CENTER_ORG_ID', 1,
104               'LINE_ITEM_ID', 2,
105               'USER_DIM10_ID', 4,
106               'INTERCOMPANY_ID', 5, 3) column_order
107   FROM fem_tab_columns_tl ftcb,
108        fem_tab_column_prop ftcp
109  WHERE ftcb.table_name           = 'FEM_BALANCES'
110    AND ftcb.table_name           = ftcp.table_name
111    AND ftcb.language             = userenv('LANG')
112    AND ftcb.column_name          = ftcp.column_name
113    AND ftcp.column_property_code = 'PROCESSING_KEY'
114    AND ftcb.column_name IN ('CHANNEL_ID',
115                             'COMPANY_COST_CENTER_ORG_ID',
116                             'CUSTOMER_ID',
117                             'FINANCIAL_ELEM_ID',
118                             'INTERCOMPANY_ID',
119                             'LINE_ITEM_ID',
120                             'NATURAL_ACCOUNT_ID',
121                             'PRODUCT_ID',
122                             'PROJECT_ID',
123                             'TASK_ID',
124                             'USER_DIM10_ID',
125                             'USER_DIM1_ID',
126                             'USER_DIM2_ID',
127                             'USER_DIM3_ID',
128                             'USER_DIM4_ID',
129                             'USER_DIM5_ID',
130                             'USER_DIM6_ID',
131                             'USER_DIM7_ID',
132                             'USER_DIM8_ID',
133                             'USER_DIM9_ID')
134  ORDER BY 6, 1;
135 
136 BEGIN
137 
138    IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL 	<=	FND_LOG.LEVEL_STATEMENT) THEN
139        FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', '<<begin>>');
140    END IF;
141 
142    -- Construct The FEM Active Dims Select/Table/Where List For Manipulation Use
143    FOR v_active_dims IN c_active_dims LOOP
144      -- Select list
145      IF (v_active_dims.column_name = 'INTERCOMPANY_ID') THEN
146        l_select_list_fem :=  l_select_list_fem || v_active_dims.table_alias || '.' || 'COMPANY_COST_CENTER_ORG_NAME ' || v_active_dims.dimension_name ||','||g_nl;
147      ELSE
148        l_select_list_fem :=  l_select_list_fem || v_active_dims.table_alias || '.' || v_active_dims.dimension_name ||','||g_nl;
149      END IF;
150 
151      -- From clause
152      l_from_list_fem :=  l_from_list_fem || v_active_dims.table_name || ' ' || v_active_dims.table_alias ||','||g_nl;
153 
154      -- Where clause
155      IF (v_active_dims.column_name = 'INTERCOMPANY_ID') THEN
156        l_where_clause_fem := l_where_clause_fem || ' AND gt.' || v_active_dims.column_name || '=' || v_active_dims.table_alias || '.COMPANY_COST_CENTER_ORG_ID'  ||g_nl
157                              || ' AND ' || v_active_dims.table_alias || '.' || 'language = userenv(''LANG'')' || g_nl;
158      ELSE
159        l_where_clause_fem := l_where_clause_fem || ' AND gt.' || v_active_dims.column_name || '=' || v_active_dims.table_alias || '.' || v_active_dims.column_name ||g_nl
160                              || ' AND ' || v_active_dims.table_alias || '.' || 'language = userenv(''LANG'')' || g_nl;
161      END IF;
162 
163      -- XML structure elements
164      l_element_list_fem := l_element_list_fem || '<element name="NAME" value="'||v_active_dims.dimension_name||'"/>'||g_nl;
165 
166      IF ( v_active_dims.column_name <> 'FINANCIAL_ELEM_ID' AND
167           v_active_dims.column_name <> 'INTERCOMPANY_ID') THEN
168        l_vsmp_xml_elem := l_vsmp_xml_elem ||
169        '<group name="HEADER" source="S_'||v_active_dims.column_name||'">'||g_nl||
170        ' <element name="DIMENSIONNAME" value="DIMENSION_NAME"/>'|| g_nl||
171        ' <element name="VALUESETNAME" value="VALUE_SET_NAME"/>'|| g_nl||
172        ' <group name="DETAILS" source="S_'||v_active_dims.column_name||'">'|| g_nl||
173        '  <element name="NAME" value="DIM_MEMBER_NAME"/>'|| g_nl||
174        '  <element name="DESCRIPTION" value="DESCRIPTION" />'|| g_nl||
175        ' </group>'|| g_nl||
176        '</group>'||g_nl;
177      END IF;
178 
179    END LOOP;
180 
181    IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL 	<=	FND_LOG.LEVEL_STATEMENT) THEN
182        FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_select_list_fem : '||l_select_list_fem);
183        FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_element_list_fem : '||l_element_list_fem);
184    END IF;
185 
186    --Open DT Cursor And Loop Through Each Of The Templates
187    --And Carry Out Specific Manipulations
188    OPEN c_base_data_templates;
189    FETCH c_base_data_templates BULK COLLECT INTO l_fem_base_datatemplates;
190 
191    -- Check if there's atleast one record to process
192    IF (l_fem_base_datatemplates.FIRST IS NOT NULL AND l_fem_base_datatemplates.LAST IS NOT NULL) THEN
193 
194      -- Loop through each DT and manipulate it as required
195      FOR l_index IN l_fem_base_datatemplates.FIRST .. l_fem_base_datatemplates.LAST LOOP
196 
197        l_base_templatecode := l_fem_base_datatemplates(l_index).template_code ;
198        l_blob_in := l_fem_base_datatemplates(l_index).template_data ;
199 
200        IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL 	<=	FND_LOG.LEVEL_STATEMENT) THEN
201            FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'DT manipulation loop for : ');
202            FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_base_templatecode : '||l_base_templatecode);
203        END IF;
204 
205            -- Reset all the offset positions
206            l_start := 1;
207            l_buffer := 32767;
208            l_off_write := 1;
209            l_amt_write := 32767;
210 
211            IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL 	<=	FND_LOG.LEVEL_STATEMENT) THEN
212                FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'Convert base DT blob to clob.');
213            END IF;
214 
215            -- Create a temporary clob to hold manipulated contents
216            DBMS_LOB.CREATETEMPORARY(l_clob, TRUE);
217 
218            FOR i IN 1..CEIL(DBMS_LOB.GETLENGTH(l_blob_in) / l_buffer) LOOP
219 
223 
220              l_varchar := UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(l_blob_in, l_buffer, l_start));
221              DBMS_LOB.WRITEAPPEND(l_clob, LENGTH(l_varchar), l_varchar);
222              l_start := l_start + l_buffer;
224              IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL 	<=	FND_LOG.LEVEL_STATEMENT) THEN
225                  FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_varchar : '||l_varchar);
226              END IF;
227 
228            END LOOP;
229 
230            IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL 	<=	FND_LOG.LEVEL_STATEMENT) THEN
231                FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'Converted base DT blob to clob and now pointing to target DT blob for manipulation.');
232            END IF;
233 
234            -- Got the clob out of the base DT blob
235            -- manipulate this clob as needed
236            IF(l_base_templatecode = 'FEM_GL_WRTBK_ERROR_SOURCE_BASE') THEN
237 
238                IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL 	<=	FND_LOG.LEVEL_STATEMENT) THEN
239                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'DT manipulation: '||l_base_templatecode);
240                END IF;
241 
242                l_start_tag := DBMS_LOB.instr(l_clob, '/*startSelectList*/', 1, 1);
243                l_end_tag := DBMS_LOB.instr(l_clob, '/*endSelectList*/', 1, 1);
244                l_start_tag_length := length('/*startSelectList*/');
245                l_sub_string:=  DBMS_LOB.substr(l_clob,(l_end_tag - (l_start_tag+l_start_tag_length) ), l_start_tag+l_start_tag_length);
246                l_clob := replace(l_clob,l_sub_string, l_select_list_fem);
247 
248                IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL 	<=	FND_LOG.LEVEL_STATEMENT) THEN
249                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'Select List literal replacement.');
250                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_start_tag : '||l_start_tag);
251                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_end_tag : '||l_end_tag);
252                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_start_tag_length : '||l_start_tag_length);
253                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_sub_string : '||l_sub_string);
254                END IF;
255 
256                l_start_tag := DBMS_LOB.instr(l_clob, '/*startFromList*/', 1, 1);
257                l_end_tag := DBMS_LOB.instr(l_clob, '/*endFromList*/', 1, 1);
258                l_start_tag_length := length('/*startFromList*/');
259                l_sub_string:=  DBMS_LOB.substr(l_clob,(l_end_tag - (l_start_tag+l_start_tag_length) ), l_start_tag+l_start_tag_length);
260                l_clob := replace(l_clob,l_sub_string, l_from_list_fem);
261 
262                IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL 	<=	FND_LOG.LEVEL_STATEMENT) THEN
263                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'From List literal replacement.');
264                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_start_tag : '||l_start_tag);
265                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_end_tag : '||l_end_tag);
266                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_start_tag_length : '||l_start_tag_length);
267                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_sub_string : '||l_sub_string);
268                END IF;
269 
270                l_start_tag := DBMS_LOB.instr(l_clob, '/*startWhereClause*/', 1, 1);
271                l_end_tag := DBMS_LOB.instr(l_clob, '/*endWhereClause*/', 1, 1);
272                l_start_tag_length := length('/*startWhereClause*/');
273                l_sub_string:=  DBMS_LOB.substr(l_clob,(l_end_tag - (l_start_tag+l_start_tag_length) ), l_start_tag+l_start_tag_length);
274                l_clob := replace(l_clob,l_sub_string, l_where_clause_fem);
275 
276                IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL 	<=	FND_LOG.LEVEL_STATEMENT) THEN
277                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'Where Clause literal replacement.');
278                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_start_tag : '||l_start_tag);
279                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_end_tag : '||l_end_tag);
280                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_start_tag_length : '||l_start_tag_length);
281                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_sub_string : '||l_sub_string);
282                END IF;
283 
284                l_start_tag := DBMS_LOB.instr(l_clob, '<!--startElements-->', 1, 1);
285                l_end_tag := DBMS_LOB.instr(l_clob, '<!--endElements-->', 1, 1);
286                l_start_tag_length := length('<!--startElements-->');
287                l_sub_string :=  DBMS_LOB.substr(l_clob,(l_end_tag - (l_start_tag+l_start_tag_length) ), l_start_tag+l_start_tag_length);
288                l_clob := replace(l_clob,l_sub_string, l_element_list_fem);
289 
290                IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL 	<=	FND_LOG.LEVEL_STATEMENT) THEN
291                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'XML SCHEMA ELEMENT (DIMENSION NAME COLUMNS) literal replacement.');
292                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_start_tag : '||l_start_tag);
293                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_end_tag : '||l_end_tag);
294                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_start_tag_length : '||l_start_tag_length);
295                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_sub_string : '||l_sub_string);
296                END IF;
297 
298                l_start_tag := DBMS_LOB.instr(l_clob, '<!--startVSElements-->', 1, 1);
302                l_clob := replace(l_clob,l_sub_string, l_vsmp_xml_elem);
299                l_end_tag := DBMS_LOB.instr(l_clob, '<!--endVSElements-->', 1, 1);
300                l_start_tag_length := length('<!--startVSElements-->');
301                l_sub_string :=  DBMS_LOB.substr(l_clob,(l_end_tag - (l_start_tag+l_start_tag_length) ), l_start_tag+l_start_tag_length);
303 
304                IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL 	<=	FND_LOG.LEVEL_STATEMENT) THEN
305                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'XML SCHEMA ELEMENT (DIMENSION NAME COLUMNS) literal replacement.');
306                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_start_tag : '||l_start_tag);
307                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_end_tag : '||l_end_tag);
308                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_start_tag_length : '||l_start_tag_length);
309                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_sub_string : '||l_sub_string);
310                END IF;
311 
312            END IF;
313 
314            -- Finally write back temporary clob to destination blob
315            l_start:=1;
316            l_off_write:=1;
317            DBMS_LOB.createtemporary(l_blob_out,TRUE);
318 
319            IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL 	<=	FND_LOG.LEVEL_STATEMENT) THEN
320                FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'Write back manipulated clob to target blob.');
321            END IF;
322 
323            FOR i IN 1..CEIL(DBMS_LOB.GETLENGTH(l_clob) / l_buffer) LOOP
324 
325                DBMS_LOB.read ( l_clob, l_buffer, l_start, l_varchar );
326                l_amt_write := utl_raw.length (utl_raw.cast_to_raw( l_varchar) );
327                DBMS_LOB.write( l_blob_out, l_amt_write, l_off_write, utl_raw.cast_to_raw( l_varchar ) );
328                l_off_write := l_off_write + l_amt_write;
329                l_start := l_start + l_buffer;
330 
331                IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL 	<=	FND_LOG.LEVEL_STATEMENT) THEN
332                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_start : '||l_start);
333                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_buffer : '||l_buffer);
334                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_amt_write : '||l_amt_write);
335                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_off_write : '||l_off_write);
336                    FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'l_varchar : '||l_varchar);
337                END IF;
338 
339            END LOOP;
340 
341            UPDATE xdo_lobs
342               SET file_data = l_blob_out
343             WHERE application_short_name = 'FEM'
344               AND lob_type = 'DATA_TEMPLATE'
345               AND lob_code = SUBSTR(l_base_templatecode, 1, INSTR(l_base_templatecode,'_BASE')-1);
346 
347            DBMS_LOB.freetemporary(l_blob_out);
348            DBMS_LOB.freetemporary(l_clob);
349 
350            IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL 	<=	FND_LOG.LEVEL_STATEMENT) THEN
351                FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', 'Manipulated clob written back to target blob.');
352            END IF;
353 
354      END LOOP; -- Loop for template cursor
355 
356    END IF;
357 
358    CLOSE c_base_data_templates;
359    COMMIT;
360 
361    IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL 	<=	FND_LOG.LEVEL_STATEMENT) THEN
362        FND_LOG.STRING (FND_LOG.LEVEL_STATEMENT, g_api || '.' || 'replace_dt_proc', '<<end>>');
363    END IF;
364 
365    EXCEPTION
366           WHEN OTHERS THEN
367           BEGIN
368                IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL 	<=	FND_LOG.LEVEL_ERROR) THEN
369                    FND_LOG.STRING (FND_LOG.LEVEL_ERROR, g_api || '.' || 'replace_dt_proc', substr(SQLERRM,1,255));
370                END IF;
371           END;
372 
373 END replace_dt_proc;
374 
375 END FEM_DATA_TEMPLATE_UTIL_PKG;