[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;