[Home] [Help]
PACKAGE BODY: APPS.OKC_ARTICLES_IMPORT_GRP
Source
1 PACKAGE BODY OKC_ARTICLES_IMPORT_GRP AS
2 /* $Header: OKCGAIMB.pls 120.16.12010000.2 2008/10/24 08:00:19 ssreekum ship $ */
3
4 l_debug VARCHAR2(1) := NVL(FND_PROFILE.VALUE('AFLOG_ENABLED'),'N');
5 -- global array for temporary clob
6 g_temp_clob_tbl article_txt_tbl_type:= article_txt_tbl_type();
7
8 ---------------------------------------------------------------------------
9 -- GLOBAL MESSAGE CONSTANTS
10 ---------------------------------------------------------------------------
11 G_FND_APP CONSTANT VARCHAR2(200) := OKC_API.G_FND_APP;
12 G_INVALID_VALUE CONSTANT VARCHAR2(200) := OKC_API.G_INVALID_VALUE;
13 G_COL_NAME_TOKEN CONSTANT VARCHAR2(200) := OKC_API.G_COL_NAME_TOKEN;
14 ---------------------------------------------------------------------------
15 -- GLOBAL VARIABLES
16 ---------------------------------------------------------------------------
17 G_PKG_NAME CONSTANT VARCHAR2(200) := 'OKC_ARTICLES_IMPORT_GRP';
18 G_APP_NAME CONSTANT VARCHAR2(3) := OKC_API.G_APP_NAME;
19
20 ------------------------------------------------------------------------------
21 -- GLOBAL CONSTANTS
22 ------------------------------------------------------------------------------
23 G_FALSE CONSTANT VARCHAR2(1) := FND_API.G_FALSE;
24 G_TRUE CONSTANT VARCHAR2(1) := FND_API.G_TRUE;
25 G_RET_STS_SUCCESS CONSTANT varchar2(1) := FND_API.G_RET_STS_SUCCESS;
26 G_RET_STS_ERROR CONSTANT varchar2(1) := FND_API.G_RET_STS_ERROR;
27 G_RET_STS_UNEXP_ERROR CONSTANT varchar2(1) := FND_API.G_RET_STS_UNEXP_ERROR;
28
29 G_UNEXPECTED_ERROR CONSTANT varchar2(200) := 'OKC_UNEXPECTED_ERROR';
30 G_SQLERRM_TOKEN CONSTANT varchar2(200) := 'ERROR_MESSAGE';
31 G_SQLCODE_TOKEN CONSTANT varchar2(200) := 'ERROR_CODE';
32 G_GLOBAL_ORG_ID NUMBER := NVL(FND_PROFILE.VALUE('OKC_GLOBAL_ORG_ID'),-99);
33 -- MOAC
34 -- G_CURRENT_ORG_ID NUMBER := -99;
35 G_CURRENT_ORG_ID NUMBER ;
36 G_FETCHSIZE_LIMIT NUMBER := 300;
37
38 -- For Error
39 TYPE list_err_batch_process_id IS TABLE OF OKC_ART_INT_ERRORS.BATCH_PROCESS_ID%TYPE INDEX BY BINARY_INTEGER ;
40 TYPE list_err_interface_id IS TABLE OF OKC_ART_INT_ERRORS.INTERFACE_ID%TYPE INDEX BY BINARY_INTEGER ;
41 TYPE list_err_article_title IS TABLE OF OKC_ART_INTERFACE_ALL.ARTICLE_TITLE%TYPE INDEX BY BINARY_INTEGER ;
42 TYPE list_err_error_number IS TABLE OF OKC_ART_INT_ERRORS.ERROR_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
43 TYPE list_err_object_version_number IS TABLE OF OKC_ART_INT_ERRORS.OBJECT_VERSION_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
44 TYPE list_err_error_type IS TABLE OF OKC_ART_INT_ERRORS.ERROR_TYPE%TYPE INDEX BY BINARY_INTEGER ;
45 TYPE list_err_error_description IS TABLE OF OKC_ART_INT_ERRORS.ERROR_DESCRIPTION%TYPE INDEX BY BINARY_INTEGER ;
46 TYPE list_err_entity IS TABLE OF OKC_ART_INT_ERRORS.ENTITY%TYPE INDEX BY BINARY_INTEGER ;
47
48 err_batch_process_id_tbl list_err_batch_process_id ;
49 err_interface_id_tbl list_err_interface_id ;
50 err_article_title_tbl list_err_article_title ;
51 err_error_number_tbl list_err_error_number ;
52 err_object_version_number_tbl list_err_object_version_number ;
53 err_error_type_tbl list_err_error_type ;
54 err_error_description_tbl list_err_error_description ;
55 err_entity_tbl list_err_entity ;
56
57 -- MOAC
58 /*
59 -- One Time fetch and cache the current Org.
60 CURSOR CUR_ORG_CSR IS
61 SELECT NVL(TO_NUMBER(DECODE(SUBSTRB(USERENV('CLIENT_INFO'),1,1), ' ', NULL,
62 SUBSTRB(USERENV('CLIENT_INFO'),1,10))),-99)
63 FROM DUAL;
64 */
65
66 /*===================================================
67 | Private Functions
68 +==================================================*/
69
70 FUNCTION is_number(p_string IN VARCHAR2)
71 RETURN BOOLEAN IS
72 val NUMBER;
73 BEGIN
74 val := TO_NUMBER(p_string);
75 RETURN TRUE;
76 EXCEPTION
77 WHEN OTHERS THEN
78 RETURN FALSE;
79 END is_number;
80
81 FUNCTION is_date(p_string IN VARCHAR2)
82 RETURN BOOLEAN IS
83 val DATE;
84 BEGIN
85 val := TO_DATE(p_string,'YYYY/MM/DD');
86 RETURN TRUE;
87 EXCEPTION
88 WHEN OTHERS THEN
89 RETURN FALSE;
90 END is_date;
91
92 FUNCTION is_datetime(p_string IN VARCHAR2)
93 RETURN BOOLEAN IS
94 val DATE;
95 BEGIN
96 val := TO_DATE(p_string,'YYYY/MM/DD HH24:MI:SS');
97 RETURN TRUE;
98 EXCEPTION
99 WHEN OTHERS THEN
100 RETURN FALSE;
101 END is_datetime;
102
103 FUNCTION is_value_valid(p_format_type IN VARCHAR2,
104 p_string IN VARCHAR2)
105 RETURN BOOLEAN IS
106 val Boolean;
107 BEGIN
108 IF p_format_type = 'N' THEN
109 IF is_number(p_string) THEN
110 RETURN TRUE;
111 ELSE
112 RETURN FALSE;
113 END IF;
114 ELSIF p_format_type = 'C' THEN
115 val := is_date(nvl(p_string,'XX'));
116 IF val = FALSE THEN
117 RETURN TRUE;
118 ELSE
119 RETURN FALSE;
120 END IF;
121 ELSIF p_format_type = 'X' THEN
122 IF is_date(p_string) THEN
123 RETURN TRUE;
124 ELSE
125 RETURN FALSE;
126 END IF;
127 ELSIF p_format_type = 'Y' THEN
128 IF is_datetime(p_string) THEN
129 RETURN TRUE;
130 ELSE
131 RETURN FALSE;
132 END IF;
133 ELSE
134 RETURN FALSE;
135 END IF;
136 EXCEPTION
137 WHEN OTHERS THEN
138 RETURN FALSE;
139 END is_value_valid;
140
141 /*===================================================
142 | Prints summary of the run in cuncurrent output new for XML Import
143 +==================================================*/
144
145 PROCEDURE new_wrap_up( p_batch_number IN VARCHAR2,
146 p_entity IN VARCHAR2,
147 p_batch_procs_id IN NUMBER
148 ) IS
149
150 CURSOR get_info_csr IS
151 SELECT
152 total_rows_processed,total_rows_failed,
153 f.meaning entity_meaning
154 FROM OKC_ART_INT_BATPROCS_ALL a,
155 fnd_lookups f
156 WHERE UPPER(a.entity) = f.lookup_code
157 and f.lookup_type = 'OKC_ARTICLE_IMPORT_ENTITY'
158 and a.batch_process_id = p_batch_procs_id
159 and a.batch_number = p_batch_number
160 and a.entity = p_entity
161 and rownum =1;
162
163 BEGIN
164 FND_MSG_PUB.initialize;
165
166
167 FOR get_info_rec in get_info_csr LOOP
168 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
169 p_msg_name => 'OKC_ART_IMP_OUT1',
170 p_token1 => 'ENTITY',
171 p_token1_value => get_info_rec.entity_meaning,
172 p_token2 => 'TOTAL_ROWS',
173 p_token2_value => get_info_rec.total_rows_processed,
174 p_token3 => 'TOTAL_SUCCESS',
175 p_token3_value => get_info_rec.total_rows_processed-get_info_rec.total_rows_failed,
176 p_token4 => 'TOTAL_FAILED',
177 p_token4_value => get_info_rec.total_rows_failed);
178
179 END LOOP;
180 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, FND_MSG_PUB.Get(1,p_encoded=>FND_API.G_FALSE));
181
182 FND_MSG_PUB.initialize;
183 commit;
184 END new_wrap_up;
185
186
187 /*===================================================
188 | Prints error report in cuncurrent output for XML based Clause Import
189 +==================================================*/
190 PROCEDURE post_wrap_up(p_batch_number IN VARCHAR2,
191 p_entity IN VARCHAR2,
192 p_batch_procs_id IN NUMBER
193 ) IS
194 CURSOR get_art_info_csr IS
195 SELECT a.interface_id,a.entity,error_description,
196 b.article_title,b.article_number,
197 hr.name org_name
198 from okc_art_int_errors a,okc_art_interface_all b,
199 hr_organization_units hr
200 where a.interface_id = b.interface_id
201 and b.org_id = hr.organization_id
202 and b.batch_number = p_batch_number
203 and a.batch_process_id = p_batch_procs_id
204 and a.entity = p_entity
205 and a.entity = 'CLAUSE';
206
207 CURSOR get_var_info_csr IS
208 SELECT a.interface_id,a.entity,error_description,
209 b.variable_code,b.variable_name
210 from okc_art_int_errors a,okc_variables_interface b
211 where a.interface_id = b.interface_id
212 and b.batch_number = p_batch_number
213 and a.batch_process_id = p_batch_procs_id
214 and a.entity = p_entity
215 and a.entity = 'VARIABLE';
216
217 CURSOR get_val_info_csr IS
218 SELECT a.interface_id,a.entity,error_description,
219 b.flex_value,b.flex_value_set_name
220 from okc_art_int_errors a,okc_vs_values_interface b
221 where a.interface_id = b.interface_id
222 and b.batch_number = p_batch_number
223 and a.batch_process_id = p_batch_procs_id
224 and a.entity = p_entity
225 and a.entity = 'VALUE';
226
227 CURSOR get_vs_info_csr IS
228 SELECT a.interface_id,a.entity,error_description,
229 b.flex_value_set_name
230 from okc_art_int_errors a,okc_valuesets_interface b
231 where a.interface_id = b.interface_id
232 and b.batch_number = p_batch_number
233 and a.batch_process_id = p_batch_procs_id
234 and a.entity = p_entity
235 and a.entity = 'VALUESET';
236
237 CURSOR get_rel_info_csr IS
238 SELECT a.interface_id,a.entity,error_description,
239 b.source_article_title,b.target_article_title,relationship_type,
240 hr.name org_name
241 from okc_art_int_errors a,okc_art_rels_interface b,
242 hr_organization_units hr
243 where a.interface_id = b.interface_id
244 and b.batch_number = p_batch_number
245 and a.batch_process_id = p_batch_procs_id
246 and b.org_id = hr.organization_id
247 and a.entity = p_entity
248 and a.entity = 'RELATIONSHIP';
249
250
251 cur_inf_id NUMBER :=0;
252 l_insert_errors_exception EXCEPTION;
253 l_insert_errors_error CONSTANT VARCHAR2(1) := 'X';
254 BEGIN
255 IF p_entity = 'VARIABLE' THEN
256 FOR get_var_info_rec in get_var_info_csr LOOP
257 IF cur_inf_id < 1 THEN
258 FND_MSG_PUB.initialize;
259 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
260 p_msg_name => 'OKC_ART_IMP_HDR_VAR');
261 cur_inf_id := cur_inf_id + 1;
262 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, FND_MSG_PUB.Get(1,p_encoded=>FND_API.G_FALSE));
263 FND_MSG_PUB.initialize;
264 END IF;
265
266 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
267 p_msg_name => 'OKC_ART_IMP_OUT_VAR',
268 p_token1 => 'INTERFACE_ID',
269 p_token1_value => get_var_info_rec.interface_id,
270 p_token2 => 'VAR_NAME',
271 p_token2_value => get_var_info_rec.variable_name,
272 p_token3 => 'ERR_MSG',
273 p_token3_value => get_var_info_rec.error_description);
274 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, FND_MSG_PUB.Get(1,p_encoded=>FND_API.G_FALSE));
275 FND_MSG_PUB.initialize;
276
277 END LOOP;
278 ELSIF p_entity = 'VALUESET' THEN
279 FOR get_vs_info_rec in get_vs_info_csr LOOP
280 IF cur_inf_id < 1 THEN
281 FND_MSG_PUB.initialize;
282 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
283 p_msg_name => 'OKC_ART_IMP_HDR_VS');
284 cur_inf_id := cur_inf_id + 1;
285 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, FND_MSG_PUB.Get(1,p_encoded=>FND_API.G_FALSE));
286 FND_MSG_PUB.initialize;
287 END IF;
288
289 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
290 p_msg_name => 'OKC_ART_IMP_OUT_VS',
291 p_token1 => 'INTERFACE_ID',
292 p_token1_value => get_vs_info_rec.interface_id,
293 p_token2 => 'VS_NAME',
294 p_token2_value => get_vs_info_rec.flex_value_set_name,
295 p_token3 => 'ERR_MSG',
296 p_token3_value => get_vs_info_rec.error_description);
297 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, FND_MSG_PUB.Get(1,p_encoded=>FND_API.G_FALSE));
298 FND_MSG_PUB.initialize;
299
300 END LOOP;
301 ELSIF p_entity = 'RELATIONSHIP' THEN
302 FOR get_rel_info_rec in get_rel_info_csr LOOP
303 IF cur_inf_id < 1 THEN
304 FND_MSG_PUB.initialize;
305 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
306 p_msg_name => 'OKC_ART_IMP_HDR_REL');
307 cur_inf_id := cur_inf_id + 1;
308 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, FND_MSG_PUB.Get(1,p_encoded=>FND_API.G_FALSE));
309 FND_MSG_PUB.initialize;
310 END IF;
311
312 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
313 p_msg_name => 'OKC_ART_IMP_OUT_REL',
314 p_token1 => 'INTERFACE_ID',
315 p_token1_value => get_rel_info_rec.interface_id,
316 p_token2 => 'ARTICLE_TITLE1',
317 p_token2_value => get_rel_info_rec.source_article_title,
318 p_token3 => 'ARTICLE_TITLE2',
319 p_token3_value => get_rel_info_rec.target_article_title,
320 p_token4 => 'REL_TYPE',
321 p_token4_value => get_rel_info_rec.relationship_type,
322 p_token5 => 'OPER_UNIT',
323 p_token5_value => get_rel_info_rec.org_name,
324 p_token6 => 'ERR_MSG',
325 p_token6_value => get_rel_info_rec.error_description);
326 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, FND_MSG_PUB.Get(1,p_encoded=>FND_API.G_FALSE));
327 FND_MSG_PUB.initialize;
328
329 END LOOP;
330 ELSIF p_entity = 'VALUE' THEN
331 FOR get_val_info_rec in get_val_info_csr LOOP
332 IF cur_inf_id < 1 THEN
333 FND_MSG_PUB.initialize;
334 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
335 p_msg_name => 'OKC_ART_IMP_HDR_VAL');
336 cur_inf_id := cur_inf_id + 1;
337 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, FND_MSG_PUB.Get(1,p_encoded=>FND_API.G_FALSE));
338 FND_MSG_PUB.initialize;
339 END IF;
340
341 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
342 p_msg_name => 'OKC_ART_IMP_OUT_VAL',
343 p_token1 => 'INTERFACE_ID',
344 p_token1_value => get_val_info_rec.interface_id,
345 p_token2 => 'VAL',
346 p_token2_value => get_val_info_rec.flex_value,
347 p_token3 => 'VS_NAME',
348 p_token3_value => get_val_info_rec.flex_value_set_name,
349 p_token4 => 'ERR_MSG',
350 p_token4_value => get_val_info_rec.error_description);
351 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, FND_MSG_PUB.Get(1,p_encoded=>FND_API.G_FALSE));
352 FND_MSG_PUB.initialize;
353
354 END LOOP;
355 ELSIF p_entity = 'CLAUSE' THEN
356
357 FOR get_art_info_rec in get_art_info_csr LOOP
358
359 IF cur_inf_id < 1 THEN
360 FND_MSG_PUB.initialize;
361 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
362 p_msg_name => 'OKC_ART_IMP_HDR_CLAUSE');
363 cur_inf_id := cur_inf_id + 1;
364 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, FND_MSG_PUB.Get(1,p_encoded=>FND_API.G_FALSE));
365 FND_MSG_PUB.initialize;
366
367 END IF;
368
369 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
370 p_msg_name => 'OKC_ART_IMP_OUT_CLAUSE',
371 p_token1 => 'INTERFACE_ID',
372 p_token1_value => get_art_info_rec.interface_id,
373 p_token2 => 'ARTICLE_TITLE',
374 p_token2_value => get_art_info_rec.article_title,
375 p_token3 => 'ARTICLE_NUMBER',
376 p_token3_value => get_art_info_rec.article_number,
377 p_token4 => 'OPER_UNIT',
378 p_token4_value => get_art_info_rec.org_name,
379 p_token5 => 'ERR_MSG',
380 p_token5_value => get_art_info_rec.error_description);
381
382 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, FND_MSG_PUB.Get(1,p_encoded=>FND_API.G_FALSE));
383 FND_MSG_PUB.initialize;
384 END LOOP;
385 END IF;
386
387 EXCEPTION
388 WHEN OTHERS THEN
389 IF (l_debug = 'Y') THEN
390 okc_debug.log('500: Leaving post_wrap_up because of EXCEPTION: '||sqlerrm, 2);
391 END IF;
392 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
393 p_msg_name => G_UNEXPECTED_ERROR,
394 p_token1 => G_SQLCODE_TOKEN,
395 p_token1_value => sqlcode,
396 p_token2 => G_SQLERRM_TOKEN,
397 p_token2_value => sqlerrm);
398
399 END post_wrap_up;
400
401 /*===================================================
402 | Prints Header in cuncurrent output for XML based Clause Import
403 +==================================================*/
404
405 PROCEDURE pre_wrap_up(p_validate_only IN VARCHAR2,
406 p_batch_number IN VARCHAR2,
407 p_batch_procs_id IN NUMBER
408 ) IS
409 l_validate_meaning VARCHAR2(80);
410 l_import_src_meaning VARCHAR2(1);
411
412 CURSOR lookup_meaning_csr (cp_code IN VARCHAR2) IS
413 SELECT meaning
414 FROM fnd_lookups
415 WHERE lookup_type = 'OKC_YN' and lookup_code = cp_code;
416
417 CURSOR import_src_csr IS
418 SELECT import_source
419 FROM OKC_ART_INT_BATPROCS_ALL
420 WHERE batch_process_id = p_batch_procs_id
421 and batch_number = p_batch_number
422 and rownum =1;
423
424 -- FOR XML Based CLause Import
425 CURSOR get_info_csr IS
426 SELECT a.source_file_name,
427 nvl(hr.name,' ') org_name,
428 --to_char( a.start_date,'DD-MON-YYYY HH24:MI:SS') start_date,
429 fnd_date.date_to_displaydt( a.start_date) start_date,
430 f.meaning validate_meaning,
431 nvl(f1.meaning,' ') global_flag_meaning,
432 nvl(f2.meaning,' ') status_meaning
433 FROM OKC_ART_INT_BATPROCS_ALL a,
434 fnd_lookups f,fnd_lookups f1,fnd_lookups f2,hr_organization_units hr
435 WHERE a.validate_only_yn = f.lookup_code
436 and f.lookup_type = 'OKC_YN'
437 and a.global_flag = f1.lookup_code (+)
438 and f1.lookup_type (+)= 'OKC_YN'
439 and a.clause_Status = f2.lookup_code (+)
440 and f2.lookup_type (+) = 'OKC_ARTICLE_STATUS'
441 and a.org_id = hr.organization_id (+)
442 and a.batch_process_id = p_batch_procs_id
443 and batch_number = p_batch_number
444 and a.import_source IS NOT NULL
445 and rownum =1;
446
447 -- For Non-XML Based Clause Import (Old Import)
448 CURSOR get_old_info_csr IS
449 SELECT
450 fnd_date.date_to_displaydt( a.start_date) start_date,
451 f.meaning validate_meaning,a.fetch_size
452 FROM OKC_ART_INT_BATPROCS_ALL a,
453 fnd_lookups f
454 WHERE a.validate_only_yn = f.lookup_code
455 and f.lookup_type = 'OKC_YN'
456 and a.batch_process_id = p_batch_procs_id
457 and a.batch_number = p_batch_number
458 and a.import_source IS NULL
459 and rownum =1;
460
461
462 BEGIN
463 FND_MSG_PUB.initialize;
464
465 --initialize validate_meaning with p_validate_only
466 --and fetch the translated lookup meaning for this
467 /*
468 l_validate_meaning := p_validate_only;
469
470 OPEN lookup_meaning_csr(p_validate_only);
471 FETCH lookup_meaning_csr INTO l_validate_meaning;
472 CLOSE lookup_meaning_csr;
473 */
474 -- Get the Import Source to find out whether it is XML Based Import or not
475 -- Based on that show the Output Layout Header
476 OPEN import_src_csr;
477 FETCH import_src_csr INTO l_import_src_meaning;
478 CLOSE import_src_csr;
479
480 IF l_import_src_meaning is not null THEN
481 FOR get_info_rec in get_info_csr LOOP
482 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
483 p_msg_name => 'OKC_ART_IMP_HDR',
484 p_token1 => 'BATCH_NUMBER',
485 p_token1_value => p_batch_number,
486 p_token2 => 'DATE',
487 p_token2_value => get_info_rec.start_date,
488 p_token3 => 'FILE_NAME',
489 p_token3_value => get_info_rec.source_file_name,
490 p_token4 => 'OPER_UNIT',
491 p_token4_value => get_info_rec.org_name,
492 p_token5 => 'GC_IND',
493 p_token5_value => get_info_rec.global_flag_meaning,
494 p_token6 => 'C_STATUS',
495 p_token6_value => get_info_rec.status_meaning,
496 p_token7 => 'VALIDATE_ONLY',
497 p_token7_value => get_info_rec.validate_meaning
498 );
499 END LOOP;
500 ELSE
501 FOR get_old_info_rec in get_old_info_csr LOOP
502 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
503 p_msg_name => 'OKC_ART_IMP_HDR1',
504 p_token1 => 'BATCH_NUMBER',
505 p_token1_value => p_batch_number,
506 p_token2 => 'DATE',
507 p_token2_value => get_old_info_rec.start_date,
508 p_token3 => 'VALIDATE_ONLY',
509 p_token3_value => get_old_info_rec.validate_meaning,
510 p_token4 => 'C_SIZE',
511 p_token4_value => get_old_info_rec.fetch_size
512 );
513 END LOOP;
514
515 END IF;
516 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, FND_MSG_PUB.Get(1,p_encoded=>FND_API.G_FALSE));
517
518 FND_MSG_PUB.initialize;
519 commit;
520 END pre_wrap_up;
521
522 /*===================================================
523 | PROCEDURE conc. program for purge interface table
524 +==================================================*/
525 PROCEDURE conc_purge_interface (errbuf OUT NOCOPY VARCHAR2,
526 retcode OUT NOCOPY VARCHAR2,
527 p_start_date IN VARCHAR2,
528 p_end_date IN VARCHAR2,
529 p_process_status IN VARCHAR2,
530 p_batch_number IN VARCHAR2
531 ) IS
532 l_api_name CONSTANT VARCHAR2(30) := 'conc_purge_interface';
533 l_api_version CONSTANT VARCHAR2(30) := 1.0;
534 l_start_date DATE;
535 l_end_date DATE;
536
537 l_check_access VARCHAR2(1);
538
539 Cursor Pur_org_csr IS
540 SELECT DISTINCT a.org_id org_id,nvl(hr.name,' ') org_name
541 FROM okc_art_interface_all a,hr_organization_units hr
542 WHERE a.org_id IS NOT NULL
543 AND batch_number = p_batch_number
544 AND a.org_id = hr.organization_id(+)
545 UNION ALL
546 SELECT DISTINCT a.org_id org_id,nvl(hr.name,' ') org_name
547 FROM okc_art_rels_interface a,hr_organization_units hr
548 WHERE a.org_id IS NOT NULL
549 AND batch_number = p_batch_number
550 AND a.org_id = hr.organization_id(+)
551 AND NOT EXISTS
552 (SELECT 1 FROM okc_art_interface_all b
553 WHERE a.org_id = b.org_id
554 AND b.batch_number = p_batch_number);
555
556 BEGIN
557
558 IF (l_debug = 'Y') THEN
559 okc_debug.Set_Indentation(l_api_name);
560 okc_debug.Log('10: Entering ',2);
561 END IF;
562
563 mo_global.set_policy_context('M', NULL);
564
565 FOR rec in Pur_org_csr LOOP
566 -- Check Access and report error
567 l_check_access := mo_global.check_access(p_org_id => rec.org_id);
568 IF l_check_access = 'Y' THEN
569 -- MOAC
570 mo_global.set_policy_context('S', rec.org_id);
571 G_CURRENT_ORG_ID := rec.org_id;
572
573 --Initialize the return code
574 retcode := 0;
575 -- MOAC
576 --G_CURRENT_ORG_ID := mo_global.get_current_org_id();
577 /*
578 OPEN cur_org_csr;
579 FETCH cur_org_csr INTO G_CURRENT_ORG_ID;
580 CLOSE cur_org_csr;
581 */
582
583 IF G_CURRENT_ORG_ID IS NULL THEN
584 Okc_Api.Set_Message(G_APP_NAME, 'OKC_ART_NULL_ORG_ID');
585 RAISE FND_API.G_EXC_ERROR;
586 END IF;
587
588 l_start_date := nvl(fnd_date.canonical_to_date(p_start_date),
589 to_date('01-01-0001', 'DD-MM-YYYY'));
590 l_end_date := nvl(fnd_date.canonical_to_date(p_end_date), sysdate+1);
591
592
593 IF ( p_end_date is NULL
594 AND p_start_date is NULL
595 AND p_process_status is NULL
596 AND p_batch_number is NULL) THEN
597 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
598 p_msg_name => 'OKC_ART_WARN_PUR_ALL_DELETED');
599 DELETE FROM OKC_ART_INT_ERRORS
600 WHERE batch_process_id in
601 ( SELECT batch_process_id
602 FROM OKC_ART_INT_BATPROCS_ALL
603 WHERE org_id = G_CURRENT_ORG_ID
604 AND batch_number in
605 (SELECT batch_number
606 FROM OKC_ART_INTERFACE_ALL
607 WHERE org_id = G_CURRENT_ORG_ID));
608
609 DELETE FROM OKC_ART_INTERFACE_ALL
610 WHERE org_id = G_CURRENT_ORG_ID;
611
612 -- Below Added for FAR/DFAR Content Import
613 DELETE FROM OKC_VARIABLES_INTERFACE ;
614 DELETE FROM OKC_ART_RELS_INTERFACE
615 WHERE org_id = G_CURRENT_ORG_ID ;
616 DELETE FROM OKC_VALUESETS_INTERFACE ;
617 DELETE FROM OKC_VS_VALUES_INTERFACE ;
618
619 ELSE
620 DELETE FROM OKC_ART_INT_ERRORS
621 WHERE interface_id in ( SELECT interface_id
622 FROM OKC_ART_INTERFACE_ALL
623 WHERE last_update_date >= trunc(l_start_date)
624 AND last_update_date <= l_end_date
625 AND (batch_number = p_batch_number OR p_batch_number IS NULL)
626 AND (process_status = p_process_status OR p_process_status IS NULL)
627 AND org_id = G_CURRENT_ORG_ID);
628 DELETE FROM OKC_ART_INTERFACE_ALL
629 WHERE last_update_date >= trunc(l_start_date)
630 AND last_update_date <= l_end_date
631 AND (batch_number = p_batch_number OR p_batch_number IS NULL)
632 AND (process_status = p_process_status OR p_process_status IS NULL)
633 AND org_id = G_CURRENT_ORG_ID;
634
635 -- Below Added for FAR/DFAR Content Import
636 DELETE FROM OKC_VARIABLES_INTERFACE
637 WHERE last_update_date >= trunc(l_start_date)
638 AND last_update_date <= l_end_date
639 AND (batch_number = p_batch_number OR p_batch_number IS NULL)
640 AND (process_status = p_process_status OR p_process_status IS NULL)
641 ;
642 DELETE FROM OKC_ART_RELS_INTERFACE
643 WHERE last_update_date >= trunc(l_start_date)
644 AND last_update_date <= l_end_date
645 AND (batch_number = p_batch_number OR p_batch_number IS NULL)
646 AND (process_status = p_process_status OR p_process_status IS NULL)
647 AND org_id = G_CURRENT_ORG_ID;
648 DELETE FROM OKC_VALUESETS_INTERFACE
649 WHERE last_update_date >= trunc(l_start_date)
650 AND last_update_date <= l_end_date
651 AND (batch_number = p_batch_number OR p_batch_number IS NULL)
652 AND (process_status = p_process_status OR p_process_status IS NULL)
653 ;
654 DELETE FROM OKC_VS_VALUES_INTERFACE
655 WHERE last_update_date >= trunc(l_start_date)
656 AND last_update_date <= l_end_date
657 AND (batch_number = p_batch_number OR p_batch_number IS NULL)
658 AND (process_status = p_process_status OR p_process_status IS NULL)
659 ;
660 -- this will clean the remaining error not related to interface_id
661 -- such as SQL exception etc.
662 DELETE FROM OKC_ART_INT_ERRORS
663 WHERE batch_process_id in ( SELECT batch_process_id
664 FROM OKC_ART_INT_BATPROCS_ALL
665 WHERE org_id = G_CURRENT_ORG_ID
666 AND batch_number not in
667 (SELECT batch_number
668 FROM OKC_ART_INTERFACE_ALL
669 WHERE org_id = G_CURRENT_ORG_ID));
670
671 END IF;
672
673 COMMIT;
674
675 END IF;
676 END LOOP;
677
678
679 IF (l_debug = 'Y') THEN
680 okc_debug.Log('1000: Leaving ',2);
681 okc_debug.Reset_Indentation;
682 END IF;
683
684 EXCEPTION
685 WHEN FND_API.G_EXC_ERROR THEN
686 retcode := 2;
687 errbuf := substr(sqlerrm,1,200);
688 IF FND_MSG_PUB.Count_Msg > 0 Then
689 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
690 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MSG_PUB.Get(i,p_encoded =>FND_API.G_FALSE ));
691 END LOOP;
692 END IF;
693 FND_MSG_PUB.initialize;
694
695 IF (l_debug = 'Y') THEN
696 okc_debug.Log('3000: Leaving ',2);
697 okc_debug.Reset_Indentation;
698 END IF;
699 WHEN OTHERS THEN
700 retcode := 2;
701 errbuf := substr(sqlerrm,1,200);
702 rollback;
703 IF (l_debug = 'Y') THEN
704 okc_debug.Log('5000: Leaving due to an Unexpected Exception',2);
705 okc_debug.Reset_Indentation;
706 END IF;
707 END conc_purge_interface;
708
709
710 /*===================================================
711 | PROCEDURE conc. program wrapper for import_articles
712 +==================================================*/
713 PROCEDURE conc_import_articles (
714 x_return_status OUT NOCOPY VARCHAR2,
715 x_msg_count OUT NOCOPY NUMBER,
716 x_msg_data OUT NOCOPY VARCHAR2,
717
718 p_batch_procs_id IN NUMBER,
719 p_batch_number IN VARCHAR2,
720 p_validate_only IN VARCHAR2,
721 p_fetchsize IN NUMBER
722 ) IS
723 l_api_name CONSTANT VARCHAR2(30) := 'conc_import_articles';
724 l_api_version CONSTANT VARCHAR2(30) := 1.0;
725 l_return_status VARCHAR2(1) := OKC_API.G_RET_STS_SUCCESS;
726 l_msg_count NUMBER;
727 l_msg_data VARCHAR2(1000);
728 l_init_msg_list VARCHAR2(3) := 'F';
729 l_user_id NUMBER;
730 l_login_id NUMBER;
731 l_program_id OKC_ART_INTERFACE_ALL.PROGRAM_ID%TYPE;
732 l_program_login_id OKC_ART_INTERFACE_ALL.PROGRAM_LOGIN_ID%TYPE;
733 l_program_appl_id OKC_ART_INTERFACE_ALL.PROGRAM_APPLICATION_ID%TYPE;
734 l_request_id OKC_ART_INTERFACE_ALL.REQUEST_ID%TYPE;
735 l_batch_process_id NUMBER;
736 lc_batch_process_id NUMBER;
737 l_first_time VARCHAR2(1) := 'Y';
738 l_wrap_up VARCHAR2(1) := 'Y';
739 l_tot_art_rows_processed NUMBER := 0;
740 l_tot_art_rows_failed NUMBER := 0;
741 l_tot_art_rows_warned NUMBER := 0;
742 l_part_art_rows_processed NUMBER := 0;
743 l_part_art_rows_failed NUMBER := 0;
744 l_part_art_rows_warned NUMBER := 0;
745 l_tot_rel_rows_processed NUMBER := 0;
746 l_tot_rel_rows_failed NUMBER := 0;
747 l_tot_rel_rows_warned NUMBER := 0;
748 l_part_rel_rows_processed NUMBER := 0;
749 l_part_rel_rows_failed NUMBER := 0;
750 l_part_rel_rows_warned NUMBER := 0;
751
752 SUBTYPE entity IS OKC_ART_INT_BATPROCS_ALL.ENTITY%TYPE;
753
754 TYPE entity_tbl_type IS TABLE OF entity;
755 l_entity_tbl_type entity_tbl_type;
756
757
758 l_check_access VARCHAR2(1);
759
760 Cursor Org_csr IS
761 SELECT DISTINCT a.org_id org_id,nvl(hr.name,' ') org_name
762 FROM okc_art_interface_all a,hr_organization_units hr
763 WHERE a.org_id IS NOT NULL
764 AND batch_number = p_batch_number
765 AND a.org_id = hr.organization_id(+)
766 UNION ALL
767 SELECT DISTINCT a.org_id org_id,nvl(hr.name,' ') org_name
768 FROM okc_art_rels_interface a,hr_organization_units hr
769 WHERE a.org_id IS NOT NULL
770 AND batch_number = p_batch_number
771 AND a.org_id = hr.organization_id(+)
772 AND NOT EXISTS
773 (SELECT 1 FROM okc_art_interface_all b
774 WHERE a.org_id = b.org_id
775 AND b.batch_number = p_batch_number);
776
777
778 BEGIN
779 IF (l_debug = 'Y') THEN
780 okc_debug.Set_Indentation(l_api_name);
781 okc_debug.Log('10: Entering ',2);
782 END IF;
783
784 mo_global.set_policy_context('M', NULL);
785
786 FOR rec in Org_Csr LOOP
787 -- Check Access and report error
788 l_check_access := mo_global.check_access(p_org_id => rec.org_id);
789 IF l_check_access = 'Y' THEN
790 -- MOAC
791 mo_global.set_policy_context('S', rec.org_id);
792 G_CURRENT_ORG_ID := rec.org_id;
793
794
795 --IF G_CURRENT_ORG_ID IS NULL THEN
796 -- Okc_Api.Set_Message(G_APP_NAME, 'OKC_ART_NULL_ORG_ID');
797 -- RAISE FND_API.G_EXC_ERROR;
798 --END IF;
799 ------------------------------------------------------------------------
800 -- Create a batch process id and an initial row for process statistics
801 -------------------------------------------------------------------------
802 IF l_first_time = 'Y' then
803 l_user_id := Fnd_Global.user_id;
804 l_login_id := Fnd_Global.login_id;
805 l_return_status := G_RET_STS_SUCCESS;
806
807 IF FND_GLOBAL.CONC_PROGRAM_ID = -1 THEN
808 l_program_id := NULL;
809 ELSE
810 l_program_id := FND_GLOBAL.CONC_PROGRAM_ID;
811 END IF;
812
813 IF FND_GLOBAL.CONC_LOGIN_ID = -1 THEN
814 l_program_login_id := NULL;
815 ELSE
816 l_program_login_id := FND_GLOBAL.CONC_LOGIN_ID;
817 END IF;
818
819 IF FND_GLOBAL.PROG_APPL_ID = -1 THEN
820 l_program_appl_id := NULL;
821 ELSE
822 l_program_appl_id := FND_GLOBAL.PROG_APPL_ID;
823 END IF;
824
825 IF FND_GLOBAL.CONC_REQUEST_ID = -1 THEN
826 l_request_id := NULL;
827 ELSE
828 l_request_id := FND_GLOBAL.CONC_REQUEST_ID;
829 END IF;
830
831
832 IF p_batch_procs_id = 0 THEN
833 -- Need to initialize the record for each entity
834 l_entity_tbl_type := entity_tbl_type('Clause','Variable','Relationship','Valueset','Value');
835 -- Generate batch_process_id
836 SELECT
837 OKC_ART_INT_BATPROCS_ALL_S1.nextval into lc_batch_process_id
838 FROM DUAL;
839
840 FOR i IN 1..l_entity_tbl_type.LAST LOOP
841
842 INSERT INTO OKC_ART_INT_BATPROCS_ALL
843 (
844 BATCH_PROCESS_ID,
845 OBJECT_VERSION_NUMBER,
846 BATCH_NUMBER,
847 ORG_ID,
848 VALIDATE_ONLY_YN,
849 FETCH_SIZE,
850 START_DATE,
851 END_DATE,
852 TOTAL_ROWS_PROCESSED,
853 TOTAL_ROWS_FAILED,
854 TOTAL_ROWS_WARNED,
855 CREATED_BY,
856 CREATION_DATE,
857 LAST_UPDATE_DATE,
858 LAST_UPDATED_BY,
859 LAST_UPDATE_LOGIN,
860 PROGRAM_ID,
861 PROGRAM_LOGIN_ID,
862 PROGRAM_APPLICATION_ID,
863 REQUEST_ID,
864 ENTITY
865 )
866 VALUES
867 (
868 lc_batch_process_id,
869 1.0,
870 p_batch_number,
871 G_CURRENT_ORG_ID,
872 p_validate_only,
873 p_fetchsize,
874 sysdate,
875 NULL,
876 NULL,
877 NULL,
878 NULL,
879 l_user_id,
880 sysdate,
881 sysdate,
882 l_user_id,
883 l_login_id,
884 l_program_id,
885 l_program_login_id,
886 l_program_appl_id,
887 l_request_id ,
888 l_entity_tbl_type(i)
889 ) returning BATCH_PROCESS_ID INTO l_batch_process_id;
890 commit;
891
892 END LOOP;
893 l_entity_tbl_type.delete;
894
895 ELSE
896 l_batch_process_id := p_batch_procs_id;
897 END IF;
898
899 IF l_wrap_up = 'Y' THEN
900 pre_wrap_up(p_validate_only,p_batch_number,l_batch_process_id);
901 l_wrap_up := 'N' ;
902 END IF;
903
904 BEGIN
905 OKC_ARTICLES_IMPORT_GRP.import_fnd_flex_value_sets(
906 x_return_status => l_return_status,
907 x_msg_count => x_msg_count,
908 x_msg_data => x_msg_data,
909 p_batch_procs_id => l_batch_process_id,
910 p_batch_number => p_batch_number,
911 p_validate_only => p_validate_only,
912 p_fetchsize => p_fetchsize );
913
914
915 IF l_return_status = OKC_API.G_RET_STS_UNEXP_ERROR THEN
916 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
917 ELSIF l_return_status = OKC_API.G_RET_STS_ERROR THEN
918 RAISE OKC_API.G_EXCEPTION_ERROR;
919 END IF;
920
921 IF (l_debug = 'Y') THEN
922 okc_debug.Log('1000: Leaving conc_import_articles',2);
923 okc_debug.Reset_Indentation;
924 END IF;
925 x_return_status := G_RET_STS_SUCCESS;
926
927 EXCEPTION
928 WHEN OKC_API.G_EXCEPTION_ERROR THEN
929 x_return_status := G_RET_STS_ERROR;
930 IF FND_MSG_PUB.Count_Msg > 0 Then
931 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
932 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MSG_PUB.Get(i,p_encoded =>FND_API.G_FALSE ));
933 END LOOP;
934 END IF;
935 FND_MSG_PUB.initialize;
936
937 IF (l_debug = 'Y') THEN
938 okc_debug.Log('3000: Leaving conc_import_articles',2);
939 okc_debug.Reset_Indentation;
940 END IF;
941 WHEN OKC_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
942 x_return_status := G_RET_STS_UNEXP_ERROR;
943 IF FND_MSG_PUB.Count_Msg > 0 Then
944 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
945 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MSG_PUB.Get(i,p_encoded =>FND_API.G_FALSE ));
946 END LOOP;
947 END IF;
948 FND_MSG_PUB.initialize;
949 IF (l_debug = 'Y') THEN
950 okc_debug.Log('4000: Leaving conc_import_articles',2);
951 okc_debug.Reset_Indentation;
952 END IF;
953
954 WHEN OTHERS THEN
955 x_return_status := G_RET_STS_UNEXP_ERROR;
956 IF FND_MSG_PUB.Count_Msg > 0 Then
957 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
958 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MSG_PUB.Get(i,p_encoded =>FND_API.G_FALSE ));
959 END LOOP;
960 END IF;
961 FND_MSG_PUB.initialize;
962 IF (l_debug = 'Y') THEN
963 okc_debug.Log('5000: Leaving conc_import_articles',2);
964 okc_debug.Reset_Indentation;
965 END IF;
966 END ;
967 BEGIN
968 OKC_ARTICLES_IMPORT_GRP.import_fnd_flex_values(
969 x_return_status => l_return_status,
970 x_msg_count => x_msg_count,
971 x_msg_data => x_msg_data,
972 p_batch_procs_id => l_batch_process_id,
973 p_batch_number => p_batch_number,
974 p_validate_only => p_validate_only,
975 p_fetchsize => p_fetchsize );
976
977
978 IF l_return_status = OKC_API.G_RET_STS_UNEXP_ERROR THEN
979 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
980 ELSIF l_return_status = OKC_API.G_RET_STS_ERROR THEN
981 RAISE OKC_API.G_EXCEPTION_ERROR;
982 END IF;
983
984 IF (l_debug = 'Y') THEN
985 okc_debug.Log('1000: Leaving conc_import_articles',2);
986 okc_debug.Reset_Indentation;
987 END IF;
988 x_return_status := G_RET_STS_SUCCESS;
989
990 EXCEPTION
991 WHEN OKC_API.G_EXCEPTION_ERROR THEN
992 x_return_status := G_RET_STS_ERROR;
993 IF FND_MSG_PUB.Count_Msg > 0 Then
994 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
995 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MSG_PUB.Get(i,p_encoded =>FND_API.G_FALSE ));
996 END LOOP;
997 END IF;
998 FND_MSG_PUB.initialize;
999
1000 IF (l_debug = 'Y') THEN
1001 okc_debug.Log('3000: Leaving conc_import_articles',2);
1002 okc_debug.Reset_Indentation;
1003 END IF;
1004 WHEN OKC_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
1005 x_return_status := G_RET_STS_UNEXP_ERROR;
1006 IF FND_MSG_PUB.Count_Msg > 0 Then
1007 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
1008 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MSG_PUB.Get(i,p_encoded =>FND_API.G_FALSE ));
1009 END LOOP;
1010 END IF;
1011 FND_MSG_PUB.initialize;
1012 IF (l_debug = 'Y') THEN
1013 okc_debug.Log('4000: Leaving conc_import_articles',2);
1014 okc_debug.Reset_Indentation;
1015 END IF;
1016
1017 WHEN OTHERS THEN
1018 x_return_status := G_RET_STS_UNEXP_ERROR;
1019 IF FND_MSG_PUB.Count_Msg > 0 Then
1020 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
1021 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MSG_PUB.Get(i,p_encoded =>FND_API.G_FALSE ));
1022 END LOOP;
1023 END IF;
1024 FND_MSG_PUB.initialize;
1025 IF (l_debug = 'Y') THEN
1026 okc_debug.Log('5000: Leaving conc_import_articles',2);
1027 okc_debug.Reset_Indentation;
1028 END IF;
1029 END ;
1030 BEGIN
1031 OKC_ARTICLES_IMPORT_GRP.import_variables(
1032 x_return_status => l_return_status,
1033 x_msg_count => x_msg_count,
1034 x_msg_data => x_msg_data,
1035 p_batch_procs_id => l_batch_process_id,
1036 p_batch_number => p_batch_number,
1037 p_validate_only => p_validate_only,
1038 p_fetchsize => p_fetchsize );
1039
1040
1041 IF l_return_status = OKC_API.G_RET_STS_UNEXP_ERROR THEN
1042 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
1043 ELSIF l_return_status = OKC_API.G_RET_STS_ERROR THEN
1044 RAISE OKC_API.G_EXCEPTION_ERROR;
1045 END IF;
1046
1047 IF (l_debug = 'Y') THEN
1048 okc_debug.Log('1000: Leaving conc_import_articles',2);
1049 okc_debug.Reset_Indentation;
1050 END IF;
1051 x_return_status := G_RET_STS_SUCCESS;
1052
1053 EXCEPTION
1054 WHEN OKC_API.G_EXCEPTION_ERROR THEN
1055 x_return_status := G_RET_STS_ERROR;
1056 IF FND_MSG_PUB.Count_Msg > 0 Then
1057 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
1058 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MSG_PUB.Get(i,p_encoded =>FND_API.G_FALSE ));
1059 END LOOP;
1060 END IF;
1061 FND_MSG_PUB.initialize;
1062
1063 IF (l_debug = 'Y') THEN
1064 okc_debug.Log('3000: Leaving conc_import_articles',2);
1065 okc_debug.Reset_Indentation;
1066 END IF;
1067 WHEN OKC_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
1068 x_return_status := G_RET_STS_UNEXP_ERROR;
1069 IF FND_MSG_PUB.Count_Msg > 0 Then
1070 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
1071 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MSG_PUB.Get(i,p_encoded =>FND_API.G_FALSE ));
1072 END LOOP;
1073 END IF;
1074 FND_MSG_PUB.initialize;
1075 IF (l_debug = 'Y') THEN
1076 okc_debug.Log('4000: Leaving conc_import_articles',2);
1077 okc_debug.Reset_Indentation;
1078 END IF;
1079
1080 WHEN OTHERS THEN
1081 x_return_status := G_RET_STS_UNEXP_ERROR;
1082 IF FND_MSG_PUB.Count_Msg > 0 Then
1083 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
1084 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MSG_PUB.Get(i,p_encoded =>FND_API.G_FALSE ));
1085 END LOOP;
1086 END IF;
1087 FND_MSG_PUB.initialize;
1088 IF (l_debug = 'Y') THEN
1089 okc_debug.Log('5000: Leaving conc_import_articles',2);
1090 okc_debug.Reset_Indentation;
1091 END IF;
1092 END ;
1093 END IF; -- If l_first_time = 'Y'
1094 BEGIN
1095 l_part_art_rows_processed := 0;
1096 l_part_art_rows_failed := 0;
1097 l_part_art_rows_warned := 0;
1098 OKC_ARTICLES_IMPORT_GRP.import_articles(
1099 x_return_status => l_return_status,
1100 x_msg_count => x_msg_count,
1101 x_msg_data => x_msg_data,
1102 p_batch_procs_id => l_batch_process_id,
1103 p_batch_number => p_batch_number,
1104 p_validate_only => p_validate_only,
1105 p_fetchsize => p_fetchsize,
1106 p_rows_processed => l_part_art_rows_processed,
1107 p_rows_failed => l_part_art_rows_failed,
1108 p_rows_warned => l_part_art_rows_warned);
1109
1110 l_tot_art_rows_processed := l_tot_art_rows_processed + l_part_art_rows_processed;
1111 l_tot_art_rows_failed := l_tot_art_rows_failed + l_part_art_rows_failed;
1112 l_tot_art_rows_warned := l_tot_art_rows_warned + l_part_art_rows_warned;
1113
1114
1115
1116 IF l_return_status = OKC_API.G_RET_STS_UNEXP_ERROR THEN
1117 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
1118 ELSIF l_return_status = OKC_API.G_RET_STS_ERROR THEN
1119 RAISE OKC_API.G_EXCEPTION_ERROR;
1120 END IF;
1121
1122 IF (l_debug = 'Y') THEN
1123 okc_debug.Log('1000: Leaving conc_import_articles',2);
1124 okc_debug.Reset_Indentation;
1125 END IF;
1126 x_return_status := G_RET_STS_SUCCESS;
1127
1128 EXCEPTION
1129 WHEN OKC_API.G_EXCEPTION_ERROR THEN
1130 x_return_status := G_RET_STS_ERROR;
1131 IF FND_MSG_PUB.Count_Msg > 0 Then
1132 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
1133 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MSG_PUB.Get(i,p_encoded =>FND_API.G_FALSE ));
1134 END LOOP;
1135 END IF;
1136 FND_MSG_PUB.initialize;
1137
1138 IF (l_debug = 'Y') THEN
1139 okc_debug.Log('3000: Leaving conc_import_articles',2);
1140 okc_debug.Reset_Indentation;
1141 END IF;
1142 WHEN OKC_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
1143 x_return_status := G_RET_STS_UNEXP_ERROR;
1144 IF FND_MSG_PUB.Count_Msg > 0 Then
1145 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
1146 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MSG_PUB.Get(i,p_encoded =>FND_API.G_FALSE ));
1147 END LOOP;
1148 END IF;
1149 FND_MSG_PUB.initialize;
1150 IF (l_debug = 'Y') THEN
1151 okc_debug.Log('4000: Leaving conc_import_articles',2);
1152 okc_debug.Reset_Indentation;
1153 END IF;
1154
1155 WHEN OTHERS THEN
1156 x_return_status := G_RET_STS_UNEXP_ERROR;
1157 IF FND_MSG_PUB.Count_Msg > 0 Then
1158 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
1159 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MSG_PUB.Get(i,p_encoded =>FND_API.G_FALSE ));
1160 END LOOP;
1161 END IF;
1162 FND_MSG_PUB.initialize;
1163 IF (l_debug = 'Y') THEN
1164 okc_debug.Log('5000: Leaving conc_import_articles',2);
1165 okc_debug.Reset_Indentation;
1166 END IF;
1167 END ;
1168 BEGIN
1169 l_part_rel_rows_processed := 0;
1170 l_part_rel_rows_failed := 0;
1171 l_part_rel_rows_warned := 0;
1172 OKC_ARTICLES_IMPORT_GRP.import_relationships(
1173 x_return_status => l_return_status,
1174 x_msg_count => x_msg_count,
1175 x_msg_data => x_msg_data,
1176 p_batch_procs_id => l_batch_process_id,
1177 p_batch_number => p_batch_number,
1178 p_validate_only => p_validate_only,
1179 p_fetchsize => p_fetchsize,
1180 p_rows_processed => l_part_rel_rows_processed,
1181 p_rows_failed => l_part_rel_rows_failed,
1182 p_rows_warned => l_part_rel_rows_warned);
1183
1184 l_tot_rel_rows_processed := l_tot_rel_rows_processed + l_part_rel_rows_processed;
1185 l_tot_rel_rows_failed := l_tot_rel_rows_failed + l_part_rel_rows_failed;
1186 l_tot_rel_rows_warned := l_tot_rel_rows_warned + l_part_rel_rows_warned;
1187
1188
1189 IF l_return_status = OKC_API.G_RET_STS_UNEXP_ERROR THEN
1190 RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
1191 ELSIF l_return_status = OKC_API.G_RET_STS_ERROR THEN
1192 RAISE OKC_API.G_EXCEPTION_ERROR;
1193 END IF;
1194
1195 IF (l_debug = 'Y') THEN
1196 okc_debug.Log('1000: Leaving conc_import_articles',2);
1197 okc_debug.Reset_Indentation;
1198 END IF;
1199 x_return_status := G_RET_STS_SUCCESS;
1200
1201 EXCEPTION
1202 WHEN OKC_API.G_EXCEPTION_ERROR THEN
1203 x_return_status := G_RET_STS_ERROR;
1204 IF FND_MSG_PUB.Count_Msg > 0 Then
1205 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
1206 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MSG_PUB.Get(i,p_encoded =>FND_API.G_FALSE ));
1207 END LOOP;
1208 END IF;
1209 FND_MSG_PUB.initialize;
1210
1211 IF (l_debug = 'Y') THEN
1212 okc_debug.Log('3000: Leaving conc_import_articles',2);
1213 okc_debug.Reset_Indentation;
1214 END IF;
1215 WHEN OKC_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
1216 x_return_status := G_RET_STS_UNEXP_ERROR;
1217 IF FND_MSG_PUB.Count_Msg > 0 Then
1218 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
1219 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MSG_PUB.Get(i,p_encoded =>FND_API.G_FALSE ));
1220 END LOOP;
1221 END IF;
1222 FND_MSG_PUB.initialize;
1223 IF (l_debug = 'Y') THEN
1224 okc_debug.Log('4000: Leaving conc_import_articles',2);
1225 okc_debug.Reset_Indentation;
1226 END IF;
1227
1228 WHEN OTHERS THEN
1229 x_return_status := G_RET_STS_UNEXP_ERROR;
1230 IF FND_MSG_PUB.Count_Msg > 0 Then
1231 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
1232 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MSG_PUB.Get(i,p_encoded =>FND_API.G_FALSE ));
1233 END LOOP;
1234 END IF;
1235 FND_MSG_PUB.initialize;
1236 IF (l_debug = 'Y') THEN
1237 okc_debug.Log('5000: Leaving conc_import_articles',2);
1238 okc_debug.Reset_Indentation;
1239 END IF;
1240 END ;
1241 l_first_time := 'N';
1242 ELSE
1243 IF l_wrap_up = 'Y' THEN
1244 pre_wrap_up(p_validate_only,p_batch_number,p_batch_procs_id);
1245 l_wrap_up := 'N';
1246 END IF;
1247 FND_MSG_PUB.initialize;
1248 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
1249 p_msg_name => 'OKC_ART_NOT_VALID_ORG',
1250 p_token1 => 'ORG_NAME',
1251 p_token1_value => rec.org_name);
1252 FND_FILE.PUT_LINE(FND_FILE.LOG, FND_MSG_PUB.Get(1,p_encoded=>FND_API.G_FALSE));
1253
1254 FND_MSG_PUB.initialize;
1255 commit;
1256
1257 END IF;
1258 END LOOP;
1259
1260 --Update Batch Process Table with the clause related process counts
1261 UPDATE OKC_ART_INT_BATPROCS_ALL
1262 SET
1263 TOTAL_ROWS_PROCESSED = l_tot_art_rows_processed,
1264 TOTAL_ROWS_FAILED = l_tot_art_rows_failed,
1265 TOTAL_ROWS_WARNED = l_tot_art_rows_warned,
1266 END_DATE = SYSDATE,
1267 PROGRAM_ID = l_program_id,
1268 REQUEST_ID = l_request_id,
1269 PROGRAM_LOGIN_ID = l_program_login_id,
1270 PROGRAM_APPLICATION_ID = l_program_appl_id,
1271 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
1272 LAST_UPDATED_BY = l_user_id,
1273 LAST_UPDATE_LOGIN = l_login_id,
1274 LAST_UPDATE_DATE = SYSDATE
1275 WHERE
1276 BATCH_PROCESS_ID = l_batch_process_id
1277 AND ENTITY = 'Clause';
1278
1279 --Update Batch Process Table with the relationship related counts
1280 UPDATE OKC_ART_INT_BATPROCS_ALL
1281 SET
1282 TOTAL_ROWS_PROCESSED = l_tot_rel_rows_processed,
1283 TOTAL_ROWS_FAILED = l_tot_rel_rows_failed,
1284 TOTAL_ROWS_WARNED = l_tot_rel_rows_warned,
1285 END_DATE = SYSDATE,
1286 PROGRAM_ID = l_program_id,
1287 REQUEST_ID = l_request_id,
1288 PROGRAM_LOGIN_ID = l_program_login_id,
1289 PROGRAM_APPLICATION_ID = l_program_appl_id,
1290 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
1291 LAST_UPDATED_BY = l_user_id,
1292 LAST_UPDATE_LOGIN = l_login_id,
1293 LAST_UPDATE_DATE = SYSDATE
1294 WHERE
1295 BATCH_PROCESS_ID = l_batch_process_id
1296 AND ENTITY = 'Relationship' ;
1297
1298 new_wrap_up(p_batch_number,'Clause',l_batch_process_id);
1299 new_wrap_up(p_batch_number,'Relationship',l_batch_process_id);
1300 new_wrap_up(p_batch_number,'Variable',l_batch_process_id);
1301 new_wrap_up(p_batch_number,'Valueset',l_batch_process_id);
1302 new_wrap_up(p_batch_number,'Value',l_batch_process_id);
1303 FND_MSG_PUB.initialize;
1304 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
1305 p_msg_name => 'OKC_ART_IMP_ERR');
1306
1307 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, FND_MSG_PUB.Get(1,p_encoded=>FND_API.G_FALSE));
1308
1309 FND_MSG_PUB.initialize;
1310 post_wrap_up(p_batch_number,'CLAUSE',l_batch_process_id);
1311 post_wrap_up(p_batch_number,'RELATIONSHIP',l_batch_process_id);
1312 post_wrap_up(p_batch_number,'VARIABLE',l_batch_process_id);
1313 post_wrap_up(p_batch_number,'VALUESET',l_batch_process_id);
1314 post_wrap_up(p_batch_number,'VALUE',l_batch_process_id);
1315
1316 FND_MSG_PUB.initialize;
1317 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
1318 p_msg_name => 'OKC_ART_IMP_OUT_EOR');
1319
1320 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, FND_MSG_PUB.Get(1,p_encoded=>FND_API.G_FALSE));
1321
1322 FND_MSG_PUB.initialize;
1323 END conc_import_articles;
1324
1325 /*===================================================
1326 | Get Sequence Number for New Article or New Version
1327 +==================================================*/
1328
1329 FUNCTION Get_Seq_Id (
1330 p_object_type IN VARCHAR2,
1331 x_object_id OUT NOCOPY NUMBER
1332 ) RETURN VARCHAR2 IS
1333 CURSOR l_art_csr IS
1334 SELECT OKC_ARTICLES_ALL_S1.NEXTVAL FROM DUAL;
1335 CURSOR l_ver_csr IS
1336 SELECT OKC_ARTICLE_VERSIONS_S1.NEXTVAL FROM DUAL;
1337 BEGIN
1338 IF (l_debug = 'Y') THEN
1339 Okc_Debug.Log('100: Entered get_seq_id', 2);
1340 END IF;
1341
1342 IF p_object_type = 'ART' THEN
1343 OPEN l_art_csr;
1344 FETCH l_art_csr INTO x_object_id ;
1345 IF l_art_csr%NOTFOUND THEN
1346 RAISE NO_DATA_FOUND;
1347 END IF;
1348 CLOSE l_art_csr;
1349 ELSIF p_object_type = 'VER' THEN
1350 OPEN l_ver_csr;
1351 FETCH l_ver_csr INTO x_object_id ;
1352 IF l_ver_csr%NOTFOUND THEN
1353 RAISE NO_DATA_FOUND;
1354 END IF;
1355 CLOSE l_ver_csr;
1356 END IF;
1357
1358 IF (l_debug = 'Y') THEN
1359 Okc_Debug.Log('200: Leaving get_seq_id', 2);
1360 END IF;
1361 RETURN G_RET_STS_SUCCESS;
1362 EXCEPTION
1363 WHEN OTHERS THEN
1364
1365 IF (l_debug = 'Y') THEN
1366 Okc_Debug.Log('300: Leaving get_seq_id because of EXCEPTION: '||sqlerrm, 2);
1367 END IF;
1368
1369 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
1370 p_msg_name => G_UNEXPECTED_ERROR,
1371 p_token1 => G_SQLCODE_TOKEN,
1372 p_token1_value => sqlcode,
1373 p_token2 => G_SQLERRM_TOKEN,
1374 p_token2_value => sqlerrm);
1375
1376 IF l_art_csr%ISOPEN THEN
1377 CLOSE l_art_csr;
1378 END IF;
1379 IF l_ver_csr%ISOPEN THEN
1380 CLOSE l_ver_csr;
1381 END IF;
1382
1383 RETURN G_RET_STS_UNEXP_ERROR ;
1384
1385 END Get_Seq_Id;
1386
1387
1388 /*=====================================================================
1389 | PROCEDURE insert_error_array
1390 | This procedure will insert the error array built by build_error_array
1391 +====================================================================*/
1392 PROCEDURE insert_error_array(
1393 x_return_status OUT NOCOPY VARCHAR2,
1394 x_msg_count OUT NOCOPY NUMBER,
1395 x_msg_data OUT NOCOPY VARCHAR2
1396 )IS
1397 l_user_id NUMBER;
1398 l_login_id NUMBER;
1399 l_program_id OKC_ART_INT_ERRORS.PROGRAM_ID%TYPE;
1400 l_program_login_id OKC_ART_INT_ERRORS.PROGRAM_LOGIN_ID%TYPE;
1401 l_program_appl_id OKC_ART_INT_ERRORS.PROGRAM_APPLICATION_ID%TYPE;
1402 l_request_id OKC_ART_INT_ERRORS.REQUEST_ID%TYPE;
1403 i_err NUMBER :=0;
1404 cur_inf_id NUMBER :=0;
1405 cur_inf_id1 NUMBER :=0;
1406 l_insert_errors_exception EXCEPTION;
1407 l_insert_errors_error CONSTANT VARCHAR2(1) := 'X';
1408 BEGIN
1409 l_user_id := Fnd_Global.user_id;
1410 l_login_id := Fnd_Global.login_id;
1411
1412 IF FND_GLOBAL.CONC_PROGRAM_ID = -1 THEN
1413 l_program_id := NULL;
1414 ELSE
1415 l_program_id := FND_GLOBAL.CONC_PROGRAM_ID;
1416 END IF;
1417
1418 IF FND_GLOBAL.CONC_LOGIN_ID = -1 THEN
1419 l_program_login_id := NULL;
1420 ELSE
1421 l_program_login_id := FND_GLOBAL.CONC_LOGIN_ID;
1422 END IF;
1423
1424 IF FND_GLOBAL.PROG_APPL_ID = -1 THEN
1425 l_program_appl_id := NULL;
1426 ELSE
1427 l_program_appl_id := FND_GLOBAL.PROG_APPL_ID;
1428 END IF;
1429
1430 IF FND_GLOBAL.CONC_REQUEST_ID = -1 THEN
1431 l_request_id := NULL;
1432 ELSE
1433 l_request_id := FND_GLOBAL.CONC_REQUEST_ID;
1434 END IF;
1435
1436 IF ( err_batch_process_id_tbl.COUNT > 0) THEN
1437 FOR i_err in err_batch_process_id_tbl.FIRST
1438 .. err_batch_process_id_tbl.LAST LOOP
1439
1440
1441 INSERT INTO OKC_ART_INT_ERRORS
1442 (
1443 BATCH_PROCESS_ID,
1444 INTERFACE_ID,
1445 ERROR_NUMBER,
1446 OBJECT_VERSION_NUMBER,
1447 ERROR_TYPE,
1448 ERROR_DESCRIPTION,
1449 CREATED_BY,
1450 CREATION_DATE,
1451 LAST_UPDATE_DATE,
1452 LAST_UPDATED_BY,
1453 LAST_UPDATE_LOGIN,
1454 PROGRAM_ID,
1455 PROGRAM_LOGIN_ID,
1456 PROGRAM_APPLICATION_ID,
1457 REQUEST_ID,
1458 ENTITY
1459 )
1460 VALUES
1461 (
1462 err_batch_process_id_tbl(i_err),
1463 err_interface_id_tbl(i_err),
1464 err_error_number_tbl(i_err),
1465 err_object_version_number_tbl(i_err),
1466 err_error_type_tbl(i_err),
1467 err_error_description_tbl(i_err),
1468 l_user_id,
1469 sysdate,
1470 sysdate,
1471 l_user_id,
1472 l_login_id,
1473 l_program_id,
1474 l_program_login_id,
1475 l_program_appl_id,
1476 l_request_id,
1477 err_entity_tbl(i_err)
1478 );
1479
1480
1481 -- End Added for XML Based Clause Import
1482
1483 IF cur_inf_id <> err_interface_id_tbl(i_err) THEN
1484 cur_inf_id := err_interface_id_tbl(i_err);
1485 FND_MSG_PUB.initialize;
1486 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
1487 p_msg_name => 'OKC_ART_IMP_LOG_HEADER',
1488 p_token1 => 'ENTITY',
1489 p_token1_value => err_entity_tbl(i_err),
1490 p_token2 => 'ARTICLE_TITLE',
1491 p_token2_value => err_article_title_tbl(i_err),
1492 p_token3 => 'INTERFACE_ID',
1493 p_token3_value => err_interface_id_tbl(i_err));
1494 FND_FILE.PUT_LINE(FND_FILE.LOG, FND_MSG_PUB.Get(1,p_encoded=>FND_API.G_FALSE));
1495 FND_MSG_PUB.initialize;
1496 END IF;
1497 FND_FILE.PUT_LINE(FND_FILE.LOG, err_error_description_tbl(i_err));
1498 FND_FILE.PUT_LINE(FND_FILE.LOG, '');
1499
1500 END LOOP;
1501 END IF;
1502 --recycle it
1503 err_batch_process_id_tbl.DELETE;
1504 err_article_title_tbl.DELETE;
1505 err_interface_id_tbl.DELETE;
1506 err_error_number_tbl.DELETE;
1507 err_object_version_number_tbl.DELETE;
1508 err_error_type_tbl.DELETE;
1509 err_entity_tbl.DELETE;
1510 err_error_description_tbl.DELETE;
1511
1512 EXCEPTION
1513 WHEN OTHERS THEN
1514 IF (l_debug = 'Y') THEN
1515 okc_debug.log('500: Leaving insert_error_array because of EXCEPTION: '||sqlerrm, 2);
1516 END IF;
1517 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
1518 p_msg_name => G_UNEXPECTED_ERROR,
1519 p_token1 => G_SQLCODE_TOKEN,
1520 p_token1_value => sqlcode,
1521 p_token2 => G_SQLERRM_TOKEN,
1522 p_token2_value => sqlerrm);
1523
1524 x_return_status := l_insert_errors_error;
1525
1526 END insert_error_array;
1527
1528 /*=====================================================================
1529 | PROCEDURE build_error_array
1530 |
1531 | This internal procedure will build the error array
1532 | from the fnd message stack
1533 +====================================================================*/
1534
1535 PROCEDURE build_error_array(
1536 p_msg_data IN VARCHAR2 := NULL,
1537 p_context IN VARCHAR2,
1538 p_batch_process_id IN NUMBER,
1539 p_interface_id IN NUMBER,
1540 p_article_title IN VARCHAR2 := NULL,
1541 p_error_type IN VARCHAR2,
1542 p_entity IN VARCHAR2
1543 ) IS
1544 l_error_index NUMBER := 1;
1545 l_return_status VARCHAR2(1) := OKC_API.G_RET_STS_SUCCESS;
1546 l_msg_count NUMBER;
1547 l_msg_data VARCHAR2(1000);
1548 BEGIN
1549 IF FND_MSG_PUB.Count_Msg >= 1 Then
1550 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
1551 err_batch_process_id_tbl(l_error_index) := p_batch_process_id;
1552 err_interface_id_tbl(l_error_index) := p_interface_id ;
1553 err_article_title_tbl(l_error_index) := p_article_title ;
1554 err_error_number_tbl(l_error_index) := l_error_index ;
1555 err_object_version_number_tbl(l_error_index) := 1.0 ;
1556 err_error_type_tbl(l_error_index) := p_error_type ;
1557 err_entity_tbl(l_error_index) := p_entity ;
1558 --err_error_description_tbl(l_error_index) := p_context ||':'|| FND_MSG_PUB.Get(i,p_encoded =>FND_API.G_FALSE );
1559 err_error_description_tbl(l_error_index) := FND_MSG_PUB.Get(i,p_encoded =>FND_API.G_FALSE );
1560 l_error_index := l_error_index + 1;
1561 END LOOP;
1562 ELSE IF p_msg_data is not NULL Then
1563 err_batch_process_id_tbl(l_error_index) := p_batch_process_id;
1564 err_interface_id_tbl(l_error_index) := p_interface_id ;
1565 err_article_title_tbl(l_error_index) := p_article_title;
1566 err_error_number_tbl(l_error_index) := l_error_index ;
1567 err_object_version_number_tbl(l_error_index) := 1.0 ;
1568 err_error_type_tbl(l_error_index) := p_error_type ;
1569 err_entity_tbl(l_error_index) := p_entity ;
1570 err_error_description_tbl(l_error_index) := p_msg_data;
1571 l_error_index := l_error_index + 1;
1572 END IF;
1573 END IF;
1574
1575 insert_error_array(
1576 x_return_status => l_return_status,
1577 x_msg_count => l_msg_count,
1578 x_msg_data => l_msg_data
1579 );
1580
1581 FND_MSG_PUB.initialize;
1582 END build_error_array;
1583
1584
1585 /*===================================================
1586 | Get build array message and rest of Fnd Message stack
1587 | and print it in Concurrent Log
1588 |
1589 | This would be a last step to print error messages
1590 | If err vararray has data, then it means it was not
1591 | pushed into database, so it should be printed in concurrent
1592 | output with remaining data in fnd message stack.
1593 +==================================================*/
1594
1595 PROCEDURE get_print_msgs_stack(p_msg_data IN VARCHAR2) IS
1596 i_err NUMBER := 0;
1597 cur_inf_id NUMBER := 0;
1598 BEGIN
1599 IF err_batch_process_id_tbl.COUNT > 0 THEN
1600 FOR i_err IN err_batch_process_id_tbl.FIRST
1601 .. err_batch_process_id_tbl.LAST LOOP
1602 --
1603 -- whenever there is a change in interface id, we will change header
1604 --
1605 IF cur_inf_id <> err_interface_id_tbl(i_err) THEN
1606 cur_inf_id := err_interface_id_tbl(i_err);
1607 FND_MSG_PUB.initialize;
1608 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
1609 p_msg_name => 'OKC_ART_IMP_LOG_HEADER',
1610 p_token1 => 'ENTITY',
1611 p_token1_value => err_entity_tbl(i_err),
1612 p_token2 => 'ARTICLE_TITLE',
1613 p_token2_value => err_article_title_tbl(i_err));
1614 FND_FILE.PUT_LINE(FND_FILE.LOG, FND_MSG_PUB.Get(1,p_encoded=>FND_API.G_FALSE));
1615 END IF;
1616
1617 FND_FILE.PUT_LINE(FND_FILE.LOG, err_error_description_tbl(i_err));
1618 FND_FILE.PUT_LINE(FND_FILE.LOG, '');
1619
1620 END LOOP;
1621 END IF;
1622
1623 IF FND_MSG_PUB.Count_Msg > 1 Then
1624 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
1625 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MSG_PUB.Get(i,p_encoded =>FND_API.G_FALSE ));
1626 END LOOP;
1627 ELSE
1628 FND_FILE.PUT_LINE(FND_FILE.LOG,p_msg_data);
1629 END IF;
1630
1631 --recycle it
1632 FND_MSG_PUB.initialize;
1633
1634 END get_print_msgs_stack;
1635
1636
1637 /*===================================================
1638 | Prints summary of the run in cuncurrent output
1639 +==================================================*/
1640
1641 PROCEDURE wrap_up(p_validate_only IN VARCHAR2,
1642 p_batch_number IN VARCHAR2,
1643 p_tot_rows_processed IN NUMBER,
1644 p_tot_rows_failed IN NUMBER,
1645 p_tot_rows_warned IN NUMBER,
1646 p_batch_process_id IN NUMBER DEFAULT NULL,
1647 p_entity IN VARCHAR2 DEFAULT NULL
1648 ) IS
1649 l_batch_process_id NUMBER;
1650 l_validate_meaning VARCHAR2(80);
1651 l_entity_meaning VARCHAR2(80);
1652 l_entity VARCHAR2(30);
1653 l_org_name HR_ORGANIZATION_UNITS.NAME%TYPE;
1654 l_tot_rows_processed NUMBER;
1655 l_tot_rows_failed NUMBER;
1656 l_tot_rows_warned NUMBER;
1657
1658 CURSOR lookup_meaning_csr (cp_code IN VARCHAR2) IS
1659 SELECT meaning
1660 FROM fnd_lookups
1661 WHERE lookup_type = 'OKC_YN' and lookup_code = cp_code;
1662
1663 CURSOR org_name_csr (cp_org_id IN NUMBER) IS
1664 SELECT NAME
1665 FROM HR_ORGANIZATION_UNITS
1666 WHERE ORGANIZATION_ID = cp_org_id;
1667
1668 CURSOR entity_meaning_csr (cp_ent_code IN VARCHAR2) IS
1669 SELECT meaning
1670 FROM fnd_lookups
1671 WHERE lookup_type = 'OKC_ARTICLE_IMPORT_ENTITY' and lookup_code = cp_ent_code;
1672 BEGIN
1673 FND_MSG_PUB.initialize;
1674
1675 --initialize validate_meaning with p_validate_only
1676 --and fetch the translated lookup meaning for this
1677 l_entity := p_entity;
1678 l_batch_process_id := p_batch_process_id;
1679 l_validate_meaning := p_validate_only;
1680 l_tot_rows_processed := p_tot_rows_processed;
1681 l_tot_rows_failed := p_tot_rows_failed;
1682 l_tot_rows_warned := p_tot_rows_warned;
1683
1684 OPEN lookup_meaning_csr(p_validate_only);
1685 FETCH lookup_meaning_csr INTO l_validate_meaning;
1686 CLOSE lookup_meaning_csr;
1687
1688
1689 OPEN entity_meaning_csr(p_entity);
1690 FETCH entity_meaning_csr INTO l_entity_meaning;
1691 CLOSE entity_meaning_csr;
1692
1693 -- MOAC
1694 G_CURRENT_ORG_ID := mo_global.get_current_org_id();
1695
1696 IF G_CURRENT_ORG_ID IS NULL THEN
1697 Okc_Api.Set_Message(G_APP_NAME,'OKC_ART_NULL_ORG_ID');
1698 RAISE FND_API.G_EXC_ERROR;
1699 END IF;
1700
1701 OPEN org_name_csr (G_CURRENT_ORG_ID);
1702 FETCH org_name_csr INTO l_org_name;
1703 CLOSE org_name_csr;
1704
1705 /* commented for XML Based clause Import
1706 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
1707 p_msg_name => 'OKC_ART_IMP_OUTPUT',
1708 p_token1 => 'ENTITY',
1709 p_token1_value => p_entity,
1710 p_token2 => 'BATCH_NUMBER',
1711 p_token2_value => p_batch_number,
1712 p_token3 => 'BATCH_PROCESS_ID',
1713 p_token3_value => l_batch_process_id,
1714 p_token4 => 'TOTAL_ROWS',
1715 p_token4_value => l_tot_rows_processed,
1716 p_token5 => 'TOTAL_SUCCESS',
1717 p_token5_value => l_tot_rows_processed-l_tot_rows_failed,
1718 p_token6 => 'TOTAL_FAILED',
1719 p_token6_value => l_tot_rows_failed,
1720 p_token7 => 'TOTAL_WARNED',
1721 p_token7_value => l_tot_rows_warned,
1722 p_token8 => 'ORG_NAME',
1723 p_token8_value => l_org_name,
1724 p_token9 => 'VALIDATE_ONLY',
1725 p_token9_value => l_validate_meaning);
1726 */
1727 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
1728 p_msg_name => 'OKC_ART_IMP_OUT1',
1729 p_token1 => 'ENTITY',
1730 p_token1_value => l_entity_meaning,
1731 p_token2 => 'TOTAL_ROWS',
1732 p_token2_value => l_tot_rows_processed,
1733 p_token3 => 'TOTAL_SUCCESS',
1734 p_token3_value => l_tot_rows_processed-l_tot_rows_failed,
1735 p_token4 => 'TOTAL_FAILED',
1736 p_token4_value => l_tot_rows_failed);
1737
1738 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, FND_MSG_PUB.Get(1,p_encoded=>FND_API.G_FALSE));
1739
1740 FND_MSG_PUB.initialize;
1741 commit;
1742 END wrap_up;
1743
1744 /*===================================================
1745 | PROCEDURE import articles details
1746 +==================================================*/
1747 PROCEDURE import_articles(
1748 x_return_status OUT NOCOPY VARCHAR2,
1749 x_msg_count OUT NOCOPY NUMBER,
1750 x_msg_data OUT NOCOPY VARCHAR2,
1751
1752 p_batch_procs_id IN NUMBER,
1753 p_batch_number IN VARCHAR2,
1754 p_validate_only IN VARCHAR2 := 'Y',
1755 p_fetchsize IN NUMBER := 100,
1756 p_rows_processed OUT NOCOPY NUMBER,
1757 p_rows_failed OUT NOCOPY NUMBER,
1758 p_rows_warned OUT NOCOPY NUMBER
1759 ) IS
1760 l_api_version CONSTANT NUMBER := 1;
1761 l_api_name CONSTANT VARCHAR2(30) := 'import_articles';
1762 l_sts_warning CONSTANT VARCHAR2(1) := 'W';
1763 l_row_notfound BOOLEAN := FALSE;
1764 l_user_id NUMBER;
1765 l_login_id NUMBER;
1766 l_insert_errors_exception EXCEPTION;
1767 l_insert_errors_error CONSTANT VARCHAR2(1) := 'X';
1768 l_userenv_lang VARCHAR2(10);
1769
1770 -- Some (minimal) Article Level attributes are nvl-ed in the case of update and
1771 -- new version as they cannot be changed after the first version is created.
1772 -- User must pass all other attibutes irregardless of the mode (except of course
1773 -- the ids)
1774
1775 CURSOR l_interface_csr ( cp_local_org_id IN NUMBER,
1776 cp_batch_number IN VARCHAR2) IS
1777 SELECT
1778 INTRFC.INTERFACE_ID ,
1779 INTRFC.BATCH_NUMBER ,
1780 INTRFC.OBJECT_VERSION_NUMBER ,
1781 INTRFC.ARTICLE_TITLE ,
1782 INTRFC.ORG_ID ,
1783 INTRFC.PROCESS_STATUS ,
1784 INTRFC.ACTION ,
1785 NVL(INTRFC.ARTICLE_NUMBER, ART.ARTICLE_NUMBER) ,
1786 NVL(INTRFC.ARTICLE_INTENT, ART.ARTICLE_INTENT) ,
1787 ART.ARTICLE_INTENT X_ARTICLE_INTENT ,
1788 INTRFC.ARTICLE_LANGUAGE ,
1789 ART.ARTICLE_LANGUAGE X_ARTICLE_LANGUAGE ,
1790 NVL(INTRFC.ARTICLE_TYPE, ART.ARTICLE_TYPE) ,
1791 ART.ARTICLE_ID ,
1792 INTRFC.ART_SYSTEM_REFERENCE_CODE,
1793 INTRFC.ART_SYSTEM_REFERENCE_ID1,
1794 INTRFC.ART_SYSTEM_REFERENCE_ID2,
1795 INTRFC.ARTICLE_VERSION_NUMBER ,
1796 INTRFC.ARTICLE_TEXT ,
1797 INTRFC.PROVISION_YN ,
1798 INTRFC.INSERT_BY_REFERENCE ,
1799 INTRFC.LOCK_TEXT ,
1800 INTRFC.GLOBAL_YN ,
1801 INTRFC.ARTICLE_STATUS ,
1802 INTRFC.START_DATE ,
1803 INTRFC.END_DATE ,
1804 INTRFC.DISPLAY_NAME ,
1805 INTRFC.ARTICLE_DESCRIPTION ,
1806 INTRFC.DATE_APPROVED ,
1807 INTRFC.DEFAULT_SECTION ,
1808 INTRFC.REFERENCE_SOURCE ,
1809 INTRFC.REFERENCE_TEXT ,
1810 INTRFC.VER_SYSTEM_REFERENCE_CODE ,
1811 INTRFC.VER_SYSTEM_REFERENCE_ID1 ,
1812 INTRFC.VER_SYSTEM_REFERENCE_ID2 ,
1813 INTRFC.ADDITIONAL_INSTRUCTIONS ,
1814 INTRFC.DATE_PUBLISHED,
1815 INTRFC.ATTRIBUTE_CATEGORY,
1816 INTRFC.ATTRIBUTE1 ,
1817 INTRFC.ATTRIBUTE2 ,
1818 INTRFC.ATTRIBUTE3 ,
1819 INTRFC.ATTRIBUTE4 ,
1820 INTRFC.ATTRIBUTE5 ,
1821 INTRFC.ATTRIBUTE6 ,
1822 INTRFC.ATTRIBUTE7 ,
1823 INTRFC.ATTRIBUTE8 ,
1824 INTRFC.ATTRIBUTE9 ,
1825 INTRFC.ATTRIBUTE10 ,
1826 INTRFC.ATTRIBUTE11 ,
1827 INTRFC.ATTRIBUTE12 ,
1828 INTRFC.ATTRIBUTE13 ,
1829 INTRFC.ATTRIBUTE14 ,
1830 INTRFC.ATTRIBUTE15,
1831 TO_NUMBER(NULL) ARTICLE_VERSION_ID
1832 FROM OKC_ART_INTERFACE_ALL INTRFC, OKC_ARTICLES_ALL ART
1833 WHERE nvl(PROCESS_STATUS,'*') NOT IN ('W', 'S')
1834 AND INTRFC.ORG_ID = cp_local_org_id
1835 AND BATCH_NUMBER = cp_batch_number
1836 AND RTRIM(INTRFC.ARTICLE_TITLE) = ART.ARTICLE_TITLE(+)
1837 AND INTRFC.ORG_ID = ART.ORG_ID(+)
1838 AND ART.STANDARD_YN(+) = 'Y'
1839 ORDER BY RTRIM(INTRFC.ARTICLE_TITLE) ASC;
1840
1841 -- Cursor returns article status, version id and version number
1842 -- for the most recent version with article_id
1843
1844 CURSOR get_max_article_version_csr (cp_article_id IN NUMBER) IS
1845 SELECT
1846 ARTICLE_VERSION_ID,
1847 ARTICLE_VERSION_NUMBER,
1848 ARTICLE_STATUS,
1849 START_DATE
1850 FROM OKC_ARTICLE_VERSIONS A
1851 WHERE article_id = cp_article_id
1852 and start_date = (SELECT max(start_date)
1853 FROM okc_article_versions
1854 WHERE article_id = a.article_id);
1855
1856 -- Cursor to get article level information for V, U interface row
1857 CURSOR get_article_info_csr (cp_article_id IN NUMBER) IS
1858 SELECT
1859 ARTICLE_INTENT,
1860 ARTICLE_LANGUAGE
1861 FROM OKC_ARTICLES_ALL
1862 WHERE ARTICLE_ID = cp_article_id;
1863
1864 -- Cursor to validate article type
1865 -- If article type is not active any more but it is not valid
1866 CURSOR validate_article_type_csr ( cp_article_type IN VARCHAR2,
1867 cp_article_id IN NUMBER,
1868 cp_action IN VARCHAR2) IS
1869 SELECT lookup_code
1870 FROM fnd_lookups
1871 WHERE lookup_type = 'OKC_SUBJECT'
1872 AND lookup_code = cp_article_type
1873 AND start_date_active <= trunc(sysdate)
1874 AND nvl(end_date_active,sysdate+1) >= trunc(sysdate);
1875
1876 -- Check validity of valueset
1877 -- Split into two cursor for performance as var_name may not be used frequently
1878 CURSOR l_check_valid_valueset_csr (cp_variable_code IN VARCHAR2) IS
1879 SELECT FLX.FLEX_VALUE_SET_ID,
1880 BVB.VARIABLE_TYPE
1881 FROM
1882 OKC_BUS_VARIABLES_B BVB,
1883 FND_FLEX_VALUE_SETS FLX
1884 WHERE BVB.VARIABLE_CODE = cp_variable_code
1885 --AND BVB.VARIABLE_TYPE = 'U'
1886 AND FLX.FLEX_VALUE_SET_ID(+) = BVB.VALUE_SET_ID;
1887
1888 CURSOR l_var_name_csr (cp_variable_code IN VARCHAR2,
1889 cp_lang IN VARCHAR2) IS
1890 SELECT BVT.VARIABLE_NAME
1891 FROM
1892 OKC_BUS_VARIABLES_TL BVT
1893 WHERE BVT.VARIABLE_CODE = cp_variable_code
1894 AND BVT.LANGUAGE = cp_lang;
1895
1896 -- Interface Rows
1897
1898 TYPE l_inf_interface_id IS TABLE OF OKC_ART_INTERFACE_ALL.INTERFACE_ID%TYPE INDEX BY BINARY_INTEGER ;
1899 TYPE l_inf_batch_number IS TABLE OF OKC_ART_INTERFACE_ALL.BATCH_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
1900 TYPE l_inf_object_version_number IS TABLE OF OKC_ART_INTERFACE_ALL.OBJECT_VERSION_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
1901 TYPE l_inf_article_title IS TABLE OF OKC_ART_INTERFACE_ALL.ARTICLE_TITLE%TYPE INDEX BY BINARY_INTEGER ;
1902 TYPE l_inf_org_id IS TABLE OF OKC_ART_INTERFACE_ALL.ORG_ID%TYPE INDEX BY BINARY_INTEGER ;
1903 TYPE l_inf_process_status IS TABLE OF OKC_ART_INTERFACE_ALL.PROCESS_STATUS%TYPE INDEX BY BINARY_INTEGER ;
1904 TYPE l_inf_action IS TABLE OF OKC_ART_INTERFACE_ALL.ACTION%TYPE INDEX BY BINARY_INTEGER ;
1905 TYPE l_inf_article_number IS TABLE OF OKC_ART_INTERFACE_ALL.ARTICLE_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
1906 TYPE l_inf_article_intent IS TABLE OF OKC_ART_INTERFACE_ALL.ARTICLE_INTENT%TYPE INDEX BY BINARY_INTEGER ;
1907 TYPE l_inf_article_language IS TABLE OF OKC_ART_INTERFACE_ALL.ARTICLE_LANGUAGE%TYPE INDEX BY BINARY_INTEGER ;
1908 TYPE l_inf_article_type IS TABLE OF OKC_ART_INTERFACE_ALL.ARTICLE_TYPE%TYPE INDEX BY BINARY_INTEGER ;
1909 TYPE l_inf_article_id IS TABLE OF OKC_ARTICLES_ALL.ARTICLE_ID%TYPE INDEX BY BINARY_INTEGER ;
1910 TYPE l_inf_art_reference_code IS TABLE OF OKC_ART_INTERFACE_ALL.ART_SYSTEM_REFERENCE_CODE%TYPE INDEX BY BINARY_INTEGER ;
1911 TYPE l_inf_art_reference_id1 IS TABLE OF OKC_ART_INTERFACE_ALL.ART_SYSTEM_REFERENCE_ID1%TYPE INDEX BY BINARY_INTEGER ;
1912 TYPE l_inf_art_reference_id2 IS TABLE OF OKC_ART_INTERFACE_ALL.ART_SYSTEM_REFERENCE_ID2%TYPE INDEX BY BINARY_INTEGER ;
1913 TYPE l_inf_article_text IS TABLE OF OKC_ART_INTERFACE_ALL.ARTICLE_TEXT%TYPE INDEX BY BINARY_INTEGER ;
1914 TYPE l_inf_provision_yn IS TABLE OF OKC_ART_INTERFACE_ALL.PROVISION_YN%TYPE INDEX BY BINARY_INTEGER ;
1915 TYPE l_inf_insert_by_reference IS TABLE OF OKC_ART_INTERFACE_ALL.INSERT_BY_REFERENCE%TYPE INDEX BY BINARY_INTEGER ;
1916 TYPE l_inf_lock_text IS TABLE OF OKC_ART_INTERFACE_ALL.LOCK_TEXT%TYPE INDEX BY BINARY_INTEGER ;
1917 TYPE l_inf_global_yn IS TABLE OF OKC_ART_INTERFACE_ALL.GLOBAL_YN%TYPE INDEX BY BINARY_INTEGER ;
1918 TYPE l_inf_article_status IS TABLE OF OKC_ART_INTERFACE_ALL.ARTICLE_STATUS%TYPE INDEX BY BINARY_INTEGER ;
1919 TYPE l_inf_start_date IS TABLE OF OKC_ART_INTERFACE_ALL.START_DATE%TYPE INDEX BY BINARY_INTEGER ;
1920 TYPE l_inf_end_date IS TABLE OF OKC_ART_INTERFACE_ALL.END_DATE%TYPE INDEX BY BINARY_INTEGER ;
1921 TYPE l_inf_display_name IS TABLE OF OKC_ART_INTERFACE_ALL.DISPLAY_NAME%TYPE INDEX BY BINARY_INTEGER ;
1922 TYPE l_inf_article_description IS TABLE OF OKC_ART_INTERFACE_ALL.ARTICLE_DESCRIPTION%TYPE INDEX BY BINARY_INTEGER ;
1923 TYPE l_inf_date_approved IS TABLE OF OKC_ART_INTERFACE_ALL.DATE_APPROVED%TYPE INDEX BY BINARY_INTEGER ;
1924 TYPE l_inf_default_section IS TABLE OF OKC_ART_INTERFACE_ALL.DEFAULT_SECTION%TYPE INDEX BY BINARY_INTEGER ;
1925 TYPE l_inf_reference_source IS TABLE OF OKC_ART_INTERFACE_ALL.REFERENCE_SOURCE%TYPE INDEX BY BINARY_INTEGER ;
1926 TYPE l_inf_reference_text IS TABLE OF OKC_ART_INTERFACE_ALL.REFERENCE_TEXT%TYPE INDEX BY BINARY_INTEGER ;
1927 TYPE l_inf_ver_reference_code IS TABLE OF OKC_ART_INTERFACE_ALL.VER_SYSTEM_REFERENCE_CODE%TYPE INDEX BY BINARY_INTEGER ;
1928 TYPE l_inf_ver_reference_id1 IS TABLE OF OKC_ART_INTERFACE_ALL.VER_SYSTEM_REFERENCE_ID1%TYPE INDEX BY BINARY_INTEGER ;
1929 TYPE l_inf_ver_reference_id2 IS TABLE OF OKC_ART_INTERFACE_ALL.VER_SYSTEM_REFERENCE_ID2%TYPE INDEX BY BINARY_INTEGER ;
1930 TYPE l_inf_instructions IS TABLE OF OKC_ART_INTERFACE_ALL.ADDITIONAL_INSTRUCTIONS%TYPE INDEX BY BINARY_INTEGER ;
1931 TYPE l_inf_date_published IS TABLE OF OKC_ART_INTERFACE_ALL.DATE_PUBLISHED%TYPE INDEX BY BINARY_INTEGER ;
1932 TYPE l_inf_attribute_category IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE_CATEGORY%TYPE INDEX BY BINARY_INTEGER ;
1933 TYPE l_inf_attribute1 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE1%TYPE INDEX BY BINARY_INTEGER ;
1934 TYPE l_inf_attribute2 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE2%TYPE INDEX BY BINARY_INTEGER ;
1935 TYPE l_inf_attribute3 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE3%TYPE INDEX BY BINARY_INTEGER ;
1936 TYPE l_inf_attribute4 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE4%TYPE INDEX BY BINARY_INTEGER ;
1937 TYPE l_inf_attribute5 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE5%TYPE INDEX BY BINARY_INTEGER ;
1938 TYPE l_inf_attribute6 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE6%TYPE INDEX BY BINARY_INTEGER ;
1939 TYPE l_inf_attribute7 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE7%TYPE INDEX BY BINARY_INTEGER ;
1940 TYPE l_inf_attribute8 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE8%TYPE INDEX BY BINARY_INTEGER ;
1941 TYPE l_inf_attribute9 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE9%TYPE INDEX BY BINARY_INTEGER ;
1942 TYPE l_inf_attribute10 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE10%TYPE INDEX BY BINARY_INTEGER ;
1943 TYPE l_inf_attribute11 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE11%TYPE INDEX BY BINARY_INTEGER ;
1944 TYPE l_inf_attribute12 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE12%TYPE INDEX BY BINARY_INTEGER ;
1945 TYPE l_inf_attribute13 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE13%TYPE INDEX BY BINARY_INTEGER ;
1946 TYPE l_inf_attribute14 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE14%TYPE INDEX BY BINARY_INTEGER ;
1947 TYPE l_inf_attribute15 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE15%TYPE INDEX BY BINARY_INTEGER ;
1948 TYPE l_inf_article_version_id IS TABLE OF OKC_ARTICLE_VERSIONS.ARTICLE_VERSION_ID%TYPE INDEX BY BINARY_INTEGER ;
1949 TYPE l_inf_article_version_number IS TABLE OF OKC_ART_INTERFACE_ALL.ARTICLE_VERSION_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
1950 TYPE l_inf_adoption_type IS TABLE OF OKC_ARTICLE_VERSIONS.ADOPTION_TYPE%TYPE INDEX BY BINARY_INTEGER ;
1951
1952
1953
1954 -- For Article Variables
1955 TYPE list_artv_article_version_id IS TABLE OF OKC_ARTICLE_VARIABLES.ARTICLE_VERSION_ID%TYPE INDEX BY BINARY_INTEGER ;
1956 TYPE list_artv_variable_code IS TABLE OF OKC_ARTICLE_VARIABLES.VARIABLE_CODE%TYPE INDEX BY BINARY_INTEGER ;
1957 TYPE list_artv_action IS TABLE OF VARCHAR2(1) INDEX BY BINARY_INTEGER ;
1958
1959 l_article_language VARCHAR2(3);
1960
1961 -- Variables for interface
1962 inf_interface_id_tbl l_inf_interface_id ;
1963 inf_batch_number_tbl l_inf_batch_number ;
1964 inf_object_version_number_tbl l_inf_object_version_number ;
1965 inf_article_title_tbl l_inf_article_title ;
1966 inf_org_id_tbl l_inf_org_id ;
1967 inf_process_status_tbl l_inf_process_status ;
1968 inf_action_tbl l_inf_action ;
1969 inf_article_number_tbl l_inf_article_number ;
1970 inf_article_intent_tbl l_inf_article_intent ;
1971 inf_x_article_intent_tbl l_inf_article_intent ;
1972 inf_article_language_tbl l_inf_article_language ;
1973 inf_x_article_language_tbl l_inf_article_language ;
1974 inf_article_type_tbl l_inf_article_type ;
1975 inf_article_id_tbl l_inf_article_id ;
1976 inf_art_reference_code_tbl l_inf_art_reference_code ;
1977 inf_art_reference_id1_tbl l_inf_art_reference_id1 ;
1978 inf_art_reference_id2_tbl l_inf_art_reference_id2 ;
1979 inf_article_text_tbl l_inf_article_text ;
1980 inf_provision_yn_tbl l_inf_provision_yn ;
1981 inf_insert_by_reference_tbl l_inf_insert_by_reference ;
1982 inf_lock_text_tbl l_inf_lock_text ;
1983 inf_global_yn_tbl l_inf_global_yn ;
1984 inf_article_status_tbl l_inf_article_status ;
1985 inf_start_date_tbl l_inf_start_date ;
1986 inf_end_date_tbl l_inf_end_date ;
1987 inf_display_name_tbl l_inf_display_name ;
1988 inf_article_description_tbl l_inf_article_description ;
1989 inf_date_approved_tbl l_inf_date_approved ;
1990 inf_default_section_tbl l_inf_default_section ;
1991 inf_reference_source_tbl l_inf_reference_source ;
1992 inf_reference_text_tbl l_inf_reference_text ;
1993 inf_ver_reference_code_tbl l_inf_ver_reference_code ;
1994 inf_ver_reference_id1_tbl l_inf_ver_reference_id1 ;
1995 inf_ver_reference_id2_tbl l_inf_ver_reference_id2 ;
1996 inf_instructions_tbl l_inf_instructions ;
1997 inf_date_published_tbl l_inf_date_published ;
1998 inf_attribute_category_tbl l_inf_attribute_category ;
1999 inf_attribute1_tbl l_inf_attribute1 ;
2000 inf_attribute2_tbl l_inf_attribute2 ;
2001 inf_attribute3_tbl l_inf_attribute3 ;
2002 inf_attribute4_tbl l_inf_attribute4 ;
2003 inf_attribute5_tbl l_inf_attribute5 ;
2004 inf_attribute6_tbl l_inf_attribute6 ;
2005 inf_attribute7_tbl l_inf_attribute7 ;
2006 inf_attribute8_tbl l_inf_attribute8 ;
2007 inf_attribute9_tbl l_inf_attribute9 ;
2008 inf_attribute10_tbl l_inf_attribute10 ;
2009 inf_attribute11_tbl l_inf_attribute11 ;
2010 inf_attribute12_tbl l_inf_attribute12 ;
2011 inf_attribute13_tbl l_inf_attribute13 ;
2012 inf_attribute14_tbl l_inf_attribute14 ;
2013 inf_attribute15_tbl l_inf_attribute15 ;
2014 inf_article_version_id_tbl l_inf_article_version_id ;
2015 inf_earlier_version_id_tbl l_inf_article_version_id ;
2016 inf_article_version_number_tbl l_inf_article_version_number ;
2017 inf_adoption_type_tbl l_inf_adoption_type;
2018
2019 artv_article_version_id_tbl list_artv_article_version_id ;
2020 artv_variable_code_tbl OKC_ARTICLES_GRP.variable_code_tbl_type ;
2021 artv_action_tbl list_artv_action ;
2022 l_variable_code_tbl OKC_ARTICLES_GRP.variable_code_tbl_type ;
2023
2024 I NUMBER := 0;
2025 j NUMBER := 0;
2026 k NUMBER := 0;
2027 x NUMBER := 0;
2028 l_earlier_version_id OKC_ARTICLE_VERSIONS.ARTICLE_VERSION_ID%TYPE;
2029 l_article_version_id OKC_ARTICLE_VERSIONS.ARTICLE_VERSION_ID%TYPE;
2030 l_article_status OKC_ARTICLE_VERSIONS.ARTICLE_STATUS%TYPE;
2031 l_start_date OKC_ARTICLE_VERSIONS.START_DATE%TYPE;
2032 l_tmp_article_status OKC_ARTICLE_VERSIONS.ARTICLE_STATUS%TYPE;
2033 l_earlier_version_number OKC_ARTICLE_VERSIONS.ARTICLE_VERSION_NUMBER%TYPE;
2034 l_earlier_adoption_type OKC_ARTICLE_VERSIONS.ADOPTION_TYPE%TYPE;
2035 l_article_number OKC_ARTICLES_ALL.ARTICLE_NUMBER%TYPE;
2036 l_article_version_number OKC_ARTICLE_VERSIONS.ARTICLE_VERSION_NUMBER%TYPE;
2037 l_variables_to_insert_tbl OKC_ARTICLES_GRP.variable_code_tbl_type;
2038 l_variables_to_delete_tbl OKC_ARTICLES_GRP.variable_code_tbl_type;
2039 l_adoption_type OKC_ARTICLE_VERSIONS.ADOPTION_TYPE%TYPE;
2040 l_program_id OKC_ART_INTERFACE_ALL.PROGRAM_ID%TYPE;
2041 l_program_login_id OKC_ART_INTERFACE_ALL.PROGRAM_LOGIN_ID%TYPE;
2042 l_program_appl_id OKC_ART_INTERFACE_ALL.PROGRAM_APPLICATION_ID%TYPE;
2043 l_request_id OKC_ART_INTERFACE_ALL.REQUEST_ID%TYPE;
2044 l_variable_name OKC_BUS_VARIABLES_TL.VARIABLE_NAME%TYPE;
2045 l_variable_type OKC_BUS_VARIABLES_B.VARIABLE_TYPE%TYPE;
2046 l_value_set_id FND_FLEX_VALUE_SETS.FLEX_VALUE_SET_ID%TYPE;
2047 l_return_status VARCHAR2(1);
2048 api_return_status VARCHAR2(1);
2049 l_doc_sequence_type CHAR(1);
2050 l_error_index NUMBER := 1;
2051 l_replace_text VARCHAR2(1) := 'N';
2052 l_batch_process_id NUMBER := 1;
2053 l_context VARCHAR2(50) := NULL;
2054 l_init_msg_list VARCHAR2(200) := okc_api.g_true;
2055 l_tot_rows_processed NUMBER := 0;
2056 l_tot_rows_failed NUMBER := 0;
2057 l_tot_rows_warned NUMBER := 0;
2058 l_part_rows_processed NUMBER := 0;
2059 l_part_rows_failed NUMBER := 0;
2060 l_part_rows_warned NUMBER := 0;
2061 l_bulk_failed VARCHAR2(1) := 'Y';
2062 l_exist_approver VARCHAR2(5) := 'NOK';
2063 save_threshold WF_ENGINE.threshold%TYPE;
2064
2065 ------------------------------------------------------------------------
2066 -- PROCEDURE import_articles body starts
2067 -------------------------------------------------------------------------
2068
2069 BEGIN
2070
2071
2072 IF (l_debug = 'Y') THEN
2073 okc_debug.log('100: Entered article_import', 2);
2074 END IF;
2075
2076
2077 ------------------------------------------------------------------------
2078 -- Variable Initialization
2079 -------------------------------------------------------------------------
2080
2081 -- Standard Start of API savepoint
2082 FND_MSG_PUB.initialize;
2083 -- Initialize API return status to success
2084 x_return_status := FND_API.G_RET_STS_SUCCESS;
2085 l_return_status := G_RET_STS_SUCCESS;
2086 -- Cache user_id, login_id and org_id
2087 l_user_id := Fnd_Global.user_id;
2088 l_login_id := Fnd_Global.login_id;
2089 l_userenv_lang := USERENV('LANG');
2090
2091 -- MOAC
2092 G_CURRENT_ORG_ID := mo_global.get_current_org_id();
2093 /*
2094 OPEN cur_org_csr;
2095 FETCH cur_org_csr INTO G_CURRENT_ORG_ID;
2096 CLOSE cur_org_csr;
2097 */
2098 -- MOAC
2099 IF G_CURRENT_ORG_ID IS NULL THEN
2100 Okc_Api.Set_Message(G_APP_NAME,'OKC_ART_NULL_ORG_ID');
2101 RAISE FND_API.G_EXC_ERROR;
2102 END IF;
2103
2104
2105 IF G_CURRENT_ORG_ID = G_GLOBAL_ORG_ID THEN
2106 l_adoption_type := NULL;
2107 ELSE
2108 l_adoption_type := 'LOCAL';
2109 END IF;
2110
2111
2112 IF FND_GLOBAL.CONC_PROGRAM_ID = -1 THEN
2113 l_program_id := NULL;
2114 ELSE
2115 l_program_id := FND_GLOBAL.CONC_PROGRAM_ID;
2116 END IF;
2117
2118 IF FND_GLOBAL.CONC_LOGIN_ID = -1 THEN
2119 l_program_login_id := NULL;
2120 ELSE
2121 l_program_login_id := FND_GLOBAL.CONC_LOGIN_ID;
2122 END IF;
2123
2124 IF FND_GLOBAL.PROG_APPL_ID = -1 THEN
2125 l_program_appl_id := NULL;
2126 ELSE
2127 l_program_appl_id := FND_GLOBAL.PROG_APPL_ID;
2128 END IF;
2129
2130 IF FND_GLOBAL.CONC_REQUEST_ID = -1 THEN
2131 l_request_id := NULL;
2132 ELSE
2133 l_request_id := FND_GLOBAL.CONC_REQUEST_ID;
2134 END IF;
2135
2136 l_batch_process_id := p_batch_procs_id;
2137 ------------------------------------------------------------------------
2138 -- Parameter Validation
2139 -------------------------------------------------------------------------
2140
2141 IF (p_fetchsize > G_FETCHSIZE_LIMIT) THEN
2142 x_return_status := G_RET_STS_ERROR;
2143 l_return_status := G_RET_STS_ERROR;
2144
2145 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2146 p_msg_name => 'OKC_ART_IMP_LIM_FETCHSIZE');
2147
2148 build_error_array(
2149 p_msg_data => x_msg_data,
2150 p_context => NULL,
2151 p_batch_process_id => l_batch_process_id,
2152 p_interface_id => -99,
2153 p_article_title => NULL,
2154 p_error_type => l_return_status,
2155 p_entity => 'CLAUSE'
2156 );
2157
2158 RAISE FND_API.G_EXC_ERROR ;
2159 END IF;
2160
2161 ------------------------------------------------------------------------
2162 -- Global TempClob Array Initialization
2163 -------------------------------------------------------------------------
2164 g_temp_clob_tbl.extend(p_fetchsize);
2165 FOR i in 1..p_fetchsize LOOP
2166 -- Create Temporary Clob. Clob is created not in session level to prevent
2167 -- from running ouf of session memory
2168 DBMS_LOB.CREATETEMPORARY(g_temp_clob_tbl(i), TRUE);
2169 END LOOP;
2170
2171 -------------------------------------------------------------------------
2172 --------------- the outermost loop of this procedure --------------------
2173 -- Bulk fetch all interface rows based on the fetchsize passed by the user
2174 -------------------------------------------------------------------------
2175
2176 l_context :='BULK FETCH CLAUSE INTERFACE ROW';
2177 OPEN l_interface_csr ( G_CURRENT_ORG_ID ,
2178 p_batch_number );
2179 LOOP
2180 BEGIN
2181 FETCH l_interface_csr BULK COLLECT INTO
2182 inf_interface_id_tbl ,
2183 inf_batch_number_tbl ,
2184 inf_object_version_number_tbl ,
2185 inf_article_title_tbl ,
2186 inf_org_id_tbl ,
2187 inf_process_status_tbl ,
2188 inf_action_tbl ,
2189 inf_article_number_tbl ,
2190 inf_article_intent_tbl ,
2191 inf_x_article_intent_tbl ,
2192 inf_article_language_tbl ,
2193 inf_x_article_language_tbl ,
2194 inf_article_type_tbl ,
2195 inf_article_id_tbl ,
2196 inf_art_reference_code_tbl ,
2197 inf_art_reference_id1_tbl ,
2198 inf_art_reference_id2_tbl ,
2199 inf_article_version_number_tbl ,
2200 inf_article_text_tbl ,
2201 inf_provision_yn_tbl ,
2202 inf_insert_by_reference_tbl ,
2203 inf_lock_text_tbl ,
2204 inf_global_yn_tbl ,
2205 inf_article_status_tbl ,
2206 inf_start_date_tbl ,
2207 inf_end_date_tbl ,
2208 inf_display_name_tbl ,
2209 inf_article_description_tbl ,
2210 inf_date_approved_tbl ,
2211 inf_default_section_tbl ,
2212 inf_reference_source_tbl ,
2213 inf_reference_text_tbl ,
2214 inf_ver_reference_code_tbl ,
2215 inf_ver_reference_id1_tbl ,
2216 inf_ver_reference_id2_tbl ,
2217 inf_instructions_tbl ,
2218 inf_date_published_tbl ,
2219 inf_attribute_category_tbl ,
2220 inf_attribute1_tbl ,
2221 inf_attribute2_tbl ,
2222 inf_attribute3_tbl ,
2223 inf_attribute4_tbl ,
2224 inf_attribute5_tbl ,
2225 inf_attribute6_tbl ,
2226 inf_attribute7_tbl ,
2227 inf_attribute8_tbl ,
2228 inf_attribute9_tbl ,
2229 inf_attribute10_tbl ,
2230 inf_attribute11_tbl ,
2231 inf_attribute12_tbl ,
2232 inf_attribute13_tbl ,
2233 inf_attribute14_tbl ,
2234 inf_attribute15_tbl ,
2235 inf_article_version_id_tbl LIMIT p_fetchsize;
2236 EXIT WHEN inf_interface_id_tbl.COUNT = 0 ;
2237
2238 ------------------------------------------------------------------------
2239 -- Variable initialization
2240 -------------------------------------------------------------------------
2241 --For each fetch, article variable table index should be initialized
2242 j := 1;
2243 --##count:initialization
2244 l_tot_rows_processed := l_tot_rows_processed+l_part_rows_processed;
2245 l_tot_rows_failed := l_tot_rows_failed+l_part_rows_failed;
2246 l_tot_rows_warned := l_tot_rows_warned+l_part_rows_warned;
2247 l_part_rows_processed := 0;
2248 l_part_rows_failed := 0;
2249 l_part_rows_warned := 0;
2250 l_bulk_failed := 'N';
2251 ---------------------------------------------------------------------------
2252 --------------------- Inner Loop thru fetched rows for---------------------
2253 -- validation, parse and validate article text, create a variable list
2254 -- prepare rows for DML if validate_only is 'N'
2255 /*** Processing Rule to set process_status
2256 Because we want to collect as much info as possible, we need to
2257 maintain process status while keeping the process moving.
2258 So, we'll set l_return_status as validation goes on and
2259 at the end we will set inf_process_status_tbl(i) with l_return_status
2260 for final result. However, we will get out of this process if there
2261 is a significant error such as 'U'.
2262 The return status examined
2263 -api_return_status : return status for api call
2264 -l_return_status : validation result of each row
2265 -x_return_status : final result status for concurrent program request
2266 Rule to set return status
2267 If api_return_status for api call is
2268 * 'S' then continue
2269 * 'W' and l_return_status not 'E' or 'U' then set l_return_status = 'W'
2270 and build_error_array then continue
2271 * 'E' and it is significant then set l_return_status = 'E' and raise
2272 Exception
2273 * 'E' and it is minor then set l_return_status = 'E' and continue. Raise
2274 'E' at the end of validation
2275 * 'U' then set l_return_status = 'U' and raise 'U' exception
2276 * At the end, if it goes thru with no Exception,
2277 Check if l_return_status is 'E' then raise Exception
2278 Otherwise (meaning l_return_status is 'S' or 'W'),
2279 inf_process_status_tbl(i) = l_return_status
2280 * In the exception, we will set
2281 inf_process_status_tbl(i) = l_return_status and build_error_array
2282 ***/
2283 -------------------------------------------------------------------------
2284
2285 FOR i in inf_interface_id_tbl.FIRST ..inf_interface_id_tbl.LAST LOOP
2286 BEGIN
2287 -- Increment total processed rows
2288 --##Count
2289 --l_tot_rows_processed := l_tot_rows_processed+1;
2290 l_part_rows_processed := l_part_rows_processed+1;
2291 -- Initialization for each iteration
2292 l_row_notfound := FALSE;
2293 l_return_status := G_RET_STS_SUCCESS;
2294 --for validate_row, we will pass 'DRAFT' status for 'APPROVED'
2295 --and 'PENDING_APPROVAL' status as it just means for submission for approval
2296 --or approved
2297 l_tmp_article_status := inf_article_status_tbl(i);
2298 -- following variables are not fetched from interface table
2299 -- thus initialize it here
2300 inf_earlier_version_id_tbl(i) := -99;
2301 inf_adoption_type_tbl(i) := l_adoption_type;
2302
2303
2304 l_context := 'CLAUSE VALIDATING';
2305
2306 -- To find duplicate title in the batch after RTRIM is performed Bug 3487759
2307 IF i>1 THEN
2308 x := i-1;
2309 IF RTRIM(inf_article_title_tbl(i)) = RTRIM(inf_article_title_tbl(x)) THEN
2310 Okc_Api.Set_Message(G_APP_NAME, 'OKC_ART_DUP_TITLE_ORG');
2311 l_return_status := G_RET_STS_ERROR;
2312 RAISE FND_API.G_EXC_ERROR;
2313 END IF;
2314 END IF;
2315 -- Logic to decide what to do in case of Action='S'
2316 -- If there is no existing article in system then it is 'N' otherwise 'V'
2317
2318 IF inf_action_tbl(i) = 'S' THEN
2319 IF inf_article_id_tbl(i) IS NULL THEN
2320 inf_action_tbl(i) := 'N';
2321 ELSE
2322 -- Changes for Bug# 6891498 Begins
2323 OPEN get_max_article_version_csr (inf_article_id_tbl(i));
2324 FETCH get_max_article_version_csr INTO l_article_version_id,
2325 l_article_version_number,
2326 l_article_status,
2327 l_start_date;
2328 -- l_edited_in_word;
2329 l_row_notfound := get_max_article_version_csr%NOTFOUND;
2330 CLOSE get_max_article_version_csr;
2331 IF nvl(l_article_status,'*') in ('DRAFT', 'REJECTED') THEN
2332 inf_action_tbl(i) := 'U';
2333 ELSE
2334 -- Changes for Bug# 6891498 Ends
2335 inf_action_tbl(i) := 'V';
2336 END IF; -- For Bug# 6891498
2337 END IF;
2338 END IF;
2339
2340 IF inf_action_tbl(i) = 'N' THEN
2341
2342 inf_article_id_tbl(i) := NULL;
2343 IF nvl(inf_article_status_tbl(i), '*') not in
2344 ('DRAFT','APPROVED','PENDING_APPROVAL') THEN
2345 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2346 p_msg_name => 'OKC_ART_IMP_INV_STS_NEWA',
2347 p_token1 => 'STATUS1',
2348 p_token1_value => 'DRAFT',
2349 p_token2 => 'STATUS2',
2350 p_token2_value => 'APPROVED',
2351 p_token3 => 'STATUS3',
2352 p_token3_value => 'PENDING_APPROVAL');
2353 l_return_status := G_RET_STS_ERROR;
2354 RAISE FND_API.G_EXC_ERROR ;
2355 END IF;
2356
2357 --TRIM trailing space because article title in library table has been trimmed
2358 --for successful comparison, this should be trimmed
2359 inf_article_title_tbl(i) := RTRIM(inf_article_title_tbl(i));
2360
2361 -- Set article version number as 1
2362 inf_article_version_number_tbl(i) := 1;
2363
2364 --validate this article with 'DRAFT'
2365 l_tmp_article_status := 'DRAFT';
2366
2367 ELSIF inf_action_tbl(i) = 'U' THEN
2368
2369 IF inf_article_id_tbl(i) is NULL THEN
2370 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2371 p_msg_name => 'OKC_ART_ARTICLE_NOT_FOUND',
2372 p_token1 => 'ARTICLE_TITLE',
2373 p_token1_value => inf_article_title_tbl(i));
2374 l_return_status := G_RET_STS_ERROR;
2375 RAISE FND_API.G_EXC_ERROR ;
2376 END IF;
2377
2378 OPEN get_max_article_version_csr (inf_article_id_tbl(i));
2379 FETCH get_max_article_version_csr INTO l_article_version_id,
2380 l_article_version_number,
2381 l_article_status,
2382 l_start_date;
2383 l_row_notfound := get_max_article_version_csr%NOTFOUND;
2384 CLOSE get_max_article_version_csr;
2385
2386 IF nvl(l_article_status,'*') not in ('DRAFT', 'REJECTED') THEN
2387 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2388 p_msg_name => 'OKC_ART_IMP_INV_CUR_STS_UPD');
2389 l_return_status := G_RET_STS_ERROR;
2390 RAISE FND_API.G_EXC_ERROR ;
2391 END IF;
2392 -- this status may be null for update row
2393 -- inf_article_status_tbl(i) := l_article_status;
2394 -- set the version number
2395 inf_article_version_number_tbl(i) := l_article_version_number;
2396 -- set article version id
2397 inf_article_version_id_tbl(i) := l_article_version_id;
2398
2399 IF nvl(inf_article_status_tbl(i), '*') not in
2400 ('DRAFT','REJECTED','APPROVED','PENDING_APPROVAL') THEN
2401 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2402 p_msg_name => 'OKC_ART_IMP_INV_STS_UPD',
2403 p_token1 => 'STATUS1',
2404 p_token1_value => 'DRAFT',
2405 p_token2 => 'STATUS2',
2406 p_token2_value => 'REJECTED',
2407 p_token3 => 'STATUS3',
2408 p_token3_value => 'APPROVED',
2409 p_token4 => 'STATUS4',
2410 p_token4_value => 'PENDING_APPROVAL');
2411 l_return_status := G_RET_STS_ERROR;
2412 RAISE FND_API.G_EXC_ERROR ;
2413 END IF;
2414
2415 --if interface article status is DRAFT and REJECTED then keep
2416 --the one in the library table. We don't want user to be able to change them
2417 --validate this article with 'DRAFT' for 'DRAFT', 'APPROVED', 'PENDING_APPROVAL'
2418 --or 'REJECTED' for 'REJECTED'
2419 IF nvl(inf_article_status_tbl(i), '*') in ('DRAFT', 'REJECTED') THEN
2420 inf_article_status_tbl(i) := l_article_status;
2421 l_tmp_article_status := l_article_status;
2422 ELSE
2423 l_tmp_article_status := 'DRAFT';
2424 END IF;
2425
2426
2427 -- User entered attribute in article level (intent, language) may not be
2428 -- accurate because we do not validate them for Update
2429 -- so here we need to fill some important attribute
2430 -- in interface table from database
2431 inf_article_intent_tbl(i) := inf_x_article_intent_tbl(i);
2432 inf_article_language_tbl(i) := inf_x_article_language_tbl(i);
2433
2434 ELSIF inf_action_tbl(i) = 'V' THEN
2435
2436 inf_article_version_id_tbl(i) := NULL;
2437 IF inf_article_id_tbl(i) is NULL THEN
2438 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2439 p_msg_name => 'OKC_ART_ARTICLE_NOT_FOUND',
2440 p_token1 => 'ARTICLE_TITLE',
2441 p_token1_value => inf_article_title_tbl(i));
2442 l_return_status := G_RET_STS_ERROR;
2443 RAISE FND_API.G_EXC_ERROR ;
2444 END IF;
2445
2446 IF nvl(inf_article_status_tbl(i), '*') not in
2447 ('DRAFT','APPROVED','PENDING_APPROVAL') THEN
2448 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2449 p_msg_name => 'OKC_ART_IMP_INV_STS_NEWA',
2450 p_token1 => 'STATUS1',
2451 p_token1_value => 'DRAFT',
2452 p_token2 => 'STATUS2',
2453 p_token2_value => 'APPROVED',
2454 p_token3 => 'STATUS3',
2455 p_token3_value => 'PENDING_APPROVAL');
2456 l_return_status := G_RET_STS_ERROR;
2457 RAISE FND_API.G_EXC_ERROR;
2458 END IF;
2459
2460
2461 -- User entered attribute in article level (intent, language)may not be
2462 -- accurate because we do not validate them for New Version
2463 -- so here we need to fill some important attribute
2464 -- in interface table from database
2465 inf_article_intent_tbl(i) := inf_x_article_intent_tbl(i);
2466 inf_article_language_tbl(i) := inf_x_article_language_tbl(i);
2467
2468 OPEN get_max_article_version_csr (inf_article_id_tbl(i));
2469 FETCH get_max_article_version_csr INTO l_article_version_id,
2470 l_article_version_number,
2471 l_article_status,
2472 l_start_date;
2473 l_row_notfound := get_max_article_version_csr%NOTFOUND;
2474 CLOSE get_max_article_version_csr;
2475
2476 -- Set article version number
2477 inf_article_version_number_tbl(i) := l_article_version_number +1;
2478
2479 --validate article with 'DRAFT' status
2480 --because validate_row api validation for 'Approved' article
2481 --is more suitable for article in 'Approved' status already
2482 --but in import, status 'Approved' means submission for approval
2483 l_tmp_article_status := 'DRAFT';
2484 ELSIF inf_action_tbl(i) = 'D' THEN
2485
2486 IF inf_article_id_tbl(i) is NULL THEN
2487 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2488 p_msg_name => 'OKC_ART_ARTICLE_NOT_FOUND',
2489 p_token1 => 'ARTICLE_TITLE',
2490 p_token1_value => inf_article_title_tbl(i));
2491 l_return_status := G_RET_STS_ERROR;
2492 RAISE FND_API.G_EXC_ERROR ;
2493 END IF;
2494
2495 IF inf_end_date_tbl(i) IS NULL THEN
2496 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2497 p_msg_name => 'OKC_ART_NULL_END_DATE');
2498 l_return_status := G_RET_STS_ERROR;
2499 RAISE FND_API.G_EXC_ERROR;
2500 END IF;
2501
2502 OPEN get_max_article_version_csr (inf_article_id_tbl(i));
2503 FETCH get_max_article_version_csr INTO l_article_version_id,
2504 l_article_version_number,
2505 l_article_status,
2506 l_start_date;
2507 l_row_notfound := get_max_article_version_csr%NOTFOUND;
2508 CLOSE get_max_article_version_csr;
2509
2510 IF l_row_notfound THEN
2511 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2512 p_msg_name => 'OKC_ART_ARTICLE_NOT_FOUND',
2513 p_token1 => 'ARTICLE_TITLE',
2514 p_token1_value => inf_article_title_tbl(i));
2515
2516 l_return_status := G_RET_STS_ERROR;
2517 RAISE FND_API.G_EXC_ERROR;
2518 ELSE
2519
2520 IF l_start_date IS NOT NULL
2521 THEN
2522 IF l_start_date > inf_end_date_tbl(i) THEN
2523 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2524 p_msg_name => 'OKC_INVALID_END_DATE');
2525 l_return_status := G_RET_STS_ERROR;
2526 RAISE FND_API.G_EXC_ERROR;
2527 END IF;
2528 END IF;
2529 END IF;
2530
2531 -- set the version number
2532 inf_article_version_number_tbl(i) := l_article_version_number;
2533 -- set article version id
2534 inf_article_version_id_tbl(i) := l_article_version_id;
2535
2536 ELSE
2537
2538 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2539 p_msg_name => 'OKC_ART_INV_IMP_ACTION');
2540 l_return_status := G_RET_STS_ERROR;
2541 RAISE FND_API.G_EXC_ERROR ;
2542 END IF;
2543
2544 -----------------------------------------------------------
2545 -- Common validation or attribute settting
2546 -- regardless of status and import action
2547 -- this validation is not included in validate api
2548 -----------------------------------------------------------
2549
2550 -- Do not import article if status or org_id or global_flag is not provided
2551 IF inf_article_status_tbl(i) IS NULL OR
2552 inf_org_id_tbl(i) IS NULL OR
2553 inf_global_yn_tbl(i) IS NULL THEN
2554 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2555 p_msg_name => 'OKC_ART_ATTRS_NOT_PROVIDED');
2556 l_return_status := G_RET_STS_ERROR;
2557 END IF;
2558
2559 -- Do not import 'PENDING_APPROVAL' article if approver is not set
2560 IF nvl(inf_article_status_tbl(i), '*') = 'PENDING_APPROVAL' THEN
2561 l_exist_approver := OKC_ARTWF_PVT.pre_submit_validation(G_CURRENT_ORG_ID);
2562 IF l_exist_approver = 'NOK' THEN
2563 l_return_status := G_RET_STS_ERROR;
2564 END IF;
2565 END IF;
2566
2567 -- Do not import article if orig_system_reference_code begins with 'OKCMIG'
2568 IF instr(nvl(inf_art_reference_code_tbl(i), '*'), 'OKCMIG') = 1 THEN
2569 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2570 p_msg_name => 'OKC_ART_IMP_RES_SYS_REF_CODE');
2571 l_return_status := G_RET_STS_ERROR;
2572 END IF;
2573
2574 IF instr(nvl(inf_ver_reference_code_tbl(i), '*'), 'OKCMIG') = 1 THEN
2575 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2576 p_msg_name => 'OKC_ART_IMP_RES_SYS_REF_CODE');
2577 l_return_status := G_RET_STS_ERROR;
2578 END IF;
2579
2580
2581 --for non 'APPROVED' article, make DATE_APPROVED null
2582 IF nvl(inf_article_status_tbl(i),'*') <> 'APPROVED' THEN
2583 inf_date_approved_tbl(i) := NULL;
2584 END IF;
2585
2586 --if article status is in 'APPROVED' and date_approved is null
2587 --then set date approved as sysdate
2588 --otherwise, the validate api will complain
2589 IF nvl(inf_article_status_tbl(i), '*') in ('APPROVED') AND
2590 inf_date_approved_tbl(i) is NULL THEN
2591 inf_date_approved_tbl(i) := sysdate;
2592 END IF;
2593
2594 --Bug 3680486: no provision for sell intent clause
2595 IF nvl(inf_article_intent_tbl(i), '*') = 'S'
2596 AND nvl(inf_provision_yn_tbl(i), '*') = 'Y' THEN
2597 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2598 p_msg_name => 'OKC_ART_INVALID_PROVISIONYN');
2599 l_return_status := G_RET_STS_ERROR;
2600 END IF;
2601
2602 -- Validate attrs of the interface row
2603 IF inf_action_tbl(i) = 'N' THEN
2604 api_return_status :=
2605 OKC_ARTICLES_ALL_PVT.VALIDATE_RECORD(
2606 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
2607 p_import_action => inf_action_tbl(i),
2608 p_article_id => inf_article_id_tbl(i),
2609 p_article_title => inf_article_title_tbl(i),
2610 p_org_id => G_CURRENT_ORG_ID,
2611 p_article_number => inf_article_number_tbl(i),
2612 p_standard_yn => 'Y',
2613 p_article_intent => inf_article_intent_tbl(i),
2614 p_article_language => inf_article_language_tbl(i),
2615 p_article_type => inf_article_type_tbl(i),
2616 p_orig_system_reference_code => inf_art_reference_code_tbl(i),
2617 p_orig_system_reference_id1 => inf_art_reference_id1_tbl(i),
2618 p_orig_system_reference_id2 => inf_art_reference_id2_tbl(i),
2619 p_attribute_category => NULL ,
2620 p_attribute1 => NULL ,
2621 p_attribute2 => NULL ,
2622 p_attribute3 => NULL ,
2623 p_attribute4 => NULL ,
2624 p_attribute5 => NULL ,
2625 p_attribute6 => NULL ,
2626 p_attribute7 => NULL ,
2627 p_attribute8 => NULL ,
2628 p_attribute9 => NULL ,
2629 p_attribute10 => NULL ,
2630 p_attribute11 => NULL ,
2631 p_attribute12 => NULL ,
2632 p_attribute13 => NULL ,
2633 p_attribute14 => NULL ,
2634 p_attribute15 => NULL
2635 );
2636 --
2637 -- If error is Unexpected then raise exception
2638 -- Otherwise, keep going
2639 --
2640 IF (api_return_status = G_RET_STS_UNEXP_ERROR) THEN
2641 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2642 ELSIF (api_return_status = G_RET_STS_ERROR) THEN
2643 l_return_status := G_RET_STS_ERROR;
2644 END IF;
2645 api_return_status :=
2646 OKC_ARTICLE_VERSIONS_PVT.validate_record(
2647 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
2648 p_import_action => inf_action_tbl(i),
2649 x_earlier_adoption_type => l_earlier_adoption_type,
2650 x_earlier_version_id => l_earlier_version_id,
2651 x_earlier_version_number => l_earlier_version_number,
2652 x_article_language => l_article_language,
2653 p_article_version_id => inf_article_version_id_tbl(i),
2654 p_article_id => inf_article_id_tbl(i),
2655 p_article_version_number => inf_article_version_number_tbl(i),
2656 p_article_text => inf_article_text_tbl(i),
2657 p_provision_yn => inf_provision_yn_tbl(i),
2658 p_insert_by_reference => inf_insert_by_reference_tbl(i),
2659 p_lock_text => inf_lock_text_tbl(i),
2660 p_global_yn => inf_global_yn_tbl(i),
2661 p_article_language => inf_article_language_tbl(i),
2662 p_article_status => l_tmp_article_status,
2663 p_sav_release => NULL,
2664 p_start_date => inf_start_date_tbl(i),
2665 p_end_date => inf_end_date_tbl(i),
2666 p_std_article_version_id => NULL,
2667 p_display_name => inf_display_name_tbl(i),
2668 p_translated_yn => NULL,
2669 p_article_description => inf_article_description_tbl(i),
2670 p_date_approved => inf_date_approved_tbl(i),
2671 p_default_section => inf_default_section_tbl(i),
2672 p_reference_source => inf_reference_source_tbl(i),
2673 p_reference_text => inf_reference_text_tbl(i),
2674 p_orig_system_reference_code => inf_art_reference_code_tbl(i),
2675 p_orig_system_reference_id1 => inf_art_reference_id1_tbl(i),
2676 p_orig_system_reference_id2 => inf_art_reference_id2_tbl(i),
2677 p_program_id => NULL,
2678 p_program_application_id => NULL,
2679 p_request_id => NULL,
2680 p_current_org_id => G_CURRENT_ORG_ID,
2681 p_additional_instructions => inf_instructions_tbl(i),
2682 p_variation_description => NULL,
2683 p_date_published => inf_date_published_tbl(i) ,
2684 p_attribute_category => inf_attribute_category_tbl(i) ,
2685 p_attribute1 => inf_attribute1_tbl(i) ,
2686 p_attribute2 => inf_attribute2_tbl(i) ,
2687 p_attribute3 => inf_attribute3_tbl(i) ,
2688 p_attribute4 => inf_attribute4_tbl(i) ,
2689 p_attribute5 => inf_attribute5_tbl(i) ,
2690 p_attribute6 => inf_attribute6_tbl(i) ,
2691 p_attribute7 => inf_attribute7_tbl(i) ,
2692 p_attribute8 => inf_attribute8_tbl(i) ,
2693 p_attribute9 => inf_attribute9_tbl(i) ,
2694 p_attribute10 => inf_attribute10_tbl(i) ,
2695 p_attribute11 => inf_attribute11_tbl(i) ,
2696 p_attribute12 => inf_attribute12_tbl(i) ,
2697 p_attribute13 => inf_attribute13_tbl(i) ,
2698 p_attribute14 => inf_attribute14_tbl(i) ,
2699 p_attribute15 => inf_attribute15_tbl(i)
2700 );
2701
2702 IF (api_return_status = G_RET_STS_UNEXP_ERROR) THEN
2703 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2704 ELSIF (api_return_status = G_RET_STS_ERROR) THEN
2705 l_return_status := G_RET_STS_ERROR;
2706 END IF;
2707
2708 ELSIF inf_action_tbl(i) in ('U','V') THEN
2709 --validating only article type because only article type is updated
2710 l_row_notfound := FALSE;
2711 OPEN validate_article_type_csr (inf_article_type_tbl(i),
2712 inf_article_id_tbl(i),
2713 inf_action_tbl(i));
2714 FETCH validate_article_type_csr INTO inf_article_type_tbl(i);
2715 l_row_notfound := validate_article_type_csr%NOTFOUND;
2716 CLOSE validate_article_type_csr;
2717
2718 IF l_row_notfound THEN
2719 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2720 p_msg_name => 'OKC_ART_INVALID_ARTICLE_TYPE',
2721 p_token1 => 'ARTICLE_TITLE',
2722 p_token1_value => inf_article_title_tbl(i));
2723 l_return_status := G_RET_STS_ERROR;
2724
2725 END IF;
2726
2727 -- nvl for nullable column to avoid getting database value
2728 -- in the validate API
2729 api_return_status :=
2730 OKC_ARTICLE_VERSIONS_PVT.validate_record(
2731 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
2732 p_import_action => inf_action_tbl(i),
2733 x_earlier_adoption_type => l_earlier_adoption_type,
2734 x_earlier_version_id => l_earlier_version_id,
2735 x_earlier_version_number => l_earlier_version_number,
2736 x_article_language => l_article_language,
2737 p_article_version_id => inf_article_version_id_tbl(i),
2738 p_article_id => inf_article_id_tbl(i),
2739 p_article_version_number => inf_article_version_number_tbl(i),
2740 p_article_text => inf_article_text_tbl(i),
2741 p_provision_yn => inf_provision_yn_tbl(i),
2742 p_insert_by_reference => inf_insert_by_reference_tbl(i),
2743 p_lock_text => inf_lock_text_tbl(i),
2744 p_global_yn => inf_global_yn_tbl(i),
2745 p_article_language => inf_article_language_tbl(i),
2746 p_article_status => l_tmp_article_status,
2747 p_sav_release => NULL,
2748 p_start_date => inf_start_date_tbl(i),
2749 p_end_date => inf_end_date_tbl(i),
2750 p_std_article_version_id => NULL,
2751 p_display_name => inf_display_name_tbl(i),
2752 p_translated_yn => NULL,
2753 p_article_description => inf_article_description_tbl(i),
2754 p_date_approved => inf_date_approved_tbl(i),
2755 p_default_section => inf_default_section_tbl(i),
2756 p_reference_source => inf_reference_source_tbl(i),
2757 p_reference_text => inf_reference_text_tbl(i),
2758 p_orig_system_reference_code => inf_art_reference_code_tbl(i),
2759 p_orig_system_reference_id1 => inf_art_reference_id1_tbl(i),
2760 p_orig_system_reference_id2 => inf_art_reference_id2_tbl(i),
2761 p_program_id => NULL,
2762 p_program_application_id => NULL,
2763 p_request_id => NULL,
2764 p_current_org_id => G_CURRENT_ORG_ID,
2765 p_additional_instructions => inf_instructions_tbl(i),
2766 p_variation_description => NULL,
2767 p_date_published => inf_date_published_tbl(i) ,
2768 p_attribute_category => inf_attribute_category_tbl(i) ,
2769 p_attribute1 => inf_attribute1_tbl(i) ,
2770 p_attribute2 => inf_attribute2_tbl(i) ,
2771 p_attribute3 => inf_attribute3_tbl(i) ,
2772 p_attribute4 => inf_attribute4_tbl(i) ,
2773 p_attribute5 => inf_attribute5_tbl(i) ,
2774 p_attribute6 => inf_attribute6_tbl(i) ,
2775 p_attribute7 => inf_attribute7_tbl(i) ,
2776 p_attribute8 => inf_attribute8_tbl(i) ,
2777 p_attribute9 => inf_attribute9_tbl(i) ,
2778 p_attribute10 => inf_attribute10_tbl(i) ,
2779 p_attribute11 => inf_attribute11_tbl(i) ,
2780 p_attribute12 => inf_attribute12_tbl(i) ,
2781 p_attribute13 => inf_attribute13_tbl(i) ,
2782 p_attribute14 => inf_attribute14_tbl(i) ,
2783 p_attribute15 => inf_attribute15_tbl(i)
2784 );
2785 END IF;
2786
2787
2788 --
2789 --
2790 -- If error is Unexpected then raise exception
2791 -- Otherwise, keep going
2792 --
2793 --
2794 IF (api_return_status = G_RET_STS_UNEXP_ERROR) THEN
2795 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2796 ELSIF (api_return_status = G_RET_STS_ERROR) THEN
2797 l_return_status := G_RET_STS_ERROR;
2798 END IF;
2799
2800 -- Continue with the rest of validation unless some unexpected error is encountered.
2801 -- It is always a good idea to show all errors at one shot.
2802 -- Parse through the article text and build the list of variables to be used.
2803 -- For validate only mode = N change the user friendly variable tags with valid XML and variable codes.
2804
2805 IF p_validate_only = 'N' THEN
2806 l_replace_text := 'Y';
2807 ELSE
2808 l_replace_text := 'N';
2809 END IF;
2810
2811 --
2812 -- Copying the clob in interface into temporary clob
2813 --
2814 --
2815
2816 DBMS_LOB.TRIM(g_temp_clob_tbl(i), 0);
2817
2818 OKC_ARTICLES_GRP.parse_n_replace_text(
2819 p_api_version => l_api_version,
2820 p_init_msg_list => l_init_msg_list,
2821 p_article_text => inf_article_text_tbl(i),
2822 p_dest_clob => g_temp_clob_tbl(i),
2823 p_calling_mode => 'IMPORT',
2824 p_batch_number => p_batch_number, -- Bug 4659659
2825 p_replace_text => l_replace_text,
2826 p_article_intent => inf_article_intent_tbl(i),
2827 p_language => inf_article_language_tbl(i),
2828 x_return_status => api_return_status,
2829 x_msg_count => x_msg_count,
2830 x_msg_data => x_msg_data,
2831 x_variables_tbl => l_variable_code_tbl
2832 ) ;
2833
2834 -- Add value_set check for 'PENDING_APPROVAL' and 'APPROVED' clause
2835 IF (inf_article_status_tbl(i) in ('PENDING_APPROVAL','APPROVED')) THEN
2836 IF l_variable_code_tbl.COUNT > 0 THEN
2837 k:=0;
2838 FOR k in l_variable_code_tbl.FIRST ..l_variable_code_tbl.LAST LOOP
2839 OPEN l_check_valid_valueset_csr (l_variable_code_tbl(k));
2840 FETCH l_check_valid_valueset_csr INTO l_value_set_id,
2841 l_variable_type;
2842 CLOSE l_check_valid_valueset_csr;
2843
2844 IF l_value_set_id is NULL AND l_variable_type = 'U' THEN
2845 OPEN l_var_name_csr (l_variable_code_tbl(k),
2846 inf_article_language_tbl(i));
2847 FETCH l_var_name_csr INTO l_variable_name;
2848 CLOSE l_var_name_csr;
2849 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2850 p_msg_name => 'OKC_ART_INV_VALUESET',
2851 p_token1 => 'VARIABLE_NAME',
2852 p_token1_value => l_variable_name,
2853 p_token2 => 'ARTICLE_TITLE',
2854 p_token2_value => inf_article_title_tbl(i),
2855 p_token3 => 'ARTICLE_VERSION',
2856 p_token3_value => inf_article_version_number_tbl(i));
2857 api_return_status := G_RET_STS_ERROR;
2858 END IF;
2859 END LOOP;
2860 END IF;
2861 END IF;
2862
2863 IF (api_return_status = G_RET_STS_UNEXP_ERROR) THEN
2864 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2865 ELSIF (api_return_status = G_RET_STS_ERROR) THEN
2866 RAISE FND_API.G_EXC_ERROR ;
2867 ELSIF (l_return_status = G_RET_STS_ERROR) THEN
2868 RAISE FND_API.G_EXC_ERROR ;
2869 END IF;
2870
2871 ------------------------------------------------------------------------
2872 -- Now that we have validated and data is clean we can fetch sequences and ids
2873 -- for new articles for DML and also set the process status to Success
2874 -------------------------------------------------------------------------
2875 IF p_validate_only = 'N' THEN
2876 l_context:='PREPARING DML FOR CLAUSE';
2877
2878 IF inf_action_tbl(i) = 'N' THEN
2879 -- Generate article number based on autonumbering
2880
2881 -- When article number is not given, then we get number from autonumber API
2882 IF nvl(inf_article_number_tbl(i),'-99') = '-99' THEN
2883 OKC_ARTICLES_GRP.GET_ARTICLE_SEQ_NUMBER
2884 (p_article_number =>inf_article_number_tbl(i),
2885 p_seq_type_info_only => 'N',
2886 p_org_id => G_CURRENT_ORG_ID,
2887 x_article_number => l_article_number,
2888 x_doc_sequence_type => l_doc_sequence_type,
2889 x_return_status => api_return_status
2890 ) ;
2891
2892 IF api_return_status = G_RET_STS_SUCCESS Then
2893 inf_article_number_tbl(i) := l_article_number;
2894 ELSIF (api_return_status = G_RET_STS_UNEXP_ERROR) THEN
2895 l_return_status := api_return_status;
2896 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2897 ELSE
2898 l_return_status := api_return_status; -- whatever error, it will overwrite it
2899 END IF;
2900 END IF;
2901
2902 -- Get article id.
2903 api_return_status := Get_Seq_Id (p_object_type => 'ART',
2904 x_object_id => inf_article_id_tbl(i));
2905 IF (api_return_status = G_RET_STS_UNEXP_ERROR) THEN
2906 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2907 ELSIF (api_return_status = G_RET_STS_ERROR) THEN
2908 l_return_status := api_return_status;
2909 RAISE FND_API.G_EXC_ERROR ;
2910 END IF;
2911
2912 api_return_status := Get_Seq_Id (p_object_type => 'VER',
2913 x_object_id => inf_article_version_id_tbl(i));
2914 IF (api_return_status = G_RET_STS_UNEXP_ERROR) THEN
2915 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2916 ELSIF (api_return_status = G_RET_STS_ERROR) THEN
2917 l_return_status := api_return_status;
2918 RAISE FND_API.G_EXC_ERROR ;
2919 END IF;
2920
2921 -- Create variable association for the new article - 1st version.
2922 IF l_variable_code_tbl.COUNT > 0 THEN
2923 FOR k in l_variable_code_tbl.FIRST ..l_variable_code_tbl.LAST LOOP
2924 artv_variable_code_tbl(j) := l_variable_code_tbl(k);
2925 artv_article_version_id_tbl(j) := inf_article_version_id_tbl(i);
2926 artv_action_tbl(j) := 'N';
2927 j := j+1;
2928 END LOOP;
2929
2930 END IF;
2931
2932
2933 ELSIF inf_action_tbl(i) = 'V' THEN -- new version
2934
2935 -- if status is APPROVED then save id of prev. version
2936 -- to set end date of previous version
2937 IF inf_article_status_tbl(i) = 'APPROVED' THEN
2938 inf_earlier_version_id_tbl(i) := l_earlier_version_id;
2939 END IF;
2940
2941 -- Get article version id.
2942
2943 api_return_status := Get_Seq_Id (p_object_type => 'VER',
2944 x_object_id => inf_article_version_id_tbl(i));
2945 IF (api_return_status = G_RET_STS_UNEXP_ERROR) THEN
2946 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2947 ELSIF (api_return_status = G_RET_STS_ERROR) THEN
2948 l_return_status := api_return_status;
2949 RAISE FND_API.G_EXC_ERROR ;
2950 END IF;
2951
2952 -- Create variable association for the new version.
2953 IF l_variable_code_tbl.COUNT > 0 THEN
2954
2955 FOR k in l_variable_code_tbl.FIRST ..l_variable_code_tbl.LAST LOOP
2956 artv_variable_code_tbl(j) := l_variable_code_tbl(k);
2957 artv_article_version_id_tbl(j) := inf_article_version_id_tbl(i);
2958 artv_action_tbl(j) := 'N';
2959 j := j+1;
2960 END LOOP;
2961 END IF;
2962
2963 -- Set adoption type with earlier adoption type
2964 inf_adoption_type_tbl(i) := l_earlier_adoption_type;
2965
2966
2967 ELSIF inf_action_tbl(i) = 'U' THEN
2968
2969 -- Find out the variables that need to be added as these are new
2970 -- or those that need to be deleted as they are no longer used.
2971
2972 OKC_ARTICLES_GRP.UPDATE_ARTICLE_VARIABLES (
2973 p_article_version_id => inf_article_version_id_tbl(i),
2974 p_variable_code_tbl => l_variable_code_tbl,
2975 p_do_dml => 'N', -- indicates not to do dml in the API
2976 x_variables_to_insert_tbl => l_variables_to_insert_tbl,
2977 x_variables_to_delete_tbl => l_variables_to_delete_tbl,
2978 x_return_status => api_return_status);
2979 IF (api_return_status = G_RET_STS_UNEXP_ERROR) THEN
2980 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2981 ELSIF (api_return_status = G_RET_STS_ERROR) THEN
2982 RAISE FND_API.G_EXC_ERROR ;
2983 END IF;
2984
2985 -- New Variables
2986 IF l_variables_to_insert_tbl.COUNT > 0 THEN
2987
2988 FOR k in l_variables_to_insert_tbl.FIRST ..l_variables_to_insert_tbl.LAST LOOP
2989 artv_variable_code_tbl(j) := l_variables_to_insert_tbl(k);
2990 artv_article_version_id_tbl(j) := inf_article_version_id_tbl(i);
2991 artv_action_tbl(j) := 'N';
2992 j := j+1;
2993 END LOOP;
2994 END IF;
2995 -- Variables no longer used.
2996 IF l_variables_to_delete_tbl.COUNT > 0 THEN
2997 FOR k in l_variables_to_delete_tbl.FIRST ..l_variables_to_delete_tbl.LAST LOOP
2998 artv_variable_code_tbl(j) := l_variables_to_delete_tbl(k);
2999 artv_article_version_id_tbl(j) := inf_article_version_id_tbl(i);
3000 artv_action_tbl(j) := 'D';
3001 j := j+1;
3002 END LOOP;
3003 END IF;
3004
3005 END IF; -- end of IF inf_action_tbl(i) = 'N'
3006
3007 --Delete variables cache tables for next interface row
3008 l_variables_to_insert_tbl.DELETE;
3009 l_variables_to_delete_tbl.DELETE;
3010 l_variable_code_tbl.DELETE;
3011
3012 END IF; -- validate_only = 'N'
3013
3014 -- Summarize report for this row
3015 -- Status 'F' is for internal use meaning parsing failure marked in
3016 -- java concurrent program
3017 IF (l_return_status = G_RET_STS_SUCCESS) THEN
3018 IF (nvl(inf_process_status_tbl(i), 'E') = 'E') THEN
3019 inf_process_status_tbl(i) := G_RET_STS_SUCCESS;
3020 ELSIF ( inf_process_status_tbl(i) = 'F') THEN
3021 -- ##count parser failure as error
3022 --l_tot_rows_failed := l_tot_rows_failed+1;
3023 l_part_rows_failed := l_part_rows_failed+1;
3024 inf_process_status_tbl(i) := G_RET_STS_ERROR;
3025 END IF;
3026 ELSIF (l_return_status = l_sts_warning) THEN
3027 IF (nvl(inf_process_status_tbl(i),'E') = 'E') THEN
3028 inf_process_status_tbl(i) := l_sts_warning;
3029 --##count
3030 --l_tot_rows_warned := l_tot_rows_warned+1;
3031 l_part_rows_warned := l_part_rows_warned+1;
3032 ELSIF (inf_process_status_tbl(i) = 'F') THEN
3033 -- ##count parser failure as error
3034 --l_tot_rows_failed := l_tot_rows_failed+1;
3035 l_part_rows_failed := l_part_rows_failed+1;
3036 inf_process_status_tbl(i) := G_RET_STS_ERROR;
3037 END IF;
3038 ELSIF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
3039 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3040 ELSIF (l_return_status = G_RET_STS_ERROR) THEN
3041 RAISE FND_API.G_EXC_ERROR;
3042 END IF;
3043
3044 -------------------------
3045 -------------------------
3046 -- Exception Block for each iteration in Loop
3047 -- validation and unexpected errors
3048 -- In case of unexpected error, escape the loop
3049 -------------------------
3050 -------------------------
3051
3052 EXCEPTION
3053 WHEN FND_API.G_EXC_ERROR THEN
3054 IF (l_debug = 'Y') THEN
3055 okc_debug.log('300: In Articles_Import: OKC_API.G_EXCEPTION_ERROR Exception', 2);
3056 END IF;
3057 --l_return_status := G_RET_STS_ERROR ;
3058 build_error_array(
3059 p_msg_data => x_msg_data,
3060 p_context => l_context,
3061 p_batch_process_id => l_batch_process_id,
3062 p_interface_id => inf_interface_id_tbl(i),
3063 p_article_title => inf_article_title_tbl(i),
3064 p_error_type => G_RET_STS_ERROR,
3065 p_entity => 'CLAUSE'
3066 );
3067 inf_process_status_tbl(i) := G_RET_STS_ERROR;
3068 --##count
3069 --l_tot_rows_failed := l_tot_rows_failed+1;
3070 l_part_rows_failed := l_part_rows_failed+1;
3071 -- Continue to next row
3072
3073 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3074 IF (l_debug = 'Y') THEN
3075 okc_debug.log('400: Leaving Articles_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
3076 END IF;
3077
3078 --
3079 -- Freeing temporary clobs
3080 --
3081 j := g_temp_clob_tbl.FIRST;
3082 LOOP
3083 DBMS_LOB.FREETEMPORARY(g_temp_clob_tbl(j));
3084 EXIT WHEN (j = g_temp_clob_tbl.LAST);
3085 j := g_temp_clob_tbl.NEXT(j);
3086 END LOOP;
3087 g_temp_clob_tbl.DELETE;
3088 --
3089 -- Freeing temporary clobs
3090 --
3091
3092 IF l_interface_csr%ISOPEN THEN
3093 CLOSE l_interface_csr;
3094 END IF;
3095
3096 IF get_max_article_version_csr%ISOPEN THEN
3097 CLOSE get_max_article_version_csr;
3098 END IF;
3099
3100 IF get_article_info_csr%ISOPEN THEN
3101 CLOSE get_article_info_csr;
3102 END IF;
3103
3104 IF validate_article_type_csr%ISOPEN THEN
3105 CLOSE validate_article_type_csr;
3106 END IF;
3107 --Set_Message
3108 l_return_status := G_RET_STS_UNEXP_ERROR ;
3109 x_return_status := G_RET_STS_UNEXP_ERROR ;
3110
3111 build_error_array(
3112 p_msg_data => x_msg_data,
3113 p_context => l_context,
3114 p_batch_process_id => l_batch_process_id,
3115 p_interface_id => inf_interface_id_tbl(i),
3116 p_article_title => inf_article_title_tbl(i),
3117 p_error_type => G_RET_STS_UNEXP_ERROR,
3118 p_entity => 'CLAUSE'
3119 );
3120 inf_process_status_tbl(i) := G_RET_STS_ERROR;
3121 --##count
3122 --l_tot_rows_failed := l_tot_rows_failed+1;
3123 l_part_rows_failed := l_part_rows_failed+1;
3124 exit; -- exit the current fetch
3125
3126 WHEN OTHERS THEN
3127 IF (l_debug = 'Y') THEN
3128 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION: '||sqlerrm, 2);
3129 END IF;
3130
3131
3132 --
3133 -- Freeing temporary clobs
3134 --
3135 j := g_temp_clob_tbl.FIRST;
3136 LOOP
3137 DBMS_LOB.FREETEMPORARY(g_temp_clob_tbl(j));
3138 EXIT WHEN (j = g_temp_clob_tbl.LAST);
3139 j := g_temp_clob_tbl.NEXT(j);
3140 END LOOP;
3141 g_temp_clob_tbl.DELETE;
3142 --
3143 -- Freeing temporary clobs
3144 --
3145
3146 IF l_interface_csr%ISOPEN THEN
3147 CLOSE l_interface_csr;
3148 END IF;
3149
3150 IF get_max_article_version_csr%ISOPEN THEN
3151 CLOSE get_max_article_version_csr;
3152 END IF;
3153
3154 IF get_article_info_csr%ISOPEN THEN
3155 CLOSE get_article_info_csr;
3156 END IF;
3157
3158 IF validate_article_type_csr%ISOPEN THEN
3159 CLOSE validate_article_type_csr;
3160 END IF;
3161 l_return_status := G_RET_STS_UNEXP_ERROR ;
3162 x_return_status := G_RET_STS_UNEXP_ERROR ;
3163
3164 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
3165 p_msg_name => G_UNEXPECTED_ERROR,
3166 p_token1 => G_SQLCODE_TOKEN,
3167 p_token1_value => sqlcode,
3168 p_token2 => G_SQLERRM_TOKEN,
3169 p_token2_value => sqlerrm);
3170
3171 build_error_array(
3172 p_msg_data => G_UNEXPECTED_ERROR,
3173 p_context => l_context,
3174 p_batch_process_id => l_batch_process_id,
3175 p_interface_id => inf_interface_id_tbl(i),
3176 p_article_title => inf_article_title_tbl(i),
3177 p_error_type => G_RET_STS_ERROR,
3178 p_entity => 'CLAUSE'
3179 );
3180 inf_process_status_tbl(i) := G_RET_STS_ERROR;
3181 --##count
3182 --l_tot_rows_failed := l_tot_rows_failed+1;
3183 l_part_rows_failed := l_part_rows_failed+1;
3184 exit; -- exit the current fetch
3185 END;
3186 -------------------------
3187 -------------------------
3188 -- Exception Block for each iteration in Loop ends
3189 -------------------------
3190 -------------------------
3191
3192
3193 END LOOP; -- end of FOR i in inf_interface_id_tbl.FIRST ..
3194 ------------------------------------------------------------------------
3195 -------------- End of Inner Loop thru fetched row for---------------------
3196 -- validation, parse and validate article text, create a variable list
3197 -- prepare rows for DML if validate_only is 'N'
3198 -------------------------------------------------------------------------
3199 -- In order to propagate Unexpected error raise it if it is 'U'
3200 IF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
3201 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3202 END IF;
3203
3204 -------------------------
3205 -------------------------
3206 -- Exception Block for Inner Loop starts
3207 -- Handles unexpected errors as last step
3208 -------------------------
3209 -------------------------
3210 EXCEPTION
3211 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3212 IF (l_debug = 'Y') THEN
3213 okc_debug.log('400: Leaving Articles_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
3214 END IF;
3215 --
3216 -- Freeing temporary clobs
3217 --
3218 j := g_temp_clob_tbl.FIRST;
3219 LOOP
3220 DBMS_LOB.FREETEMPORARY(g_temp_clob_tbl(j));
3221 EXIT WHEN (j = g_temp_clob_tbl.LAST);
3222 j := g_temp_clob_tbl.NEXT(j);
3223 END LOOP;
3224 g_temp_clob_tbl.DELETE;
3225 --
3226 -- Freeing temporary clobs
3227 --
3228
3229 IF l_interface_csr%ISOPEN THEN
3230 CLOSE l_interface_csr;
3231 END IF;
3232 IF get_max_article_version_csr%ISOPEN THEN
3233 CLOSE get_max_article_version_csr;
3234 END IF;
3235 IF get_article_info_csr%ISOPEN THEN
3236 CLOSE get_article_info_csr;
3237 END IF;
3238 IF validate_article_type_csr%ISOPEN THEN
3239 CLOSE validate_article_type_csr;
3240 END IF;
3241 l_return_status := G_RET_STS_UNEXP_ERROR ;
3242 x_return_status := G_RET_STS_UNEXP_ERROR ;
3243 exit; -- exit outermost loop
3244
3245 WHEN OTHERS THEN
3246 IF (l_debug = 'Y') THEN
3247 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION: '||sqlerrm, 2);
3248 END IF;
3249
3250 --
3251 -- Freeing temporary clobs
3252 --
3253 j := g_temp_clob_tbl.FIRST;
3254 LOOP
3255 DBMS_LOB.FREETEMPORARY(g_temp_clob_tbl(j));
3256 EXIT WHEN (j = g_temp_clob_tbl.LAST);
3257 j := g_temp_clob_tbl.NEXT(j);
3258 END LOOP;
3259 g_temp_clob_tbl.DELETE;
3260 --
3261 -- Freeing temporary clobs
3262 --
3263
3264 IF l_interface_csr%ISOPEN THEN
3265 CLOSE l_interface_csr;
3266 END IF;
3267 IF get_max_article_version_csr%ISOPEN THEN
3268 CLOSE get_max_article_version_csr;
3269 END IF;
3270 IF get_article_info_csr%ISOPEN THEN
3271 CLOSE get_article_info_csr;
3272 END IF;
3273 IF validate_article_type_csr%ISOPEN THEN
3274 CLOSE validate_article_type_csr;
3275 END IF;
3276 l_return_status := G_RET_STS_UNEXP_ERROR ;
3277 x_return_status := G_RET_STS_UNEXP_ERROR ;
3278 exit; -- exit outermost loop
3279 END;
3280
3281 -------------------------
3282 -------------------------
3283 -- Exception Block for Each Iteration of outermost Loop ends
3284 -------------------------
3285 -------------------------
3286
3287 ------------------------------------------------------------------------
3288 --------------------- Start Do_DML for Article Library ---------------
3289 -- Insert or Update Article, Article Version
3290 -- Insert variable association
3291 -------------------------------------------------------------------------
3292 -- initialize l_return_status to track status of DML execution
3293 l_return_status := G_RET_STS_SUCCESS;
3294
3295
3296 IF p_validate_only = 'N' THEN
3297 BEGIN
3298 SAVEPOINT bulkdml;
3299
3300 i := 0;
3301 -- Bulk insert New Valid Records
3302 BEGIN
3303 l_context := 'INSERTING NEW CLAUSE';
3304
3305 FORALL i in inf_interface_id_tbl.FIRST ..inf_interface_id_tbl.LAST
3306 INSERT INTO OKC_ARTICLES_ALL(
3307 ARTICLE_ID,
3308 ARTICLE_TITLE,
3309 ORG_ID,
3310 ARTICLE_NUMBER,
3311 STANDARD_YN,
3312 ARTICLE_INTENT,
3313 ARTICLE_LANGUAGE,
3314 ARTICLE_TYPE,
3315 ORIG_SYSTEM_REFERENCE_CODE,
3316 ORIG_SYSTEM_REFERENCE_ID1,
3317 ORIG_SYSTEM_REFERENCE_ID2,
3318 CZ_TRANSFER_STATUS_FLAG,
3319 PROGRAM_ID,
3320 PROGRAM_LOGIN_ID,
3321 PROGRAM_APPLICATION_ID,
3322 REQUEST_ID,
3323 OBJECT_VERSION_NUMBER,
3324 CREATED_BY,
3325 CREATION_DATE,
3326 LAST_UPDATED_BY,
3327 LAST_UPDATE_LOGIN,
3328 LAST_UPDATE_DATE)
3329 SELECT
3330 inf_article_id_tbl(i),
3331 inf_article_title_tbl(i),
3332 G_CURRENT_ORG_ID,
3333 inf_article_number_tbl(i),
3334 'Y',
3335 inf_article_intent_tbl(i),
3336 nvl(inf_article_language_tbl(i),l_userenv_lang),
3337 inf_article_type_tbl(i),
3338 inf_art_reference_code_tbl(i),
3339 inf_art_reference_id1_tbl(i),
3340 inf_art_reference_id2_tbl(i),
3341 'N',
3342 l_program_id,
3343 l_program_login_id,
3344 l_program_appl_id,
3345 l_request_id,
3346 1.0,
3347 l_user_id,
3348 sysdate,
3349 l_user_id,
3350 l_login_id,
3351 sysdate
3352 FROM DUAL
3353 WHERE inf_action_tbl(i) = 'N' and
3354 inf_process_status_tbl(i) in ('S', 'W') ;
3355
3356 -- Using a " select from dual" aproach as above prevents creation of
3357 -- additional PL/SQL tables for bulk insert of
3358 -- articles if we were to use a FORALL INSERT INTO .... VALUES .... approach.
3359 -- We cannot use FORALL INSERT INTO .... VALUES ....using
3360 -- the existing inf*tbl since the error rows need to be
3361 -- filtered out.
3362
3363 EXCEPTION
3364 WHEN OTHERS THEN
3365 IF (l_debug = 'Y') THEN
3366 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
3367 END IF;
3368 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3369 END;
3370
3371 --
3372 -- End of Insert into OKC_ARTICLES_ALL
3373 --
3374 --
3375
3376 i := 0;
3377 BEGIN
3378 l_context := 'INSERTING NEW VERSION OF CLAUSE';
3379
3380 FORALL i in inf_interface_id_tbl.FIRST ..inf_interface_id_tbl.LAST
3381 INSERT INTO OKC_ARTICLE_VERSIONS(
3382 ARTICLE_VERSION_ID,
3383 ARTICLE_ID,
3384 ARTICLE_VERSION_NUMBER,
3385 ARTICLE_TEXT,
3386 PROVISION_YN,
3387 INSERT_BY_REFERENCE,
3388 LOCK_TEXT,
3389 GLOBAL_YN,
3390 ARTICLE_LANGUAGE,
3391 ARTICLE_STATUS,
3392 SAV_RELEASE,
3393 START_DATE,
3394 END_DATE,
3395 STD_ARTICLE_VERSION_ID,
3396 DISPLAY_NAME,
3397 TRANSLATED_YN,
3398 ARTICLE_DESCRIPTION,
3399 DATE_APPROVED,
3400 DEFAULT_SECTION,
3401 REFERENCE_SOURCE,
3402 REFERENCE_TEXT,
3403 ORIG_SYSTEM_REFERENCE_CODE,
3404 ORIG_SYSTEM_REFERENCE_ID1,
3405 ORIG_SYSTEM_REFERENCE_ID2,
3406 ADDITIONAL_INSTRUCTIONS,
3407 VARIATION_DESCRIPTION,
3408 DATE_PUBLISHED,
3409 ADOPTION_TYPE,
3410 PROGRAM_ID,
3411 PROGRAM_LOGIN_ID,
3412 PROGRAM_APPLICATION_ID,
3413 REQUEST_ID,
3414 ATTRIBUTE_CATEGORY,
3415 ATTRIBUTE1,
3416 ATTRIBUTE2,
3417 ATTRIBUTE3,
3418 ATTRIBUTE4,
3419 ATTRIBUTE5,
3420 ATTRIBUTE6,
3421 ATTRIBUTE7,
3422 ATTRIBUTE8,
3423 ATTRIBUTE9,
3424 ATTRIBUTE10,
3425 ATTRIBUTE11,
3426 ATTRIBUTE12,
3427 ATTRIBUTE13,
3428 ATTRIBUTE14,
3429 ATTRIBUTE15,
3430 OBJECT_VERSION_NUMBER,
3431 CREATED_BY,
3432 CREATION_DATE,
3433 LAST_UPDATED_BY,
3434 LAST_UPDATE_LOGIN,
3435 LAST_UPDATE_DATE)
3436 SELECT
3437 inf_article_version_id_tbl(i),
3438 inf_article_id_tbl(i),
3439 inf_article_version_number_tbl(i),
3440 g_temp_clob_tbl(i),
3441 inf_provision_yn_tbl(i),
3442 inf_insert_by_reference_tbl(i),
3443 inf_lock_text_tbl(i),
3444 inf_global_yn_tbl(i),
3445 nvl(inf_article_language_tbl(i),l_userenv_lang),
3446 inf_article_status_tbl(i),
3447 NULL,
3448 trunc(inf_start_date_tbl(i)),
3449 trunc(inf_end_date_tbl(i)),
3450 NULL,
3451 inf_display_name_tbl(i),
3452 NULL,
3453 inf_article_description_tbl(i),
3454 inf_date_approved_tbl(i),
3455 inf_default_section_tbl(i),
3456 inf_reference_source_tbl(i),
3457 inf_reference_text_tbl(i),
3458 inf_ver_reference_code_tbl(i),
3459 inf_ver_reference_id1_tbl(i),
3460 inf_ver_reference_id2_tbl(i),
3461 inf_instructions_tbl(i),
3462 NULL,
3463 inf_date_published_tbl(i),
3464 inf_adoption_type_tbl(i),
3465 l_program_id,
3466 l_program_login_id,
3467 l_program_appl_id,
3468 l_request_id,
3469 inf_attribute_category_tbl(i),
3470 inf_attribute1_tbl(i),
3471 inf_attribute2_tbl(i),
3472 inf_attribute3_tbl(i),
3473 inf_attribute4_tbl(i),
3474 inf_attribute5_tbl(i),
3475 inf_attribute6_tbl(i),
3476 inf_attribute7_tbl(i),
3477 inf_attribute8_tbl(i),
3478 inf_attribute9_tbl(i),
3479 inf_attribute10_tbl(i),
3480 inf_attribute11_tbl(i),
3481 inf_attribute12_tbl(i),
3482 inf_attribute13_tbl(i),
3483 inf_attribute14_tbl(i),
3484 inf_attribute15_tbl(i),
3485 1.0,
3486 l_user_id,
3487 sysdate,
3488 l_user_id,
3489 l_login_id,
3490 sysdate
3491 FROM OKC_ARTICLES_ALL
3492 WHERE inf_action_tbl(i) IN ( 'N', 'V')
3493 AND inf_process_status_tbl(i) in ('S', 'W')
3494 AND article_id = inf_article_id_tbl(i);
3495
3496 EXCEPTION
3497 WHEN OTHERS THEN
3498 IF (l_debug = 'Y') THEN
3499 okc_debug.log('500: Leaving Article Import because of EXCEPTION: '||l_context||sqlerrm, 2);
3500 END IF;
3501 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3502 END;
3503
3504 --
3505 -- End of Insert into OKC_ARTICLE_VERSIONS
3506 --
3507 --
3508
3509 i := 0;
3510 BEGIN
3511 IF artv_variable_code_tbl.COUNT > 0 Then
3512 l_context := 'INSERT ASSOCIATION FOR VARIABLES';
3513
3514 i := 0;
3515
3516 FORALL i in artv_variable_code_tbl.FIRST .. artv_variable_code_tbl.LAST
3517 INSERT INTO OKC_ARTICLE_VARIABLES
3518 (
3519 ARTICLE_VERSION_ID ,
3520 VARIABLE_CODE ,
3521 OBJECT_VERSION_NUMBER ,
3522 CREATED_BY ,
3523 CREATION_DATE ,
3524 LAST_UPDATE_DATE ,
3525 LAST_UPDATED_BY ,
3526 LAST_UPDATE_LOGIN
3527 )
3528 SELECT
3529 artv_article_version_id_tbl(i),
3530 artv_variable_code_tbl(i),
3531 1.0,
3532 l_user_id,
3533 sysdate,
3534 sysdate,
3535 l_user_id,
3536 l_login_id
3537 FROM OKC_ARTICLE_VERSIONS
3538 WHERE artv_action_tbl(i) = 'N'
3539 AND article_version_id = artv_article_version_id_tbl(i);
3540
3541 END IF;
3542
3543 IF artv_variable_code_tbl.COUNT > 0 Then
3544 l_context := 'DELETE ASSOCIATION FOR VARIABLES';
3545 FORALL i in artv_variable_code_tbl.FIRST .. artv_variable_code_tbl.LAST
3546 DELETE FROM OKC_ARTICLE_VARIABLES
3547 WHERE VARIABLE_CODE = artv_variable_code_tbl(i)
3548 AND ARTICLE_VERSION_ID = artv_article_version_id_tbl(i)
3549 AND artv_action_tbl(i) = 'D';
3550 END IF;
3551 EXCEPTION
3552 WHEN OTHERS THEN
3553 IF (l_debug = 'Y') THEN
3554 okc_debug.log('500: Leaving Article Import because of EXCEPTION: '||l_context||sqlerrm, 2);
3555 END IF;
3556 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3557 END;
3558
3559 artv_article_version_id_tbl.DELETE;
3560 artv_variable_code_tbl.DELETE;
3561 artv_action_tbl.DELETE;
3562
3563 --
3564 -- End of OKC_ARTICLES_VARIABLES
3565 --
3566 --
3567
3568 i := 0;
3569 BEGIN
3570 l_context := 'SET END DATE IN PREV. VER';
3571
3572 FORALL i in inf_interface_id_tbl.FIRST ..inf_interface_id_tbl.LAST
3573 UPDATE OKC_ARTICLE_VERSIONS
3574 SET END_DATE = trunc(inf_start_date_tbl(i)-1),
3575 PROGRAM_ID = l_program_id,
3576 REQUEST_ID = l_request_id,
3577 PROGRAM_LOGIN_ID = l_program_login_id,
3578 PROGRAM_APPLICATION_ID = l_program_appl_id,
3579 OBJECT_VERSION_NUMBER = object_version_number + 1,
3580 LAST_UPDATED_BY = l_user_id,
3581 LAST_UPDATE_LOGIN = l_login_id,
3582 LAST_UPDATE_DATE = SYSDATE
3583 WHERE inf_action_tbl(i) = 'V'
3584 AND inf_process_status_tbl(i) in ('S','W')
3585 AND inf_earlier_version_id_tbl(i) <> -99
3586 AND article_version_id = inf_earlier_version_id_tbl(i);
3587 EXCEPTION
3588 WHEN OTHERS THEN
3589 IF (l_debug = 'Y') THEN
3590 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
3591 END IF;
3592 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3593 END;
3594 --
3595 -- End of Insert into OKC_ARTICLE_VERSIONS
3596 --
3597 --
3598
3599 i := 0;
3600 BEGIN
3601 l_context := 'UPDATING CLAUSE TYPE FOR ACTION V AND U';
3602
3603 FORALL i in inf_interface_id_tbl.FIRST ..inf_interface_id_tbl.LAST
3604 UPDATE OKC_ARTICLES_ALL
3605 SET ARTICLE_TYPE = inf_article_type_tbl(i),
3606 PROGRAM_ID = l_program_id,
3607 REQUEST_ID = l_request_id,
3608 PROGRAM_LOGIN_ID = l_program_login_id,
3609 PROGRAM_APPLICATION_ID = l_program_appl_id,
3610 OBJECT_VERSION_NUMBER = object_version_number + 1,
3611 LAST_UPDATED_BY = l_user_id,
3612 LAST_UPDATE_LOGIN = l_login_id,
3613 LAST_UPDATE_DATE = SYSDATE
3614 WHERE inf_action_tbl(i) in ('U', 'V')
3615 AND inf_process_status_tbl(i) in ('S','W')
3616 AND article_id = inf_article_id_tbl(i);
3617 EXCEPTION
3618 WHEN OTHERS THEN
3619 IF (l_debug = 'Y') THEN
3620 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
3621 END IF;
3622 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3623 END;
3624 ---
3625 ---
3626 ---
3627 i := 0;
3628 BEGIN
3629 l_context := 'UPDATING CLAUSE END DATE FOR ACTION D ';
3630
3631 FORALL i in inf_interface_id_tbl.FIRST ..inf_interface_id_tbl.LAST
3632 UPDATE OKC_ARTICLE_VERSIONS
3633 SET END_DATE = trunc(inf_end_date_tbl(i)),
3634 PROGRAM_ID = l_program_id,
3635 REQUEST_ID = l_request_id,
3636 PROGRAM_LOGIN_ID = l_program_login_id,
3637 PROGRAM_APPLICATION_ID = l_program_appl_id,
3638 OBJECT_VERSION_NUMBER = object_version_number + 1,
3639 LAST_UPDATED_BY = l_user_id,
3640 LAST_UPDATE_LOGIN = l_login_id,
3641 LAST_UPDATE_DATE = SYSDATE
3642 WHERE inf_action_tbl(i) in ('D')
3643 AND inf_process_status_tbl(i) in ('S','W')
3644 AND article_version_id = inf_article_version_id_tbl(i);
3645 EXCEPTION
3646 WHEN OTHERS THEN
3647 IF (l_debug = 'Y') THEN
3648 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
3649 END IF;
3650 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3651 END;
3652
3653 ---
3654 ---
3655 ---
3656 i := 0;
3657 BEGIN
3658 l_context := 'UPDATING CLAUSE VERSION';
3659
3660 FORALL i in inf_interface_id_tbl.FIRST ..inf_interface_id_tbl.LAST
3661 UPDATE OKC_ARTICLE_VERSIONS VO SET (
3662 ARTICLE_TEXT,
3663 PROVISION_YN,
3664 INSERT_BY_REFERENCE,
3665 LOCK_TEXT,
3666 GLOBAL_YN,
3667 ARTICLE_STATUS,
3668 START_DATE,
3669 END_DATE,
3670 DISPLAY_NAME,
3671 ARTICLE_DESCRIPTION,
3672 DEFAULT_SECTION,
3673 REFERENCE_SOURCE,
3674 REFERENCE_TEXT,
3675 ORIG_SYSTEM_REFERENCE_CODE,
3676 ORIG_SYSTEM_REFERENCE_ID1,
3677 ORIG_SYSTEM_REFERENCE_ID2,
3678 ADDITIONAL_INSTRUCTIONS,
3679 DATE_PUBLISHED,
3680 PROGRAM_ID,
3681 PROGRAM_LOGIN_ID,
3682 PROGRAM_APPLICATION_ID,
3683 REQUEST_ID,
3684 ATTRIBUTE_CATEGORY,
3685 ATTRIBUTE1,
3686 ATTRIBUTE2,
3687 ATTRIBUTE3,
3688 ATTRIBUTE4,
3689 ATTRIBUTE5,
3690 ATTRIBUTE6,
3691 ATTRIBUTE7,
3692 ATTRIBUTE8,
3693 ATTRIBUTE9,
3694 ATTRIBUTE10,
3695 ATTRIBUTE11,
3696 ATTRIBUTE12,
3697 ATTRIBUTE13,
3698 ATTRIBUTE14,
3699 ATTRIBUTE15,
3700 OBJECT_VERSION_NUMBER,
3701 LAST_UPDATED_BY,
3702 LAST_UPDATE_LOGIN,
3703 LAST_UPDATE_DATE) = (
3704 SELECT
3705 g_temp_clob_tbl(i),
3706 inf_provision_yn_tbl(i),
3707 inf_insert_by_reference_tbl(i),
3708 inf_lock_text_tbl(i),
3709 inf_global_yn_tbl(i),
3710 inf_article_status_tbl(i),
3711 trunc(inf_start_date_tbl(i)),
3712 trunc(inf_end_date_tbl(i)),
3713 inf_display_name_tbl(i),
3714 inf_article_description_tbl(i),
3715 inf_default_section_tbl(i),
3716 inf_reference_source_tbl(i),
3717 inf_reference_text_tbl(i),
3718 inf_ver_reference_code_tbl(i),
3719 inf_ver_reference_id1_tbl(i),
3720 inf_ver_reference_id2_tbl(i),
3721 inf_instructions_tbl(i),
3722 inf_date_published_tbl(i),
3723 l_program_id,
3724 l_program_login_id,
3725 l_program_appl_id,
3726 l_request_id,
3727 inf_attribute_category_tbl(i),
3728 inf_attribute1_tbl(i),
3729 inf_attribute2_tbl(i),
3730 inf_attribute3_tbl(i),
3731 inf_attribute4_tbl(i),
3732 inf_attribute5_tbl(i),
3733 inf_attribute6_tbl(i),
3734 inf_attribute7_tbl(i),
3735 inf_attribute8_tbl(i),
3736 inf_attribute9_tbl(i),
3737 inf_attribute10_tbl(i),
3738 inf_attribute11_tbl(i),
3739 inf_attribute12_tbl(i),
3740 inf_attribute13_tbl(i),
3741 inf_attribute14_tbl(i),
3742 inf_attribute15_tbl(i),
3743 vi.object_version_number+1,
3744 l_user_id,
3745 l_login_id,
3746 sysdate
3747 FROM OKC_ART_INTERFACE_ALL VI
3748 WHERE inf_action_tbl(i) = 'U'
3749 AND nvl(process_status, 'E') in ('E')
3750 AND inf_process_status_tbl(i) in ('S', 'W')
3751 AND VI.interface_id = inf_interface_id_tbl(i))
3752 WHERE vo.article_version_id = inf_article_version_id_tbl(i)
3753 AND inf_process_status_tbl(i) in ('S','W')
3754 AND inf_action_tbl(i) = 'U';
3755
3756 EXCEPTION
3757 WHEN OTHERS THEN
3758 IF (l_debug = 'Y') THEN
3759 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
3760 END IF;
3761 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3762 END;
3763 --
3764 -- End of Update OKC_ARTICLE_VERSIONS
3765 --
3766 --
3767
3768
3769
3770 --
3771 -- Start Auto Adoption
3772 --
3773 --
3774 -- Auto adopt all approved global articles in New/New Version case.
3775
3776 IF G_CURRENT_ORG_ID = G_GLOBAL_ORG_ID THEN
3777 BEGIN
3778 i := 0;
3779 l_context := 'AUTO ADOPTION';
3780 For i IN inf_interface_id_tbl.FIRST ..inf_interface_id_tbl.LAST LOOP
3781 IF nvl(inf_process_status_tbl(i),'E') <> 'E'
3782 and nvl(inf_article_status_tbl(i), '*') = 'APPROVED'
3783 and inf_global_yn_tbl(i) = 'Y' THEN
3784 OKC_ADOPTIONS_GRP.AUTO_ADOPT_ARTICLES
3785 (
3786 p_api_version => l_api_version ,
3787 p_init_msg_list => l_init_msg_list ,
3788 x_return_status => api_return_status ,
3789 x_msg_count => x_msg_count,
3790 x_msg_data => x_msg_data,
3791 p_relationship_yn => 'N',
3792 p_adoption_yn => 'Y',
3793 p_fetchsize => 100,
3794 p_global_article_id => inf_article_id_tbl(i),
3795 p_global_article_version_id => inf_article_version_id_tbl(i)
3796 );
3797
3798 IF (api_return_status = G_RET_STS_UNEXP_ERROR) THEN
3799 -- in order to mark interface_id, we build error_array in the loop
3800 build_error_array(
3801 p_msg_data => x_msg_data,
3802 p_context => l_context,
3803 p_batch_process_id => l_batch_process_id,
3804 p_interface_id => inf_interface_id_tbl(i),
3805 p_article_title => inf_article_title_tbl(i),
3806 p_error_type => G_RET_STS_ERROR,
3807 p_entity => 'CLAUSE'
3808 );
3809 inf_process_status_tbl(i):= G_RET_STS_ERROR;
3810 -- Unexpected Error occurred rollback
3811 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3812 ELSIF (api_return_status = G_RET_STS_ERROR) THEN
3813 -- Set return status as 'E' and move on to next record
3814 -- l_return_status := G_RET_STS_ERROR;
3815 build_error_array(
3816 p_msg_data => x_msg_data,
3817 p_context => l_context,
3818 p_batch_process_id => l_batch_process_id,
3819 p_interface_id => inf_interface_id_tbl(i),
3820 p_article_title => inf_article_title_tbl(i),
3821 p_error_type => G_RET_STS_ERROR,
3822 p_entity => 'CLAUSE'
3823 );
3824 inf_process_status_tbl(i):= G_RET_STS_ERROR;
3825 RAISE FND_API.G_EXC_ERROR;
3826 END IF;
3827 END IF;
3828 END LOOP;
3829
3830
3831 EXCEPTION
3832 WHEN OTHERS THEN
3833 IF (l_debug = 'Y') THEN
3834 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
3835 END IF;
3836 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3837 END;
3838 END IF; ---- If CURRENT_ORG_ID = GLOBAL_ORG_ID
3839
3840 --
3841 -- End of Auto Adoption
3842 --
3843 --
3844
3845 -- Exception for bulk DML block
3846 EXCEPTION
3847 WHEN OTHERS THEN
3848 l_bulk_failed := 'Y'; -- indicating that bulk operation has failed
3849 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
3850 p_msg_name => G_UNEXPECTED_ERROR,
3851 p_token1 => G_SQLCODE_TOKEN,
3852 p_token1_value => sqlcode,
3853 p_token2 => G_SQLERRM_TOKEN,
3854 p_token2_value => sqlerrm);
3855 Okc_API.Set_Message(p_app_name => G_APP_NAME,
3856 p_msg_name => 'OKC_ART_FETCH_FAILED',
3857 p_token1 => 'CONTEXT',
3858 p_token1_value => l_context);
3859
3860 build_error_array(
3861 p_msg_data => null,
3862 p_context => l_context,
3863 p_batch_process_id => l_batch_process_id,
3864 p_interface_id => -99,
3865 p_article_title => NULL,
3866 p_error_type => G_RET_STS_ERROR,
3867 p_entity => 'CLAUSE'
3868 );
3869 l_return_status := G_RET_STS_UNEXP_ERROR;
3870 x_return_status := G_RET_STS_UNEXP_ERROR;
3871
3872 --##count:rollback the count
3873 l_part_rows_failed := l_part_rows_processed;
3874 l_part_rows_warned := 0;
3875
3876 ROLLBACK TO SAVEPOINT bulkdml;
3877 exit; -- exit outermost loop
3878 END;
3879
3880 END IF; --- validate_only = 'N'
3881
3882 ------------------------------------------------------------------------
3883 --------------------- End of Do_DML for Article Library ---------------
3884 -------------------------------------------------------------------------
3885
3886 ------------------------------------------------------------------------
3887 --------------- Start of Do_DML for import related tables ------------
3888 -- Update interface table
3889 -- Insert Errors into Error table
3890 -------------------------------------------------------------------------
3891 -- Update Interface Table
3892 i:=0;
3893 BEGIN
3894 l_context := 'UPDATING CLAUSE INTERFACE TABLE';
3895 FORALL i in inf_interface_id_tbl.FIRST..inf_interface_id_tbl.LAST
3896 UPDATE OKC_ART_INTERFACE_ALL
3897 SET
3898 -- We don't want to update process_status to 'S' or 'W' in validation_mode
3899 -- because it is not going to be picked up in next run if we do so
3900 PROCESS_STATUS = decode(p_validate_only||inf_process_status_tbl(i)||l_bulk_failed,
3901 'NEN','E',
3902 'NSN','S',
3903 'NWN','W',
3904 'NEY','E',
3905 'NSY',NULL,
3906 'NWY',NULL,
3907 'YEY','E',
3908 'YEN','E',
3909 'NFY','E',
3910 'YFY','E',
3911 'NFN','E',
3912 'YFN','E',NULL),
3913 ARTICLE_VERSION_NUMBER = inf_article_version_number_tbl(i),
3914 PROGRAM_ID = l_program_id,
3915 REQUEST_ID = l_request_id,
3916 PROGRAM_LOGIN_ID = l_program_login_id,
3917 PROGRAM_APPLICATION_ID = l_program_appl_id,
3918 OBJECT_VERSION_NUMBER = inf_object_version_number_tbl(i) + 1,
3919 LAST_UPDATED_BY = l_user_id,
3920 LAST_UPDATE_LOGIN = l_login_id,
3921 LAST_UPDATE_DATE = SYSDATE
3922 WHERE
3923 interface_id = inf_interface_id_tbl(i);
3924 EXCEPTION
3925 WHEN OTHERS THEN
3926 IF (l_debug = 'Y') THEN
3927 okc_debug.log('500: Leaving Article_Import because of EXCEPTION: '||sqlerrm, 2);
3928 END IF;
3929 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
3930 p_msg_name => G_UNEXPECTED_ERROR,
3931 p_token1 => G_SQLCODE_TOKEN,
3932 p_token1_value => sqlcode,
3933 p_token2 => G_SQLERRM_TOKEN,
3934 p_token2_value => sqlerrm);
3935 Okc_API.Set_Message(p_app_name => G_APP_NAME,
3936 p_msg_name => 'OKC_ART_INT_UPDATE_FAILED');
3937 build_error_array(
3938 p_msg_data => null,
3939 p_context => l_context,
3940 p_batch_process_id => l_batch_process_id,
3941 p_interface_id => -99,
3942 p_article_title => NULL,
3943 p_error_type => G_RET_STS_ERROR,
3944 p_entity => 'CLAUSE'
3945 );
3946 l_return_status := G_RET_STS_UNEXP_ERROR ;
3947 x_return_status := G_RET_STS_UNEXP_ERROR ;
3948 --##count:rollback the count
3949 l_part_rows_failed := l_part_rows_processed;
3950 l_part_rows_warned := 0;
3951
3952 --RAISE FND_API.G_EXC_ERROR ;
3953 END;
3954 --
3955 -- End of Update OKC_ART_INTERFACE_ALL
3956 --
3957 --
3958 --Insert Errors into Error table for this fetch
3959 insert_error_array(
3960 x_return_status => api_return_status,
3961 x_msg_count => x_msg_count,
3962 x_msg_data => x_msg_data
3963 );
3964
3965
3966 IF (api_return_status = l_insert_errors_error) THEN
3967 NULL;
3968 -- Ignore
3969 -- RAISE l_insert_errors_exception;
3970 END IF;
3971 ------------------------------------------------------------------------
3972 --------------- End of Do_DML for import related tables ------------
3973 -------------------------------------------------------------------------
3974 commit;
3975 -- Now delete cache for next bulk fetch
3976
3977
3978 inf_interface_id_tbl.DELETE;
3979 inf_batch_number_tbl.DELETE;
3980 inf_object_version_number_tbl.DELETE;
3981 inf_article_title_tbl.DELETE;
3982 inf_org_id_tbl.DELETE;
3983 inf_process_status_tbl.DELETE;
3984 inf_action_tbl.DELETE;
3985 inf_article_number_tbl.DELETE;
3986 inf_article_intent_tbl.DELETE;
3987 inf_article_language_tbl.DELETE;
3988 inf_article_type_tbl.DELETE;
3989 inf_article_id_tbl.DELETE;
3990 inf_art_reference_code_tbl.DELETE;
3991 inf_art_reference_id1_tbl.DELETE;
3992 inf_art_reference_id2_tbl.DELETE;
3993 inf_article_version_number_tbl.DELETE;
3994 inf_article_text_tbl.DELETE;
3995 inf_provision_yn_tbl.DELETE;
3996 inf_insert_by_reference_tbl.DELETE;
3997 inf_lock_text_tbl.DELETE;
3998 inf_global_yn_tbl.DELETE;
3999 inf_article_status_tbl.DELETE;
4000 inf_start_date_tbl.DELETE;
4001 inf_end_date_tbl.DELETE;
4002 inf_display_name_tbl.DELETE;
4003 --inf_translated_yn_tbl.DELETE;
4004 inf_article_description_tbl.DELETE;
4005 inf_date_approved_tbl.DELETE;
4006 inf_default_section_tbl.DELETE;
4007 inf_reference_source_tbl.DELETE;
4008 inf_reference_text_tbl.DELETE;
4009 inf_ver_reference_code_tbl.DELETE;
4010 inf_ver_reference_id1_tbl.DELETE;
4011 inf_ver_reference_id2_tbl.DELETE;
4012 inf_instructions_tbl.DELETE;
4013 inf_date_published_tbl.DELETE;
4014 inf_attribute_category_tbl.DELETE;
4015 inf_attribute1_tbl.DELETE;
4016 inf_attribute2_tbl.DELETE;
4017 inf_attribute3_tbl.DELETE;
4018 inf_attribute4_tbl.DELETE;
4019 inf_attribute5_tbl.DELETE;
4020 inf_attribute6_tbl.DELETE;
4021 inf_attribute7_tbl.DELETE;
4022 inf_attribute8_tbl.DELETE;
4023 inf_attribute9_tbl.DELETE;
4024 inf_attribute10_tbl.DELETE;
4025 inf_attribute11_tbl.DELETE;
4026 inf_attribute12_tbl.DELETE;
4027 inf_attribute13_tbl.DELETE;
4028 inf_attribute14_tbl.DELETE;
4029 inf_attribute15_tbl.DELETE;
4030 inf_article_version_id_tbl.DELETE;
4031 inf_earlier_version_id_tbl.DELETE;
4032 inf_adoption_type_tbl.DELETE;
4033 err_batch_process_id_tbl.DELETE;
4034 err_article_title_tbl.DELETE;
4035 err_interface_id_tbl.DELETE;
4036 err_error_number_tbl.DELETE;
4037 err_object_version_number_tbl.DELETE;
4038 err_error_type_tbl.DELETE;
4039 err_entity_tbl.DELETE;
4040 err_error_description_tbl.DELETE;
4041
4042 EXIT WHEN l_interface_csr%NOTFOUND;
4043 END LOOP;
4044
4045
4046 -----------------------------------------------------------------------
4047 -- End of outermost loop for bulk fetch
4048 -----------------------------------------------------------------------
4049
4050 IF l_interface_csr%ISOPEN THEN
4051 CLOSE l_interface_csr;
4052 END IF;
4053
4054 --
4055 -- Freeing temporary clobs
4056 --
4057 --
4058
4059 j := g_temp_clob_tbl.FIRST;
4060 LOOP
4061 DBMS_LOB.FREETEMPORARY(g_temp_clob_tbl(j));
4062 EXIT WHEN (j = g_temp_clob_tbl.LAST);
4063 j := g_temp_clob_tbl.NEXT(j);
4064 END LOOP;
4065 g_temp_clob_tbl.DELETE;
4066
4067 --
4068 -- Freeing temporary clobs
4069 --
4070 --
4071
4072 --##count:add up last processed counts
4073 l_tot_rows_processed := l_tot_rows_processed + l_part_rows_processed;
4074 l_tot_rows_failed := l_tot_rows_failed + l_part_rows_failed;
4075 l_tot_rows_warned := l_tot_rows_warned + l_part_rows_warned;
4076
4077 BEGIN
4078 --If there are successful records and validate mode is off
4079
4080 IF p_validate_only = 'N'
4081 AND (l_tot_rows_processed - l_tot_rows_failed) > 0 THEN
4082 okc_artwf_pvt.start_wf_after_import( p_req_id => l_request_id,
4083 p_batch_number => p_batch_number,
4084 p_org_id => G_CURRENT_ORG_ID);
4085 END IF;
4086
4087 EXCEPTION
4088
4089 WHEN OTHERS THEN
4090 IF (l_debug = 'Y') THEN
4091 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION in workflow: '||sqlerrm, 2);
4092 END IF;
4093 Okc_API.Set_Message(p_app_name => G_APP_NAME,
4094 p_msg_name => 'OKC_ART_IMP_WF_FAILED');
4095
4096 build_error_array(
4097 p_msg_data => null,
4098 p_context => l_context,
4099 p_batch_process_id => l_batch_process_id,
4100 p_interface_id => -99,
4101 p_article_title => NULL,
4102 p_error_type => G_RET_STS_ERROR,
4103 p_entity => 'CLAUSE'
4104 );
4105
4106 l_return_status := G_RET_STS_UNEXP_ERROR ;
4107 x_return_status := G_RET_STS_UNEXP_ERROR ;
4108 --RAISE FND_API.G_EXC_ERROR ;
4109 END;
4110 /*********
4111 --Update Batch Process Table as a last step
4112 UPDATE OKC_ART_INT_BATPROCS_ALL
4113 SET
4114 TOTAL_ROWS_PROCESSED = l_tot_rows_processed,
4115 TOTAL_ROWS_FAILED = l_tot_rows_failed,
4116 TOTAL_ROWS_WARNED = l_tot_rows_warned,
4117 END_DATE = SYSDATE,
4118 PROGRAM_ID = l_program_id,
4119 REQUEST_ID = l_request_id,
4120 PROGRAM_LOGIN_ID = l_program_login_id,
4121 PROGRAM_APPLICATION_ID = l_program_appl_id,
4122 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
4123 LAST_UPDATED_BY = l_user_id,
4124 LAST_UPDATE_LOGIN = l_login_id,
4125 LAST_UPDATE_DATE = SYSDATE
4126 WHERE
4127 BATCH_PROCESS_ID = l_batch_process_id
4128 AND ENTITY = 'Clause';
4129 *****************/
4130 p_rows_processed := l_tot_rows_processed;
4131 p_rows_failed := l_tot_rows_failed;
4132 p_rows_warned := l_tot_rows_warned;
4133 IF err_error_number_tbl.COUNT > 0 THEN
4134 insert_error_array(
4135 x_return_status => api_return_status,
4136 x_msg_count => x_msg_count,
4137 x_msg_data => x_msg_data
4138 );
4139 END IF;
4140
4141 -- Print statistic of this run in the log
4142 -- Commented for new XML Based Import - Moved to new_wrap_up in conc_import_articles
4143 --wrap_up(p_validate_only,p_batch_number,l_tot_rows_processed,l_tot_rows_failed,l_tot_rows_warned,l_batch_process_id,'CLAUSE');
4144 commit; -- Final commit for status update
4145
4146 IF (l_debug = 'Y') THEN
4147 okc_debug.log('200: Leaving articles import', 2);
4148 END IF;
4149 --x_return_status := l_return_status; this may cause to erase error x_return_status
4150
4151 EXCEPTION
4152
4153 WHEN FND_API.G_EXC_ERROR THEN
4154 IF (l_debug = 'Y') THEN
4155 okc_debug.log('300: Leaving Articles_Import: OKC_API.G_EXCEPTION_ERROR Exception', 2);
4156 END IF;
4157 --Insert Errors into Error table if there is any
4158 insert_error_array(
4159 x_return_status => x_return_status,
4160 x_msg_count => x_msg_count,
4161 x_msg_data => x_msg_data
4162 );
4163 commit;
4164 x_return_status := G_RET_STS_ERROR ;
4165
4166 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4167 IF (l_debug = 'Y') THEN
4168 okc_debug.log('400: Leaving Articles_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
4169 END IF;
4170
4171 --Insert Errors into Error table if there is any
4172
4173 insert_error_array(
4174 x_return_status => x_return_status,
4175 x_msg_count => x_msg_count,
4176 x_msg_data => x_msg_data
4177 );
4178 commit;
4179 --
4180 -- Freeing temporary clobs
4181 --
4182 --
4183
4184 IF g_temp_clob_tbl.COUNT > 0 THEN
4185 j := g_temp_clob_tbl.FIRST;
4186 LOOP
4187 DBMS_LOB.FREETEMPORARY(g_temp_clob_tbl(j));
4188 EXIT WHEN (j = g_temp_clob_tbl.LAST);
4189 j := g_temp_clob_tbl.NEXT(j);
4190 END LOOP;
4191 g_temp_clob_tbl.DELETE;
4192 END IF;
4193 --
4194 -- Freeing temporary clobs
4195 --
4196 --
4197
4198 IF l_interface_csr%ISOPEN THEN
4199 CLOSE l_interface_csr;
4200 END IF;
4201 IF get_max_article_version_csr%ISOPEN THEN
4202 CLOSE get_max_article_version_csr;
4203 END IF;
4204 IF get_article_info_csr%ISOPEN THEN
4205 CLOSE get_article_info_csr;
4206 END IF;
4207 IF validate_article_type_csr%ISOPEN THEN
4208 CLOSE validate_article_type_csr;
4209 END IF;
4210
4211 x_return_status := G_RET_STS_UNEXP_ERROR ;
4212 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
4213 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
4214 END IF;
4215 get_print_msgs_stack(p_msg_data => x_msg_data);
4216
4217 WHEN l_insert_errors_exception THEN
4218 --
4219 -- In this exception handling, we don't insert error array again
4220 -- because error happend in the module
4221 --
4222 IF (l_debug = 'Y') THEN
4223 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION in insert_error_array: '||sqlerrm, 2);
4224 END IF;
4225 --
4226 -- Freeing temporary clobs
4227 --
4228 --
4229
4230 IF g_temp_clob_tbl.COUNT > 0 THEN
4231 j := g_temp_clob_tbl.FIRST;
4232 LOOP
4233 DBMS_LOB.FREETEMPORARY(g_temp_clob_tbl(j));
4234 EXIT WHEN (j = g_temp_clob_tbl.LAST);
4235 j := g_temp_clob_tbl.NEXT(j);
4236 END LOOP;
4237 g_temp_clob_tbl.DELETE;
4238 END IF;
4239
4240 --
4241 -- Freeing temporary clobs
4242 --
4243 --
4244
4245 IF l_interface_csr%ISOPEN THEN
4246 CLOSE l_interface_csr;
4247 END IF;
4248
4249 IF get_max_article_version_csr%ISOPEN THEN
4250 CLOSE get_max_article_version_csr;
4251 END IF;
4252
4253 IF get_article_info_csr%ISOPEN THEN
4254 CLOSE get_article_info_csr;
4255 END IF;
4256
4257 IF validate_article_type_csr%ISOPEN THEN
4258 CLOSE validate_article_type_csr;
4259 END IF;
4260
4261
4262 --x_return_status := G_RET_STS_UNEXP_ERROR ;
4263 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
4264 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
4265 END IF;
4266
4267 get_print_msgs_stack(p_msg_data => x_msg_data);
4268 commit;
4269
4270 WHEN OTHERS THEN
4271 IF (l_debug = 'Y') THEN
4272 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION: '||sqlerrm, 2);
4273 END IF;
4274 --Insert Errors into Error table if there is any
4275 insert_error_array(
4276 x_return_status => x_return_status,
4277 x_msg_count => x_msg_count,
4278 x_msg_data => x_msg_data
4279 );
4280 commit;
4281 --
4282 -- Freeing temporary clobs
4283 --
4284 --
4285 IF g_temp_clob_tbl.COUNT > 0 THEN
4286 j := g_temp_clob_tbl.FIRST;
4287 LOOP
4288 DBMS_LOB.FREETEMPORARY(g_temp_clob_tbl(j));
4289 EXIT WHEN (j = g_temp_clob_tbl.LAST);
4290 j := g_temp_clob_tbl.NEXT(j);
4291 END LOOP;
4292 g_temp_clob_tbl.DELETE;
4293 END IF;
4294 --
4295 -- Freeing temporary clobs
4296 --
4297 --
4298
4299 IF l_interface_csr%ISOPEN THEN
4300 CLOSE l_interface_csr;
4301 END IF;
4302 IF get_max_article_version_csr%ISOPEN THEN
4303 CLOSE get_max_article_version_csr;
4304 END IF;
4305 IF get_article_info_csr%ISOPEN THEN
4306 CLOSE get_article_info_csr;
4307 END IF;
4308 IF validate_article_type_csr%ISOPEN THEN
4309 CLOSE validate_article_type_csr;
4310 END IF;
4311
4312 x_return_status := G_RET_STS_UNEXP_ERROR ;
4313 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
4314 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
4315 END IF;
4316 get_print_msgs_stack(p_msg_data => x_msg_data);
4317
4318 END import_articles;
4319
4320 PROCEDURE import_variables(
4321 x_return_status OUT NOCOPY VARCHAR2,
4322 x_msg_count OUT NOCOPY NUMBER,
4323 x_msg_data OUT NOCOPY VARCHAR2,
4324
4325 p_batch_procs_id IN NUMBER,
4326 p_batch_number IN VARCHAR2,
4327 p_validate_only IN VARCHAR2 := 'Y',
4328 p_fetchsize IN NUMBER := 100
4329 ) IS
4330 l_api_version CONSTANT NUMBER := 1;
4331 l_api_name CONSTANT VARCHAR2(30) := 'import_variables';
4332 l_sts_warning CONSTANT VARCHAR2(1) := 'W';
4333 l_row_notfound BOOLEAN := FALSE;
4334 l_user_id NUMBER;
4335 l_login_id NUMBER;
4336 l_insert_errors_exception EXCEPTION;
4337 l_insert_errors_error CONSTANT VARCHAR2(1) := 'X';
4338
4339 CURSOR l_var_interface_csr ( cp_batch_number IN VARCHAR2) IS
4340 SELECT
4341 VARINT.INTERFACE_ID ,
4342 VARINT.BATCH_NUMBER ,
4343 VARINT.OBJECT_VERSION_NUMBER ,
4344 RTRIM(VARINT.VARIABLE_CODE) VARIABLE_CODE ,
4345 VARINT.VARIABLE_NAME ,
4346 VARINT.PROCESS_STATUS ,
4347 VARINT.ACTION ,
4348 VARINT.LANGUAGE ,
4349 VARINT.DESCRIPTION,
4350 VARINT.VARIABLE_TYPE,
4351 VARINT.VARIABLE_INTENT,
4352 VARINT.CONTRACT_EXPERT_YN,
4353 VARINT.XPRT_VALUE_SET_NAME,
4354 VARINT.DISABLED_YN,
4355 VARINT.EXTERNAL_YN,
4356 VARINT.VARIABLE_DATATYPE,
4357 VARINT.APPLICATION_ID,
4358 VARINT.VALUE_SET_NAME,
4359 VARINT.VARIABLE_DEFAULT_VALUE,
4360 VARINT.ORIG_SYSTEM_REFERENCE_CODE,
4361 VARINT.ORIG_SYSTEM_REFERENCE_ID1,
4362 VARINT.ORIG_SYSTEM_REFERENCE_ID2,
4363 VARINT.DATE_PUBLISHED,
4364 VARINT.ATTRIBUTE_CATEGORY,
4365 VARINT.ATTRIBUTE1 ,
4366 VARINT.ATTRIBUTE2 ,
4367 VARINT.ATTRIBUTE3 ,
4368 VARINT.ATTRIBUTE4 ,
4369 VARINT.ATTRIBUTE5 ,
4370 VARINT.ATTRIBUTE6 ,
4371 VARINT.ATTRIBUTE7 ,
4372 VARINT.ATTRIBUTE8 ,
4373 VARINT.ATTRIBUTE9 ,
4374 VARINT.ATTRIBUTE10 ,
4375 VARINT.ATTRIBUTE11 ,
4376 VARINT.ATTRIBUTE12 ,
4377 VARINT.ATTRIBUTE13 ,
4378 VARINT.ATTRIBUTE14 ,
4379 VARINT.ATTRIBUTE15 ,
4380 VAR.VARIABLE_CODE EXISTING_CODE,
4381 VAR.DATE_PUBLISHED EXISTING_DPUBLISHED,
4382 VARTL.LANGUAGE EXISTING_LANGUAGE
4383 FROM OKC_VARIABLES_INTERFACE VARINT, OKC_BUS_VARIABLES_B VAR,
4384 OKC_BUS_VARIABLES_TL VARTL
4385 WHERE nvl(PROCESS_STATUS,'*') NOT IN ('W', 'S')
4386 AND BATCH_NUMBER = cp_batch_number
4387 AND RTRIM(VARINT.VARIABLE_CODE) = VAR.VARIABLE_CODE(+)
4388 AND RTRIM(VARINT.VARIABLE_CODE) = VARTL.VARIABLE_CODE(+)
4389 AND VARINT.LANGUAGE = VARTL.LANGUAGE(+)
4390 ORDER BY RTRIM(VARINT.VARIABLE_CODE) ASC;
4391
4392 -- Cursor to check that variable code is unique in the system
4393
4394 CURSOR l_code_exist_csr (cp_var_code IN VARCHAR2) IS
4395 SELECT '1' FROM OKC_BUS_VARIABLES_B
4396 WHERE variable_code = cp_var_code;
4397
4398 -- Cursor to check that variable name and intent is unique in the system
4399
4400 CURSOR get_var_unq_csr (cp_var_name IN VARCHAR2,
4401 cp_var_intent IN VARCHAR2) IS
4402 SELECT
4403 '1'
4404 FROM OKC_BUS_VARIABLES_B B,OKC_BUS_VARIABLES_TL TL
4405 WHERE B.VARIABLE_CODE = TL.VARIABLE_CODE AND
4406 B.VARIABLE_INTENT = cp_var_intent AND
4407 TL.VARIABLE_NAME = cp_var_name;
4408
4409 -- Cursor to check that variable code is not duplicate in the system
4410
4411 CURSOR get_var_info_csr (cp_var_code IN VARCHAR2 ) IS
4412 SELECT
4413 '1'
4414 FROM OKC_BUS_VARIABLES_B B,OKC_BUS_VARIABLES_TL TL
4415 WHERE B.VARIABLE_CODE = TL.VARIABLE_CODE AND
4416 B.VARIABLE_CODE = cp_var_code;
4417
4418 -- Cursor to derive value set id from value set name
4419
4420 CURSOR get_valset_id_csr (cp_valset_name IN VARCHAR2 ) IS
4421 SELECT
4422 FLX.FLEX_VALUE_SET_ID ,
4423 DECODE(FORMAT_TYPE,'C','V','X','D',FORMAT_TYPE) FORMAT_TYPE
4424 FROM FND_FLEX_VALUE_SETS FLX
4425 WHERE FLX.FLEX_VALUE_SET_NAME = cp_valset_name;
4426
4427
4428 -- Cursor to check valueset exists in the valueset interface Table
4429 CURSOR valset_exists_csr (cp_valset_name IN VARCHAR2,
4430 cp_batch_number IN VARCHAR2) IS
4431 SELECT '1'
4432 FROM OKC_VALUESETS_INTERFACE
4433 WHERE flex_value_set_name = cp_valset_name
4434 AND batch_number = cp_batch_number
4435 AND nvl(process_status,'X') not in ('E');
4436
4437 -- Cursor to verify language is installed
4438 CURSOR check_lang_csr(lang_code IN VARCHAR2) IS
4439 SELECT '1'
4440 FROM FND_LANGUAGES
4441 WHERE INSTALLED_FLAG IN ('I','B')
4442 AND language_code = lang_code;
4443
4444 -- Variable Interface Rows
4445
4446 TYPE l_vinf_interface_id IS TABLE OF OKC_VARIABLES_INTERFACE.INTERFACE_ID%TYPE INDEX BY BINARY_INTEGER ;
4447 TYPE l_vinf_batch_number IS TABLE OF OKC_VARIABLES_INTERFACE.BATCH_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
4448 TYPE l_vinf_object_version_number IS TABLE OF OKC_VARIABLES_INTERFACE.OBJECT_VERSION_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
4449 TYPE l_vinf_variable_code IS TABLE OF OKC_VARIABLES_INTERFACE.VARIABLE_CODE%TYPE INDEX BY BINARY_INTEGER ;
4450 TYPE l_vinf_variable_name IS TABLE OF OKC_VARIABLES_INTERFACE.VARIABLE_NAME%TYPE INDEX BY BINARY_INTEGER ;
4451 TYPE l_vinf_process_status IS TABLE OF OKC_VARIABLES_INTERFACE.PROCESS_STATUS%TYPE INDEX BY BINARY_INTEGER ;
4452 TYPE l_vinf_action IS TABLE OF OKC_VARIABLES_INTERFACE.ACTION%TYPE INDEX BY BINARY_INTEGER ;
4453 TYPE l_vinf_language IS TABLE OF OKC_VARIABLES_INTERFACE.LANGUAGE%TYPE INDEX BY BINARY_INTEGER ;
4454 TYPE l_vinf_description IS TABLE OF OKC_VARIABLES_INTERFACE.DESCRIPTION%TYPE INDEX BY BINARY_INTEGER ;
4455 TYPE l_vinf_variable_type IS TABLE OF OKC_VARIABLES_INTERFACE.VARIABLE_TYPE%TYPE INDEX BY BINARY_INTEGER ;
4456 TYPE l_vinf_variable_intent IS TABLE OF OKC_VARIABLES_INTERFACE.VARIABLE_INTENT%TYPE INDEX BY BINARY_INTEGER ;
4457 TYPE l_vinf_contract_expert_yn IS TABLE OF OKC_VARIABLES_INTERFACE.CONTRACT_EXPERT_YN%TYPE INDEX BY BINARY_INTEGER ;
4458 TYPE l_vinf_xprt_value_set_name IS TABLE OF OKC_VARIABLES_INTERFACE.XPRT_VALUE_SET_NAME%TYPE INDEX BY BINARY_INTEGER ;
4459 TYPE l_vinf_disabled_yn IS TABLE OF OKC_VARIABLES_INTERFACE.DISABLED_YN%TYPE INDEX BY BINARY_INTEGER ;
4460 TYPE l_vinf_external_yn IS TABLE OF OKC_VARIABLES_INTERFACE.EXTERNAL_YN%TYPE INDEX BY BINARY_INTEGER ;
4461 TYPE l_vinf_variable_datatype IS TABLE OF OKC_VARIABLES_INTERFACE.VARIABLE_DATATYPE%TYPE INDEX BY BINARY_INTEGER ;
4462 TYPE l_vinf_application_id IS TABLE OF OKC_VARIABLES_INTERFACE.APPLICATION_ID%TYPE INDEX BY BINARY_INTEGER ;
4463 TYPE l_vinf_value_set_name IS TABLE OF OKC_VARIABLES_INTERFACE.VALUE_SET_NAME%TYPE INDEX BY BINARY_INTEGER ;
4464 TYPE l_vinf_var_default_value IS TABLE OF OKC_VARIABLES_INTERFACE.VARIABLE_DEFAULT_VALUE%TYPE INDEX BY BINARY_INTEGER ;
4465 TYPE l_vinf_system_reference_code IS TABLE OF OKC_VARIABLES_INTERFACE.ORIG_SYSTEM_REFERENCE_CODE%TYPE INDEX BY BINARY_INTEGER ;
4466 TYPE l_vinf_system_reference_id1 IS TABLE OF OKC_VARIABLES_INTERFACE.ORIG_SYSTEM_REFERENCE_ID1%TYPE INDEX BY BINARY_INTEGER ;
4467 TYPE l_vinf_system_reference_id2 IS TABLE OF OKC_VARIABLES_INTERFACE.ORIG_SYSTEM_REFERENCE_ID2%TYPE INDEX BY BINARY_INTEGER ;
4468 TYPE l_vinf_date_published IS TABLE OF OKC_VARIABLES_INTERFACE.DATE_PUBLISHED%TYPE INDEX BY BINARY_INTEGER ;
4469 TYPE l_vinf_attribute_category IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE_CATEGORY%TYPE INDEX BY BINARY_INTEGER ;
4470 TYPE l_vinf_attribute1 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE1%TYPE INDEX BY BINARY_INTEGER ;
4471 TYPE l_vinf_attribute2 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE2%TYPE INDEX BY BINARY_INTEGER ;
4472 TYPE l_vinf_attribute3 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE3%TYPE INDEX BY BINARY_INTEGER ;
4473 TYPE l_vinf_attribute4 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE4%TYPE INDEX BY BINARY_INTEGER ;
4474 TYPE l_vinf_attribute5 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE5%TYPE INDEX BY BINARY_INTEGER ;
4475 TYPE l_vinf_attribute6 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE6%TYPE INDEX BY BINARY_INTEGER ;
4476 TYPE l_vinf_attribute7 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE7%TYPE INDEX BY BINARY_INTEGER ;
4477 TYPE l_vinf_attribute8 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE8%TYPE INDEX BY BINARY_INTEGER ;
4478 TYPE l_vinf_attribute9 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE9%TYPE INDEX BY BINARY_INTEGER ;
4479 TYPE l_vinf_attribute10 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE10%TYPE INDEX BY BINARY_INTEGER ;
4480 TYPE l_vinf_attribute11 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE11%TYPE INDEX BY BINARY_INTEGER ;
4481 TYPE l_vinf_attribute12 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE12%TYPE INDEX BY BINARY_INTEGER ;
4482 TYPE l_vinf_attribute13 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE13%TYPE INDEX BY BINARY_INTEGER ;
4483 TYPE l_vinf_attribute14 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE14%TYPE INDEX BY BINARY_INTEGER ;
4484 TYPE l_vinf_attribute15 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE15%TYPE INDEX BY BINARY_INTEGER ;
4485
4486
4487 TYPE l_vinf_existing_code IS TABLE OF OKC_BUS_VARIABLES_B.VARIABLE_CODE%TYPE INDEX BY BINARY_INTEGER ;
4488 TYPE l_vinf_existing_dpublished IS TABLE OF OKC_BUS_VARIABLES_B.DATE_PUBLISHED%TYPE INDEX BY BINARY_INTEGER ;
4489 TYPE l_vinf_value_set_id IS TABLE OF OKC_BUS_VARIABLES_B.VALUE_SET_ID%TYPE INDEX BY BINARY_INTEGER ;
4490 TYPE l_vinf_existing_language IS TABLE OF OKC_BUS_VARIABLES_TL.LANGUAGE%TYPE INDEX BY BINARY_INTEGER ;
4491
4492
4493 l_return_status VARCHAR2(1);
4494 l_error_index NUMBER := 1;
4495 l_batch_process_id NUMBER := 1;
4496 l_context VARCHAR2(50) := NULL;
4497 l_init_msg_list VARCHAR2(200) := okc_api.g_true;
4498 l_tot_rows_processed NUMBER := 0;
4499 l_tot_rows_failed NUMBER := 0;
4500 l_tot_rows_warned NUMBER := 0;
4501 l_part_rows_processed NUMBER := 0;
4502 l_part_rows_failed NUMBER := 0;
4503 l_part_rows_warned NUMBER := 0;
4504 l_bulk_failed VARCHAR2(1) := 'Y';
4505
4506 -- Variables for variables interface
4507 vinf_interface_id_tbl l_vinf_interface_id ;
4508 vinf_batch_number_tbl l_vinf_batch_number ;
4509 vinf_object_version_number_tbl l_vinf_object_version_number ;
4510 vinf_variable_code_tbl l_vinf_variable_code ;
4511 vinf_variable_name_tbl l_vinf_variable_name ;
4512 vinf_process_status_tbl l_vinf_process_status ;
4513 vinf_action_tbl l_vinf_action ;
4514 vinf_language_tbl l_vinf_language ;
4515 vinf_description_tbl l_vinf_description ;
4516 vinf_variable_type_tbl l_vinf_variable_type ;
4517 vinf_variable_intent_tbl l_vinf_variable_intent ;
4518 vinf_contract_expert_yn_tbl l_vinf_contract_expert_yn ;
4519 vinf_xprt_value_set_name_tbl l_vinf_xprt_value_set_name ;
4520 vinf_disabled_yn_tbl l_vinf_disabled_yn ;
4521 vinf_external_yn_tbl l_vinf_external_yn ;
4522 vinf_variable_datatype_tbl l_vinf_variable_datatype ;
4523 vinf_application_id_tbl l_vinf_application_id ;
4524 vinf_value_set_name_tbl l_vinf_value_set_name ;
4525 vinf_var_default_value_tbl l_vinf_var_default_value ;
4526 vinf_system_reference_code_tbl l_vinf_system_reference_code ;
4527 vinf_system_reference_id1_tbl l_vinf_system_reference_id1 ;
4528 vinf_system_reference_id2_tbl l_vinf_system_reference_id2 ;
4529 vinf_date_published_tbl l_vinf_date_published ;
4530 vinf_attribute_category_tbl l_vinf_attribute_category ;
4531 vinf_attribute1_tbl l_vinf_attribute1 ;
4532 vinf_attribute2_tbl l_vinf_attribute2 ;
4533 vinf_attribute3_tbl l_vinf_attribute3 ;
4534 vinf_attribute4_tbl l_vinf_attribute4 ;
4535 vinf_attribute5_tbl l_vinf_attribute5 ;
4536 vinf_attribute6_tbl l_vinf_attribute6 ;
4537 vinf_attribute7_tbl l_vinf_attribute7 ;
4538 vinf_attribute8_tbl l_vinf_attribute8 ;
4539 vinf_attribute9_tbl l_vinf_attribute9 ;
4540 vinf_attribute10_tbl l_vinf_attribute10 ;
4541 vinf_attribute11_tbl l_vinf_attribute11 ;
4542 vinf_attribute12_tbl l_vinf_attribute12 ;
4543 vinf_attribute13_tbl l_vinf_attribute13 ;
4544 vinf_attribute14_tbl l_vinf_attribute14 ;
4545 vinf_attribute15_tbl l_vinf_attribute15 ;
4546
4547
4548 vinf_existing_code_tbl l_vinf_existing_code ;
4549 vinf_existing_dpublished_tbl l_vinf_existing_dpublished ;
4550 vinf_value_set_id_tbl l_vinf_value_set_id ;
4551 vinf_existing_language_tbl l_vinf_existing_language ;
4552
4553 I NUMBER := 0;
4554 j NUMBER := 0;
4555 k NUMBER := 0;
4556 x NUMBER := 0;
4557 l_program_id OKC_VARIABLES_INTERFACE.PROGRAM_ID%TYPE;
4558 l_program_login_id OKC_VARIABLES_INTERFACE.PROGRAM_LOGIN_ID%TYPE;
4559 l_program_appl_id OKC_VARIABLES_INTERFACE.PROGRAM_APPLICATION_ID%TYPE;
4560 l_request_id OKC_VARIABLES_INTERFACE.REQUEST_ID%TYPE;
4561 l_dummy_unq VARCHAR2(1) := '?';
4562 l_dummy VARCHAR2(1) := '?';
4563 l_vs_id VARCHAR2(1) := NULL;
4564 l_language varchar2(1) := '?';
4565 l_value_set_id FND_FLEX_VALUE_SETS.FLEX_VALUE_SET_ID%TYPE;
4566 l_variable_datatype OKC_BUS_VARIABLES_B.VARIABLE_DATATYPE%TYPE;
4567
4568 BEGIN
4569 IF (l_debug = 'Y') THEN
4570 okc_debug.log('100: Entered variables_import', 2);
4571 END IF;
4572
4573 ------------------------------------------------------------------------
4574 -- Variable Initialization
4575 -------------------------------------------------------------------------
4576
4577 -- Standard Start of API savepoint
4578 FND_MSG_PUB.initialize;
4579 -- Initialize API return status to success
4580 x_return_status := FND_API.G_RET_STS_SUCCESS;
4581 l_return_status := G_RET_STS_SUCCESS;
4582 -- Cache user_id, login_id and org_id
4583 l_user_id := Fnd_Global.user_id;
4584 l_login_id := Fnd_Global.login_id;
4585
4586 IF FND_GLOBAL.CONC_PROGRAM_ID = -1 THEN
4587 l_program_id := NULL;
4588 ELSE
4589 l_program_id := FND_GLOBAL.CONC_PROGRAM_ID;
4590 END IF;
4591
4592 IF FND_GLOBAL.CONC_LOGIN_ID = -1 THEN
4593 l_program_login_id := NULL;
4594 ELSE
4595 l_program_login_id := FND_GLOBAL.CONC_LOGIN_ID;
4596 END IF;
4597
4598 IF FND_GLOBAL.PROG_APPL_ID = -1 THEN
4599 l_program_appl_id := NULL;
4600 ELSE
4601 l_program_appl_id := FND_GLOBAL.PROG_APPL_ID;
4602 END IF;
4603
4604 IF FND_GLOBAL.CONC_REQUEST_ID = -1 THEN
4605 l_request_id := NULL;
4606 ELSE
4607 l_request_id := FND_GLOBAL.CONC_REQUEST_ID;
4608 END IF;
4609
4610 l_batch_process_id := p_batch_procs_id;
4611 -------------------------------------------------------------------------
4612 --------------- the outermost loop of this procedure --------------------
4613 -- Bulk fetch all interface rows based on the fetchsize passedby the user
4614 -------------------------------------------------------------------------
4615
4616 l_context :='BULK FETCH VARIABLE INTERFACE ROW';
4617 OPEN l_var_interface_csr ( p_batch_number );
4618 LOOP
4619 BEGIN
4620 FETCH l_var_interface_csr BULK COLLECT INTO
4621 vinf_interface_id_tbl ,
4622 vinf_batch_number_tbl ,
4623 vinf_object_version_number_tbl ,
4624 vinf_variable_code_tbl ,
4625 vinf_variable_name_tbl ,
4626 vinf_process_status_tbl ,
4627 vinf_action_tbl ,
4628 vinf_language_tbl ,
4629 vinf_description_tbl ,
4630 vinf_variable_type_tbl ,
4631 vinf_variable_intent_tbl ,
4632 vinf_contract_expert_yn_tbl ,
4633 vinf_xprt_value_set_name_tbl ,
4634 vinf_disabled_yn_tbl ,
4635 vinf_external_yn_tbl ,
4636 vinf_variable_datatype_tbl ,
4637 vinf_application_id_tbl ,
4638 vinf_value_set_name_tbl ,
4639 vinf_var_default_value_tbl ,
4640 vinf_system_reference_code_tbl ,
4641 vinf_system_reference_id1_tbl ,
4642 vinf_system_reference_id2_tbl ,
4643 vinf_date_published_tbl ,
4644 vinf_attribute_category_tbl ,
4645 vinf_attribute1_tbl ,
4646 vinf_attribute2_tbl ,
4647 vinf_attribute3_tbl ,
4648 vinf_attribute4_tbl ,
4649 vinf_attribute5_tbl ,
4650 vinf_attribute6_tbl ,
4651 vinf_attribute7_tbl ,
4652 vinf_attribute8_tbl ,
4653 vinf_attribute9_tbl ,
4654 vinf_attribute10_tbl ,
4655 vinf_attribute11_tbl ,
4656 vinf_attribute12_tbl ,
4657 vinf_attribute13_tbl ,
4658 vinf_attribute14_tbl ,
4659 vinf_attribute15_tbl ,
4660 vinf_existing_code_tbl ,
4661 vinf_existing_dpublished_tbl ,
4662 vinf_existing_language_tbl LIMIT p_fetchsize;
4663 EXIT WHEN vinf_interface_id_tbl.COUNT = 0 ;
4664
4665 ------------------------------------------------------------------------
4666 -- Variable initialization
4667 -------------------------------------------------------------------------
4668 --For each fetch, variable variable table index should be initialized
4669 j := 1;
4670 --##count:initialization
4671 l_tot_rows_processed := l_tot_rows_processed+l_part_rows_processed;
4672 l_tot_rows_failed := l_tot_rows_failed+l_part_rows_failed;
4673 l_tot_rows_warned := l_tot_rows_warned+l_part_rows_warned;
4674 l_part_rows_processed := 0;
4675 l_part_rows_failed := 0;
4676 l_part_rows_warned := 0;
4677 l_bulk_failed := 'N';
4678 ---------------------------------------------------------------------------
4679 --------------------- Inner Loop thru fetched rows for---------------------
4680 -- validation, parse and validate article text, create a variable list
4681 -- prepare rows for DML if validate_only is 'N'
4682 /*** Processing Rule to set process_status
4683 Because we want to collect as much info as possible, we need to
4684 maintain process status while keeping the process moving.
4685 So, we'll set l_return_status as validation goes on and
4686 at the end we will set inf_process_status_tbl(i) with l_return_status
4687 for final result. However, we will get out of this process if there
4688 is a significant error such as 'U'.
4689 The return status examined
4690 -api_return_status : return status for api call
4691 -l_return_status : validation result of each row
4692 -x_return_status : final result status for concurrent program request
4693 Rule to set return status
4694 If api_return_status for api call is
4695 * 'S' then continue
4696 * 'W' and l_return_status not 'E' or 'U' then set l_return_status = 'W'
4697 and build_error_array then continue
4698 * 'E' and it is significant then set l_return_status = 'E' and raise
4699 Exception
4700 * 'E' and it is minor then set l_return_status = 'E' and continue. Raise
4701 'E' at the end of validation
4702 * 'U' then set l_return_status = 'U' and raise 'U' exception
4703 * At the end, if it goes thru with no Exception,
4704 Check if l_return_status is 'E' then raise Exception
4705 Otherwise (meaning l_return_status is 'S' or 'W'),
4706 vinf_process_status_tbl(i) = l_return_status
4707 * In the exception, we will set
4708 vinf_process_status_tbl(i) = l_return_status and build_error_array
4709 ***/
4710 -------------------------------------------------------------------------
4711
4712 FOR i in vinf_interface_id_tbl.FIRST ..vinf_interface_id_tbl.LAST LOOP
4713 BEGIN
4714 -- Increment total processed rows
4715 --##Count
4716 l_part_rows_processed := l_part_rows_processed+1;
4717 -- Initialization for each iteration
4718 l_row_notfound := FALSE;
4719 l_return_status := G_RET_STS_SUCCESS;
4720
4721 -- following variables are not fetched from interface table
4722 -- thus initialize it here
4723 vinf_value_set_id_tbl(i) := NULL;
4724 vinf_variable_datatype_tbl(i) := NULL;
4725
4726 l_context := 'VARIABLE VALIDATING';
4727
4728 -- To find duplicate variable code in the batch
4729 IF i>1 THEN
4730 x := i-1;
4731 IF ((RTRIM(vinf_variable_code_tbl(i)) = RTRIM(vinf_variable_code_tbl(x)))
4732 --THEN
4733 AND (vinf_language_tbl(i)) = (vinf_language_tbl(x))) THEN
4734 Okc_Api.Set_Message(G_APP_NAME,
4735 'OKC_VAR_DUP_TITLE_ORG',
4736 'VAR_CODE',
4737 vinf_variable_code_tbl(i),
4738 'LANG',
4739 vinf_language_tbl(i));
4740 l_return_status := G_RET_STS_ERROR;
4741 RAISE FND_API.G_EXC_ERROR;
4742 END IF;
4743 END IF;
4744 -- Logic to decide what to do in case of Action='S'
4745 -- If there is no existing variable in system then it is 'N' otherwise 'U'
4746
4747 IF vinf_action_tbl(i) = 'S' THEN
4748 IF vinf_existing_code_tbl(i) IS NULL THEN
4749 vinf_action_tbl(i) := 'N';
4750 ELSE
4751 vinf_action_tbl(i) := 'U';
4752 END IF;
4753 END IF;
4754
4755
4756 IF vinf_action_tbl(i) = 'N' THEN
4757
4758 --TRIM trailing space because
4759 vinf_variable_code_tbl(i) := RTRIM(vinf_variable_code_tbl(i));
4760
4761 ELSIF vinf_action_tbl(i) in ('U','D') THEN
4762
4763 IF vinf_existing_code_tbl(i) is NULL THEN
4764 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4765 p_msg_name => 'OKC_VAR_CODE_NOT_FOUND',
4766 p_token1 => 'VARIABLE_CODE',
4767 p_token1_value => vinf_variable_code_tbl(i));
4768 l_return_status := G_RET_STS_ERROR;
4769 RAISE FND_API.G_EXC_ERROR ;
4770 END IF;
4771
4772 ELSE
4773
4774 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4775 p_msg_name => 'OKC_VAR_INV_IMP_ACTION');
4776 l_return_status := G_RET_STS_ERROR;
4777 RAISE FND_API.G_EXC_ERROR ;
4778 END IF;
4779
4780 -----------------------------------------------------------
4781 -- Common validation or attribute settting
4782 -- regardless of status and import action
4783 -- this validation is not included in validate api
4784 -----------------------------------------------------------
4785 -- Get Value set id and Datatype from Value set name provided by the user
4786 OPEN get_valset_id_csr(vinf_value_set_name_tbl(i));
4787 FETCH get_valset_id_csr into l_value_set_id,l_variable_datatype;
4788 CLOSE get_valset_id_csr;
4789 IF l_value_set_id is null THEN
4790 IF p_validate_only = 'Y' THEN
4791 OPEN valset_exists_csr (vinf_value_set_name_tbl(i),
4792 vinf_batch_number_tbl(i));
4793 FETCH valset_exists_csr into l_vs_id;
4794 CLOSE valset_exists_csr;
4795 IF l_vs_id is null THEN
4796 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4797 p_msg_name => 'OKC_ART_VAL_SET_NOT_FOUND');
4798 l_return_status := G_RET_STS_ERROR;
4799 ELSE
4800 -- Reset Local Variables
4801 l_vs_id := NULL;
4802
4803 END IF;
4804 ELSE
4805 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4806 p_msg_name => 'OKC_ART_VAL_SET_NOT_FOUND');
4807 l_return_status := G_RET_STS_ERROR;
4808 END IF;
4809
4810 ELSE
4811 vinf_value_set_id_tbl(i) := l_value_set_id;
4812 vinf_variable_datatype_tbl(i) := l_variable_datatype;
4813 -- Reset Local Variables
4814 l_value_set_id := NULL;
4815 l_variable_datatype := NULL;
4816 END IF;
4817
4818
4819 -- Checking Date Published Validation
4820 IF vinf_existing_dpublished_tbl(i) >= vinf_date_published_tbl(i) THEN
4821 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4822 p_msg_name => 'OKC_INVALID_DATE_PUBLISHED');
4823 l_return_status := G_RET_STS_ERROR;
4824 END IF;
4825
4826 -- Checking Variable Flags
4827 IF nvl(vinf_disabled_yn_tbl(i), '*') not in ('Y','N') THEN
4828 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4829 p_msg_name => 'OKC_INVALID_DISABLED_FLAG');
4830 l_return_status := G_RET_STS_ERROR;
4831 END IF;
4832
4833 IF nvl(vinf_external_yn_tbl(i), '*') not in ('Y','N') THEN
4834 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4835 p_msg_name => 'OKC_INVALID_EXTERNAL_FLAG');
4836 l_return_status := G_RET_STS_ERROR;
4837 END IF;
4838
4839 IF nvl(vinf_contract_expert_yn_tbl(i), '*') not in ('Y','N') THEN
4840 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4841 p_msg_name => 'OKC_INVALID_CONTRACT_EXPERT_FLAG');
4842 l_return_status := G_RET_STS_ERROR;
4843 END IF;
4844
4845 IF nvl(vinf_variable_intent_tbl(i), '*') not in ('B','S') THEN
4846 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4847 p_msg_name => 'OKC_INVALID_INTENT_FLAG');
4848 l_return_status := G_RET_STS_ERROR;
4849 END IF;
4850
4851 IF nvl(vinf_variable_type_tbl(i), '*') <> 'U' THEN
4852 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4853 p_msg_name => 'OKC_INVALID_VARIABLE_TYPE');
4854 l_return_status := G_RET_STS_ERROR;
4855 END IF;
4856
4857 -- Checking Variable Type and Value set id
4858 IF nvl(vinf_variable_type_tbl(i), '*') = 'U' THEN
4859 IF vinf_value_set_name_tbl(i) is null THEN
4860 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4861 p_msg_name => 'OKC_VS_NOT_DEFINED');
4862 l_return_status := G_RET_STS_ERROR;
4863 END IF;
4864 END IF;
4865
4866
4867 IF nvl(vinf_contract_expert_yn_tbl(i), '*') not in ('Y','N') THEN
4868 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4869 p_msg_name => 'OKC_INVALID_CONTRACT_EXPERT_FLAG');
4870 l_return_status := G_RET_STS_ERROR;
4871 END IF;
4872
4873 -- Validate Contract Expert related data
4874
4875 IF ((vinf_xprt_value_set_name_tbl(i) is not null OR
4876 vinf_contract_expert_yn_tbl(i) = 'Y' ) AND
4877 vinf_variable_type_tbl(i) <> 'S')
4878 THEN
4879 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4880 p_msg_name => 'OKC_ART_VAR_INV_XPRT_DATA');
4881 l_return_status := G_RET_STS_ERROR;
4882 END IF;
4883
4884 IF ((vinf_xprt_value_set_name_tbl(i) is not null OR
4885 vinf_contract_expert_yn_tbl(i) = 'Y' ) AND
4886 vinf_variable_type_tbl(i) <> 'S')
4887 THEN
4888 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4889 p_msg_name => 'OKC_ART_VAR_INV_XPRT_DATA');
4890 l_return_status := G_RET_STS_ERROR;
4891 END IF;
4892
4893 IF ((vinf_variable_datatype_tbl(i) = 'D') AND
4894 ((vinf_contract_expert_yn_tbl(i) = 'Y' ) OR
4895 (vinf_xprt_value_set_name_tbl(i) <> 'S')))
4896 THEN
4897 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4898 p_msg_name => 'OKC_ART_VAR_INV_XPRT_DATA');
4899 l_return_status := G_RET_STS_ERROR;
4900 END IF;
4901
4902 IF ((vinf_variable_datatype_tbl(i) = 'V') AND
4903 (vinf_contract_expert_yn_tbl(i) = 'Y' ) AND
4904 (vinf_xprt_value_set_name_tbl(i) is null) )
4905 THEN
4906 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4907 p_msg_name => 'OKC_ART_VAR_INV_XPRT_DATA');
4908 l_return_status := G_RET_STS_ERROR;
4909 END IF;
4910
4911 IF ((vinf_contract_expert_yn_tbl(i) = 'N') AND
4912 (vinf_xprt_value_set_name_tbl(i) is not null) )
4913 THEN
4914 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4915 p_msg_name => 'OKC_ART_VAR_INV_XPRT_DATA');
4916 l_return_status := G_RET_STS_ERROR;
4917 END IF;
4918 -- Check for Valid External Flag
4919 IF ((vinf_variable_intent_tbl(i) = 'S') AND
4920 (vinf_external_yn_tbl(i) = 'Y') )
4921 THEN
4922 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4923 p_msg_name => 'OKC_ART_VAR_INVALID_EXTERNALYN',
4924 p_token1 => 'VAR_NAME',
4925 p_token1_value => vinf_variable_name_tbl(i));
4926 l_return_status := G_RET_STS_ERROR;
4927 END IF;
4928
4929 -- Validate "Language" is installed or not
4930 OPEN check_lang_csr(vinf_language_tbl(i));
4931 FETCH check_lang_csr into l_language;
4932 CLOSE check_lang_csr;
4933 --IF check_lang_csr%NOTFOUND THEN
4934 IF l_language <> '1' THEN
4935 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4936 p_msg_name => 'OKC_LANG_NOT_INSTALLED',
4937 p_token1 => 'LANGUAGE',
4938 p_token1_value => vinf_language_tbl(i));
4939 l_return_status := G_RET_STS_ERROR;
4940 ELSE
4941 l_language := '?';
4942 END IF;
4943
4944
4945 -- Validate attrs of the interface row
4946 IF vinf_action_tbl(i) = 'N' THEN
4947 -- Checking uniqueness of variable name and intent
4948 OPEN get_var_unq_csr(vinf_variable_name_tbl(i),
4949 vinf_variable_intent_tbl(i));
4950 FETCH get_var_unq_csr into l_dummy_unq;
4951 CLOSE get_var_unq_csr;
4952 IF l_dummy_unq = '1' THEN
4953 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4954 p_msg_name => 'OKC_ART_VAR_NAME_NOT_UNIQUE');
4955 l_return_status := G_RET_STS_ERROR;
4956 END IF;
4957
4958 -- Checking variable code is unique in the system
4959 OPEN get_var_info_csr(vinf_variable_code_tbl(i));
4960 FETCH get_var_info_csr into l_dummy;
4961 CLOSE get_var_info_csr;
4962 IF l_dummy = '1' THEN
4963 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4964 p_msg_name => 'OKC_ART_VAR_CODE_NOT_UNIQUE');
4965 l_return_status := G_RET_STS_ERROR;
4966 END IF;
4967
4968 ELSIF vinf_action_tbl(i) = 'U' THEN
4969 NULL;
4970 END IF;
4971
4972 ------------------------------------------------------------------------
4973 -- Now that we have validated and data is clean we can fetch sequences and ids
4974 -- for new variables for DML and also set the process status to Success
4975 -------------------------------------------------------------------------
4976
4977 -- Summarize report for this row
4978 -- Status 'F' is for internal use meaning parsing failure marked in
4979 -- java concurrent program
4980 IF (l_return_status = G_RET_STS_SUCCESS) THEN
4981 IF (nvl(vinf_process_status_tbl(i), 'E') = 'E') THEN
4982 vinf_process_status_tbl(i) := G_RET_STS_SUCCESS;
4983 ELSIF ( vinf_process_status_tbl(i) = 'F') THEN
4984 -- ##count parser failure as error
4985 --l_tot_rows_failed := l_tot_rows_failed+1;
4986 l_part_rows_failed := l_part_rows_failed+1;
4987 vinf_process_status_tbl(i) := G_RET_STS_ERROR;
4988 END IF;
4989 ELSIF (l_return_status = l_sts_warning) THEN
4990 IF (nvl(vinf_process_status_tbl(i),'E') = 'E') THEN
4991 vinf_process_status_tbl(i) := l_sts_warning;
4992 --##count
4993 --l_tot_rows_warned := l_tot_rows_warned+1;
4994 l_part_rows_warned := l_part_rows_warned+1;
4995 ELSIF (vinf_process_status_tbl(i) = 'F') THEN
4996 -- ##count parser failure as error
4997 --l_tot_rows_failed := l_tot_rows_failed+1;
4998 l_part_rows_failed := l_part_rows_failed+1;
4999 vinf_process_status_tbl(i) := G_RET_STS_ERROR;
5000 END IF;
5001 ELSIF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
5002 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5003 ELSIF (l_return_status = G_RET_STS_ERROR) THEN
5004 RAISE FND_API.G_EXC_ERROR;
5005 END IF;
5006
5007 -------------------------
5008 -------------------------
5009 -- Exception Block for each iteration in Loop
5010 -- validation and unexpected errors
5011 -- In case of unexpected error, escape the loop
5012 -------------------------
5013 -------------------------
5014
5015
5016 EXCEPTION
5017 WHEN FND_API.G_EXC_ERROR THEN
5018 IF (l_debug = 'Y') THEN
5019 okc_debug.log('300: In Variables_Import: OKC_API.G_EXCEPTION_ERROR Exception', 2);
5020 END IF;
5021 --l_return_status := G_RET_STS_ERROR ;
5022 build_error_array(
5023 p_msg_data => x_msg_data,
5024 p_context => l_context,
5025 p_batch_process_id => l_batch_process_id,
5026 p_interface_id => vinf_interface_id_tbl(i),
5027 p_article_title => vinf_variable_code_tbl(i),
5028 p_error_type => G_RET_STS_ERROR,
5029 p_entity => 'VARIABLE'
5030 );
5031 vinf_process_status_tbl(i) := G_RET_STS_ERROR;
5032 --##count
5033 --l_tot_rows_failed := l_tot_rows_failed+1;
5034 l_part_rows_failed := l_part_rows_failed+1;
5035 -- Continue to next row
5036
5037 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5038 IF (l_debug = 'Y') THEN
5039 okc_debug.log('400: Leaving Variables_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
5040 END IF;
5041
5042 IF l_var_interface_csr%ISOPEN THEN
5043 CLOSE l_var_interface_csr;
5044 END IF;
5045
5046 --Set_Message
5047 l_return_status := G_RET_STS_UNEXP_ERROR ;
5048 x_return_status := G_RET_STS_UNEXP_ERROR ;
5049
5050 build_error_array(
5051 p_msg_data => x_msg_data,
5052 p_context => l_context,
5053 p_batch_process_id => l_batch_process_id,
5054 p_interface_id => vinf_interface_id_tbl(i),
5055 p_article_title => vinf_variable_code_tbl(i),
5056 p_error_type => G_RET_STS_UNEXP_ERROR,
5057 p_entity => 'VARIABLE'
5058 );
5059 vinf_process_status_tbl(i) := G_RET_STS_ERROR;
5060 --##count
5061 --l_tot_rows_failed := l_tot_rows_failed+1;
5062 l_part_rows_failed := l_part_rows_failed+1;
5063 exit; -- exit the current fetch
5064
5065 WHEN OTHERS THEN
5066 IF (l_debug = 'Y') THEN
5067 okc_debug.log('500: Leaving Variables_Import because of EXCEPTION: '||sqlerrm, 2);
5068 END IF;
5069
5070 IF l_var_interface_csr%ISOPEN THEN
5071 CLOSE l_var_interface_csr;
5072 END IF;
5073
5074 l_return_status := G_RET_STS_UNEXP_ERROR ;
5075 x_return_status := G_RET_STS_UNEXP_ERROR ;
5076
5077 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
5078 p_msg_name => G_UNEXPECTED_ERROR,
5079 p_token1 => G_SQLCODE_TOKEN,
5080 p_token1_value => sqlcode,
5081 p_token2 => G_SQLERRM_TOKEN,
5082 p_token2_value => sqlerrm);
5083
5084 build_error_array(
5085 p_msg_data => G_UNEXPECTED_ERROR,
5086 p_context => l_context,
5087 p_batch_process_id => l_batch_process_id,
5088 p_interface_id => vinf_interface_id_tbl(i),
5089 p_article_title => vinf_variable_code_tbl(i),
5090 p_error_type => G_RET_STS_ERROR,
5091 p_entity => 'VARIABLE'
5092 );
5093 vinf_process_status_tbl(i) := G_RET_STS_ERROR;
5094 --##count
5095 --l_tot_rows_failed := l_tot_rows_failed+1;
5096 l_part_rows_failed := l_part_rows_failed+1;
5097 exit; -- exit the current fetch
5098 END;
5099 -------------------------
5100 -------------------------
5101 -- Exception Block for each iteration in Loop ends
5102 -------------------------
5103 -------------------------
5104
5105
5106 END LOOP; -- end of FOR i in inf_interface_id_tbl.FIRST ..
5107 ------------------------------------------------------------------------
5108 -------------- End of Inner Loop thru fetched row for---------------------
5109 -- validation,
5110 -------------------------------------------------------------------------
5111 -- In order to propagate Unexpected error raise it if it is 'U'
5112 IF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
5113 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
5114 END IF;
5115
5116 -------------------------
5117 -------------------------
5118 -- Exception Block for Inner Loop starts
5119 -- Handles unexpected errors as last step
5120 -------------------------
5121 -------------------------
5122 EXCEPTION
5123 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5124 IF (l_debug = 'Y') THEN
5125 okc_debug.log('400: Leaving Variables_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
5126 END IF;
5127
5128 IF l_var_interface_csr%ISOPEN THEN
5129 CLOSE l_var_interface_csr;
5130 END IF;
5131 l_return_status := G_RET_STS_UNEXP_ERROR ;
5132 x_return_status := G_RET_STS_UNEXP_ERROR ;
5133 exit; -- exit outermost loop
5134
5135 WHEN OTHERS THEN
5136 IF (l_debug = 'Y') THEN
5137 okc_debug.log('500: Leaving Variables_Import because of EXCEPTION: '||sqlerrm, 2);
5138 END IF;
5139
5140 IF l_var_interface_csr%ISOPEN THEN
5141 CLOSE l_var_interface_csr;
5142 END IF;
5143 l_return_status := G_RET_STS_UNEXP_ERROR ;
5144 x_return_status := G_RET_STS_UNEXP_ERROR ;
5145 exit; -- exit outermost loop
5146 END;
5147
5148 -------------------------
5149 -------------------------
5150 -- Exception Block for Each Iteration of outermost Loop ends
5151 -------------------------
5152 -------------------------
5153
5154 ------------------------------------------------------------------------
5155 --------------------- Start Do_DML for Variables ---------------
5156 -- Insert or Update Variable
5157 -------------------------------------------------------------------------
5158 -- initialize l_return_status to track status of DML execution
5159 l_return_status := G_RET_STS_SUCCESS;
5160
5161
5162 IF p_validate_only = 'N' THEN
5163 BEGIN
5164 SAVEPOINT bulkdml;
5165
5166 i := 0;
5167 -- Bulk insert New Valid Records
5168 BEGIN
5169 l_context := 'INSERTING NEW VARIABLE INTO B TABLE';
5170
5171 FORALL i in vinf_interface_id_tbl.FIRST ..vinf_interface_id_tbl.LAST
5172 INSERT INTO OKC_BUS_VARIABLES_B(
5173 VARIABLE_CODE,
5174 OBJECT_VERSION_NUMBER,
5175 VARIABLE_TYPE,
5176 EXTERNAL_YN,
5177 VARIABLE_INTENT,
5178 CONTRACT_EXPERT_YN,
5179 DISABLED_YN,
5180 VARIABLE_DATATYPE,
5181 APPLICATION_ID,
5182 VALUE_SET_ID,
5183 VARIABLE_DEFAULT_VALUE,
5184 XPRT_VALUE_SET_NAME,
5185 DATE_PUBLISHED,
5186 ORIG_SYSTEM_REFERENCE_CODE,
5187 ORIG_SYSTEM_REFERENCE_ID1,
5188 ORIG_SYSTEM_REFERENCE_ID2,
5189 -- PROGRAM_ID,
5190 -- PROGRAM_LOGIN_ID,
5191 -- PROGRAM_APPLICATION_ID,
5192 -- REQUEST_ID,
5193 ATTRIBUTE_CATEGORY,
5194 ATTRIBUTE1,
5195 ATTRIBUTE2,
5196 ATTRIBUTE3,
5197 ATTRIBUTE4,
5198 ATTRIBUTE5,
5199 ATTRIBUTE6,
5200 ATTRIBUTE7,
5201 ATTRIBUTE8,
5202 ATTRIBUTE9,
5203 ATTRIBUTE10,
5204 ATTRIBUTE11,
5205 ATTRIBUTE12,
5206 ATTRIBUTE13,
5207 ATTRIBUTE14,
5208 ATTRIBUTE15,
5209 CREATED_BY,
5210 CREATION_DATE,
5211 LAST_UPDATED_BY,
5212 LAST_UPDATE_LOGIN,
5213 LAST_UPDATE_DATE)
5214 SELECT
5215 vinf_variable_code_tbl(i),
5216 1.0,
5217 vinf_variable_type_tbl(i),
5218 vinf_external_yn_tbl(i),
5219 vinf_variable_intent_tbl(i),
5220 vinf_contract_expert_yn_tbl(i),
5221 vinf_disabled_yn_tbl(i),
5222 vinf_variable_datatype_tbl(i),
5223 vinf_application_id_tbl(i),
5224 vinf_value_set_id_tbl(i),
5225 vinf_var_default_value_tbl(i),
5226 vinf_xprt_value_set_name_tbl(i),
5227 vinf_date_published_tbl(i),
5228 vinf_system_reference_code_tbl(i),
5229 vinf_system_reference_id1_tbl(i),
5230 vinf_system_reference_id2_tbl(i),
5231 -- l_program_id,
5232 -- l_program_login_id,
5233 -- l_program_appl_id,
5234 -- l_request_id,
5235 vinf_attribute_category_tbl(i),
5236 vinf_attribute1_tbl(i),
5237 vinf_attribute2_tbl(i),
5238 vinf_attribute3_tbl(i),
5239 vinf_attribute4_tbl(i),
5240 vinf_attribute5_tbl(i),
5241 vinf_attribute6_tbl(i),
5242 vinf_attribute7_tbl(i),
5243 vinf_attribute8_tbl(i),
5244 vinf_attribute9_tbl(i),
5245 vinf_attribute10_tbl(i),
5246 vinf_attribute11_tbl(i),
5247 vinf_attribute12_tbl(i),
5248 vinf_attribute13_tbl(i),
5249 vinf_attribute14_tbl(i),
5250 vinf_attribute15_tbl(i),
5251 l_user_id,
5252 sysdate,
5253 l_user_id,
5254 l_login_id,
5255 sysdate
5256 FROM DUAL
5257 WHERE vinf_action_tbl(i) = 'N' and
5258 vinf_process_status_tbl(i) in ('S', 'W') and
5259 vinf_language_tbl(i) = USERENV('LANG');
5260
5261 -- Using a " select from dual" aproach as above prevents creation of
5262 -- additional PL/SQL tables for bulk insert of
5263 -- variables if we were to use a FORALL INSERT INTO .... VALUES .... approach.
5264 -- We cannot use FORALL INSERT INTO .... VALUES ....using
5265 -- the existing inf*tbl since the error rows need to be
5266 -- filtered out.
5267
5268 EXCEPTION
5269 WHEN OTHERS THEN
5270 IF (l_debug = 'Y') THEN
5271 okc_debug.log('500: Leaving Variables_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
5272 END IF;
5273 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
5274 END;
5275
5276 --
5277 -- End of Insert into OKC_BUS_VARIABLES_B
5278 --
5279 --
5280
5281 i := 0;
5282 BEGIN
5283 l_context := 'INSERTING VARIABLE INTO TL TABLE';
5284
5285 FORALL i in vinf_interface_id_tbl.FIRST ..vinf_interface_id_tbl.LAST
5286 INSERT INTO OKC_BUS_VARIABLES_TL(
5287 VARIABLE_CODE,
5288 VARIABLE_NAME,
5289 LANGUAGE,
5290 SOURCE_LANG,
5291 DESCRIPTION,
5292 CREATED_BY,
5293 CREATION_DATE,
5294 LAST_UPDATED_BY,
5295 LAST_UPDATE_LOGIN,
5296 LAST_UPDATE_DATE)
5297 SELECT
5298 vinf_variable_code_tbl(i),
5299 vinf_variable_name_tbl(i),
5300 vinf_language_tbl(i),
5301 userenv('LANG'),
5302 vinf_description_tbl(i),
5303 l_user_id,
5304 sysdate,
5305 l_user_id,
5306 l_login_id,
5307 sysdate
5308 FROM OKC_BUS_VARIABLES_B
5309 WHERE vinf_action_tbl(i) IN ('N')
5310 AND vinf_process_status_tbl(i) in ('S', 'W')
5311 AND variable_code = vinf_variable_code_tbl(i);
5312
5313 EXCEPTION
5314 WHEN OTHERS THEN
5315 IF (l_debug = 'Y') THEN
5316 okc_debug.log('500: Leaving Variables_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
5317 END IF;
5318 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
5319 END;
5320
5321 --
5322 -- End of Insert into OKC_BUS_VARIABLES_TL
5323 --
5324 --
5325
5326 i := 0;
5327 BEGIN
5328 l_context := 'UPDATING DATE_PUBLISHED FOR ACTION U';
5329
5330 FORALL i in vinf_interface_id_tbl.FIRST ..vinf_interface_id_tbl.LAST
5331 UPDATE OKC_BUS_VARIABLES_B
5332 SET DATE_PUBLISHED = vinf_date_published_tbl(i),
5333 LAST_UPDATED_BY = l_user_id,
5334 LAST_UPDATE_LOGIN = l_login_id,
5335 LAST_UPDATE_DATE = SYSDATE
5336 WHERE vinf_action_tbl(i) = ('U')
5337 AND vinf_process_status_tbl(i) in ('S','W')
5338 AND variable_code = vinf_variable_code_tbl(i)
5339 AND vinf_existing_language_tbl(i) IS NOT NULL;
5340 EXCEPTION
5341 WHEN OTHERS THEN
5342 IF (l_debug = 'Y') THEN
5343 okc_debug.log('500: Leaving Variables_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
5344 END IF;
5345 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
5346 END;
5347
5348 --
5349 -- End of Update OKC_BUS_VARIABLES_B
5350 --
5351 --
5352 i := 0;
5353 BEGIN
5354 l_context := 'UPDATING DESCRIPTION FOR ACTION U';
5355
5356 FORALL i in vinf_interface_id_tbl.FIRST ..vinf_interface_id_tbl.LAST
5357 UPDATE OKC_BUS_VARIABLES_TL
5358 SET DESCRIPTION = vinf_description_tbl(i),
5359 --PROGRAM_ID = l_program_id,
5360 --REQUEST_ID = l_request_id,
5361 --PROGRAM_LOGIN_ID = l_program_login_id,
5362 --PROGRAM_APPLICATION_ID = l_program_appl_id,
5363 LAST_UPDATED_BY = l_user_id,
5364 LAST_UPDATE_LOGIN = l_login_id,
5365 LAST_UPDATE_DATE = SYSDATE
5366 WHERE vinf_action_tbl(i) = ('U')
5367 AND vinf_process_status_tbl(i) in ('S','W')
5368 AND variable_code = vinf_variable_code_tbl(i)
5369 AND vinf_existing_language_tbl(i) IS NOT NULL;
5370 EXCEPTION
5371 WHEN OTHERS THEN
5372 IF (l_debug = 'Y') THEN
5373 okc_debug.log('500: Leaving Variables_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
5374 END IF;
5375 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
5376 END;
5377
5378 --
5379 -- End of Update OKC_BUS_VARIABLES_TL
5380 --
5381 --
5382
5383 i := 0;
5384 BEGIN
5385 l_context := 'INSERTING VARIABLE INTO TL TABLE FOR ACTION U';
5386
5387 FORALL i in vinf_interface_id_tbl.FIRST ..vinf_interface_id_tbl.LAST
5388 INSERT INTO OKC_BUS_VARIABLES_TL(
5389 VARIABLE_CODE,
5390 VARIABLE_NAME,
5391 LANGUAGE,
5392 SOURCE_LANG,
5393 DESCRIPTION,
5394 CREATED_BY,
5395 CREATION_DATE,
5396 LAST_UPDATED_BY,
5397 LAST_UPDATE_LOGIN,
5398 LAST_UPDATE_DATE)
5399 SELECT
5400 vinf_variable_code_tbl(i),
5401 vinf_variable_name_tbl(i),
5402 vinf_language_tbl(i),
5403 userenv('LANG'),
5404 vinf_description_tbl(i),
5405 l_user_id,
5406 sysdate,
5407 l_user_id,
5408 l_login_id,
5409 sysdate
5410 FROM OKC_BUS_VARIABLES_B
5411 WHERE vinf_action_tbl(i) = ('U')
5412 AND vinf_process_status_tbl(i) in ('S', 'W')
5413 AND variable_code = vinf_variable_code_tbl(i)
5414 AND vinf_existing_language_tbl(i) IS NULL;
5415
5416 EXCEPTION
5417 WHEN OTHERS THEN
5418 IF (l_debug = 'Y') THEN
5419 okc_debug.log('500: Leaving Variables_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
5420 END IF;
5421 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
5422 END;
5423
5424 --
5425 -- End of Insert into OKC_BUS_VARIABLES_TL for Action U
5426 --
5427 --
5428
5429 i := 0;
5430 BEGIN
5431 l_context := 'DISABLING VARIABLE FOR ACTION D';
5432
5433 FORALL i in vinf_interface_id_tbl.FIRST ..vinf_interface_id_tbl.LAST
5434 UPDATE OKC_BUS_VARIABLES_B
5435 SET DISABLED_YN = vinf_disabled_yn_tbl(i),
5436 --PROGRAM_ID = l_program_id,
5437 --REQUEST_ID = l_request_id,
5438 --PROGRAM_LOGIN_ID = l_program_login_id,
5439 --PROGRAM_APPLICATION_ID = l_program_appl_id,
5440 LAST_UPDATED_BY = l_user_id,
5441 LAST_UPDATE_LOGIN = l_login_id,
5442 LAST_UPDATE_DATE = SYSDATE
5443 WHERE vinf_action_tbl(i) = ('D')
5444 AND vinf_process_status_tbl(i) in ('S','W')
5445 AND variable_code = vinf_variable_code_tbl(i);
5446 EXCEPTION
5447 WHEN OTHERS THEN
5448 IF (l_debug = 'Y') THEN
5449 okc_debug.log('500: Leaving Variables_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
5450 END IF;
5451 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
5452 END;
5453
5454 --
5455 -- End of Update OKC_BUS_VARIABLES_TL for Disable
5456 --
5457 --
5458
5459
5460 -- Exception for bulk DML block
5461 EXCEPTION
5462 WHEN OTHERS THEN
5463 l_bulk_failed := 'Y'; -- indicating that bulk operation has failed
5464 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
5465 p_msg_name => G_UNEXPECTED_ERROR,
5466 p_token1 => G_SQLCODE_TOKEN,
5467 p_token1_value => sqlcode,
5468 p_token2 => G_SQLERRM_TOKEN,
5469 p_token2_value => sqlerrm);
5470 Okc_API.Set_Message(p_app_name => G_APP_NAME,
5471 p_msg_name => 'OKC_ART_FETCH_FAILED',
5472 p_token1 => 'CONTEXT',
5473 p_token1_value => l_context);
5474
5475 build_error_array(
5476 p_msg_data => null,
5477 p_context => l_context,
5478 p_batch_process_id => l_batch_process_id,
5479 p_interface_id => -99,
5480 p_article_title => NULL,
5481 p_error_type => G_RET_STS_ERROR,
5482 p_entity => 'VARIABLE'
5483 );
5484 l_return_status := G_RET_STS_UNEXP_ERROR;
5485 x_return_status := G_RET_STS_UNEXP_ERROR;
5486
5487 --##count:rollback the count
5488 l_part_rows_failed := l_part_rows_processed;
5489 l_part_rows_warned := 0;
5490
5491 ROLLBACK TO SAVEPOINT bulkdml;
5492 exit; -- exit outermost loop
5493 END;
5494
5495 END IF; --- validate_only = 'N'
5496
5497 ------------------------------------------------------------------------
5498 --------------------- End of Do_DML for Variables ---------------
5499 -------------------------------------------------------------------------
5500
5501 ------------------------------------------------------------------------
5502 --------------- Start of Do_DML for import related tables ------------
5503 -- Update interface table
5504 -- Insert Errors into Error table
5505 -------------------------------------------------------------------------
5506 -- Update Interface Table
5507 i:=0;
5508 BEGIN
5509 l_context := 'UPDATING VARIABLES INTERFACE TABLE';
5510 FORALL i in vinf_interface_id_tbl.FIRST..vinf_interface_id_tbl.LAST
5511 UPDATE OKC_VARIABLES_INTERFACE
5512 SET
5513 -- We don't want to update process_status to 'S' or 'W' in validation_mode
5514 -- because it is not going to be picked up in next run if we do so
5515 PROCESS_STATUS = decode(p_validate_only||vinf_process_status_tbl(i)||l_bulk_failed,
5516 'NEN','E',
5517 'NSN','S',
5518 'NWN','W',
5519 'NEY','E',
5520 'NSY',NULL,
5521 'NWY',NULL,
5522 'YEY','E',
5523 'YEN','E',
5524 'NFY','E',
5525 'YFY','E',
5526 'NFN','E',
5527 'YFN','E',NULL),
5528 PROGRAM_ID = l_program_id,
5529 REQUEST_ID = l_request_id,
5530 PROGRAM_LOGIN_ID = l_program_login_id,
5531 PROGRAM_APPLICATION_ID = l_program_appl_id,
5532 OBJECT_VERSION_NUMBER = vinf_object_version_number_tbl(i) + 1,
5533 LAST_UPDATED_BY = l_user_id,
5534 LAST_UPDATE_LOGIN = l_login_id,
5535 LAST_UPDATE_DATE = SYSDATE
5536 WHERE
5537 interface_id = vinf_interface_id_tbl(i);
5538 EXCEPTION
5539 WHEN OTHERS THEN
5540 IF (l_debug = 'Y') THEN
5541 okc_debug.log('500: Leaving Variables_Import because of EXCEPTION: '||sqlerrm, 2);
5542 END IF;
5543 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
5544 p_msg_name => G_UNEXPECTED_ERROR,
5545 p_token1 => G_SQLCODE_TOKEN,
5546 p_token1_value => sqlcode,
5547 p_token2 => G_SQLERRM_TOKEN,
5548 p_token2_value => sqlerrm);
5549 Okc_API.Set_Message(p_app_name => G_APP_NAME,
5550 p_msg_name => 'OKC_VAR_INT_UPDATE_FAILED');
5551 build_error_array(
5552 p_msg_data => null,
5553 p_context => l_context,
5554 p_batch_process_id => l_batch_process_id,
5555 p_interface_id => -99,
5556 p_article_title => NULL,
5557 p_error_type => G_RET_STS_ERROR,
5558 p_entity => 'VARIABLE'
5559 );
5560
5561 l_return_status := G_RET_STS_UNEXP_ERROR ;
5562 x_return_status := G_RET_STS_UNEXP_ERROR ;
5563 --##count:rollback the count
5564 l_part_rows_failed := l_part_rows_processed;
5565 l_part_rows_warned := 0;
5566
5567 --RAISE FND_API.G_EXC_ERROR ;
5568 END;
5569 --
5570 -- End of Update OKC_VARIABLES_INTERFACE
5571 --
5572 --
5573
5574 --
5575 --Insert Errors into Error table for this fetch
5576 --
5577
5578 insert_error_array(
5579 x_return_status => x_return_status,
5580 x_msg_count => x_msg_count,
5581 x_msg_data => x_msg_data
5582 );
5583
5584
5585 IF (x_return_status = l_insert_errors_error) THEN
5586 NULL;
5587 -- Ignore
5588 -- RAISE l_insert_errors_exception;
5589 END IF;
5590
5591 ------------------------------------------------------------------------
5592 --------------- End of Do_DML for import related tables ------------
5593 -------------------------------------------------------------------------
5594 commit;
5595
5596 -- Now delete cache for next bulk fetch
5597
5598 vinf_interface_id_tbl.DELETE;
5599 vinf_batch_number_tbl.DELETE;
5600 vinf_object_version_number_tbl.DELETE;
5601 vinf_variable_code_tbl.DELETE;
5602 vinf_variable_name_tbl.DELETE;
5603 vinf_process_status_tbl.DELETE;
5604 vinf_action_tbl.DELETE;
5605 vinf_language_tbl.DELETE;
5606 vinf_description_tbl.DELETE;
5607 vinf_variable_type_tbl.DELETE;
5608 vinf_variable_intent_tbl.DELETE;
5609 vinf_contract_expert_yn_tbl.DELETE;
5610 vinf_xprt_value_set_name_tbl.DELETE;
5611 vinf_disabled_yn_tbl.DELETE;
5612 vinf_external_yn_tbl.DELETE;
5613 vinf_variable_datatype_tbl.DELETE;
5614 vinf_application_id_tbl.DELETE;
5615 vinf_value_set_name_tbl.DELETE;
5616 vinf_var_default_value_tbl.DELETE;
5617 vinf_system_reference_code_tbl.DELETE;
5618 vinf_system_reference_id1_tbl.DELETE;
5619 vinf_system_reference_id2_tbl.DELETE;
5620 vinf_date_published_tbl.DELETE;
5621 vinf_attribute_category_tbl.DELETE;
5622 vinf_attribute1_tbl.DELETE;
5623 vinf_attribute2_tbl.DELETE;
5624 vinf_attribute3_tbl.DELETE;
5625 vinf_attribute4_tbl.DELETE;
5626 vinf_attribute5_tbl.DELETE;
5627 vinf_attribute6_tbl.DELETE;
5628 vinf_attribute7_tbl.DELETE;
5629 vinf_attribute8_tbl.DELETE;
5630 vinf_attribute9_tbl.DELETE;
5631 vinf_attribute10_tbl.DELETE;
5632 vinf_attribute11_tbl.DELETE;
5633 vinf_attribute12_tbl.DELETE;
5634 vinf_attribute13_tbl.DELETE;
5635 vinf_attribute14_tbl.DELETE;
5636 vinf_attribute15_tbl.DELETE;
5637
5638 vinf_value_set_id_tbl.DELETE;
5639 vinf_existing_code_tbl.DELETE;
5640 vinf_existing_dpublished_tbl.DELETE;
5641 vinf_existing_language_tbl.DELETE;
5642
5643 err_batch_process_id_tbl.DELETE;
5644 err_article_title_tbl.DELETE;
5645 err_interface_id_tbl.DELETE;
5646 err_error_number_tbl.DELETE;
5647 err_object_version_number_tbl.DELETE;
5648 err_error_type_tbl.DELETE;
5649 err_entity_tbl.DELETE;
5650 err_error_description_tbl.DELETE;
5651
5652 EXIT WHEN l_var_interface_csr%NOTFOUND;
5653 END LOOP;
5654
5655
5656 -----------------------------------------------------------------------
5657 -- End of outermost loop for bulk fetch
5658 -----------------------------------------------------------------------
5659
5660 IF l_var_interface_csr%ISOPEN THEN
5661 CLOSE l_var_interface_csr;
5662 END IF;
5663
5664 -- Insert records into OKC_BUS_VARIABLES_TL for missing languages
5665 IF p_validate_only = 'N' THEN
5666 BEGIN
5667 SAVEPOINT bulklanginsert;
5668 IF (l_debug = 'Y') THEN
5669 okc_debug.log('1000: Entering Insert Missing Lang Records', 2);
5670 END IF;
5671
5672 INSERT INTO OKC_BUS_VARIABLES_TL (
5673 VARIABLE_CODE,
5674 VARIABLE_NAME,
5675 DESCRIPTION,
5676 CREATED_BY,
5677 CREATION_DATE,
5678 LAST_UPDATE_DATE,
5679 LAST_UPDATED_BY,
5680 LAST_UPDATE_LOGIN,
5681 LANGUAGE,
5682 SOURCE_LANG
5683 )
5684 SELECT
5685 VART.VARIABLE_CODE,
5686 VART.VARIABLE_NAME,
5687 VART.DESCRIPTION,
5688 l_user_id,
5689 sysdate,
5690 sysdate,
5691 l_user_id,
5692 l_login_id,
5693 LANG.LANGUAGE_CODE,
5694 VART.SOURCE_LANG
5695 FROM OKC_BUS_VARIABLES_TL VART,
5696 FND_LANGUAGES LANG,
5697 OKC_VARIABLES_INTERFACE VARI
5698 WHERE LANG.INSTALLED_FLAG IN ('I', 'B')
5699 AND VART.VARIABLE_CODE = RTRIM(VARI.VARIABLE_CODE)
5700 AND NVL(VARI.PROCESS_STATUS,'*') = 'S'
5701 AND VARI.BATCH_NUMBER = p_batch_number
5702 AND VARI.ACTION <> 'D'
5703 AND NOT EXISTS
5704 (SELECT NULL
5705 FROM OKC_BUS_VARIABLES_TL VART1
5706 WHERE VART1.VARIABLE_CODE = VART.VARIABLE_CODE
5707 AND VART1.LANGUAGE = LANG.LANGUAGE_CODE)
5708 AND VART.ROWID = (SELECT MIN(VART2.ROWID)
5709 FROM OKC_BUS_VARIABLES_TL VART2
5710 WHERE VART2.VARIABLE_CODE = VART.VARIABLE_CODE)
5711 AND VARI.ROWID = (SELECT MIN(VARI1.ROWID)
5712 FROM OKC_VARIABLES_INTERFACE VARI1
5713 WHERE RTRIM(VARI1.VARIABLE_CODE) = RTRIM(VARI.VARIABLE_CODE)
5714 AND VARI1.ACTION <> 'D'
5715 AND VARI1.BATCH_NUMBER = VARI.BATCH_NUMBER
5716 AND NVL(VARI1.PROCESS_STATUS,'*') = 'S');
5717 COMMIT;
5718
5719 IF (l_debug = 'Y') THEN
5720 okc_debug.log('1100: Leaving Insert Missing Lang Records', 2);
5721 END IF;
5722
5723 EXCEPTION
5724 WHEN OTHERS THEN
5725 IF (l_debug = 'Y') THEN
5726 okc_debug.log('1200: Leaving Missing langauge Insert because of EXCEPTION: '||l_context||sqlerrm, 2);
5727 END IF;
5728 ROLLBACK TO SAVEPOINT bulklanginsert;
5729 END;
5730
5731 END IF; --p_validate_only = 'N' THEN
5732
5733 --##count:add up last processed counts
5734 l_tot_rows_processed := l_tot_rows_processed + l_part_rows_processed;
5735 l_tot_rows_failed := l_tot_rows_failed + l_part_rows_failed;
5736 l_tot_rows_warned := l_tot_rows_warned + l_part_rows_warned;
5737
5738 --Update Batch Process Table as a last step
5739 UPDATE OKC_ART_INT_BATPROCS_ALL
5740 SET
5741 TOTAL_ROWS_PROCESSED = l_tot_rows_processed,
5742 TOTAL_ROWS_FAILED = l_tot_rows_failed,
5743 TOTAL_ROWS_WARNED = l_tot_rows_warned,
5744 END_DATE = SYSDATE,
5745 PROGRAM_ID = l_program_id,
5746 REQUEST_ID = l_request_id,
5747 PROGRAM_LOGIN_ID = l_program_login_id,
5748 PROGRAM_APPLICATION_ID = l_program_appl_id,
5749 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
5750 LAST_UPDATED_BY = l_user_id,
5751 LAST_UPDATE_LOGIN = l_login_id,
5752 LAST_UPDATE_DATE = SYSDATE
5753 WHERE
5754 BATCH_PROCESS_ID = l_batch_process_id
5755 AND ENTITY = 'Variable';
5756
5757 IF err_error_number_tbl.COUNT > 0 THEN
5758 insert_error_array(
5759 x_return_status => x_return_status,
5760 x_msg_count => x_msg_count,
5761 x_msg_data => x_msg_data
5762 );
5763 END IF;
5764
5765 -- Print statistic of this run in the log
5766 -- Commented for new XML Based Import - Moved to new_wrap_up in conc_import_articles
5767 --wrap_up(p_validate_only,p_batch_number,l_tot_rows_processed,l_tot_rows_failed,l_tot_rows_warned,l_batch_process_id,'VARIABLE');
5768 commit; -- Final commit for status update
5769
5770 IF (l_debug = 'Y') THEN
5771 okc_debug.log('2000: Leaving variables import', 2);
5772 END IF;
5773 --x_return_status := l_return_status; this may cause to erase error x_return_status
5774
5775 EXCEPTION
5776
5777 WHEN FND_API.G_EXC_ERROR THEN
5778 IF (l_debug = 'Y') THEN
5779 okc_debug.log('3000: Leaving Variables_Import: OKC_API.G_EXCEPTION_ERROR Exception', 2);
5780 END IF;
5781 --Insert Errors into Error table if there is any
5782 insert_error_array(
5783 x_return_status => x_return_status,
5784 x_msg_count => x_msg_count,
5785 x_msg_data => x_msg_data
5786 );
5787 x_return_status := G_RET_STS_ERROR ;
5788
5789 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5790 IF (l_debug = 'Y') THEN
5791 okc_debug.log('4000: Leaving Variables_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
5792 END IF;
5793 --Insert Errors into Error table if there is any
5794
5795 insert_error_array(
5796 x_return_status => x_return_status,
5797 x_msg_count => x_msg_count,
5798 x_msg_data => x_msg_data
5799 );
5800 commit;
5801
5802 IF l_var_interface_csr%ISOPEN THEN
5803 CLOSE l_var_interface_csr;
5804 END IF;
5805
5806 x_return_status := G_RET_STS_UNEXP_ERROR ;
5807 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
5808 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
5809 END IF;
5810 get_print_msgs_stack(p_msg_data => x_msg_data);
5811
5812 WHEN l_insert_errors_exception THEN
5813 --
5814 -- In this exception handling, we don't insert error array again
5815 -- because error happend in the module
5816 --
5817 IF (l_debug = 'Y') THEN
5818 okc_debug.log('5000: Leaving Variables_Import because of EXCEPTION in insert_error_array: '||sqlerrm, 2);
5819 END IF;
5820
5821 IF l_var_interface_csr%ISOPEN THEN
5822 CLOSE l_var_interface_csr;
5823 END IF;
5824
5825
5826 --x_return_status := G_RET_STS_UNEXP_ERROR ;
5827 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
5828 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
5829 END IF;
5830 get_print_msgs_stack(p_msg_data => x_msg_data);
5831 commit;
5832
5833 WHEN OTHERS THEN
5834 IF (l_debug = 'Y') THEN
5835 okc_debug.log('5000: Leaving Variables_Import because of EXCEPTION: '||sqlerrm, 2);
5836 END IF;
5837 --Insert Errors into Error table if there is any
5838 insert_error_array(
5839 x_return_status => x_return_status,
5840 x_msg_count => x_msg_count,
5841 x_msg_data => x_msg_data
5842 );
5843 commit;
5844 --
5845 IF l_var_interface_csr%ISOPEN THEN
5846 CLOSE l_var_interface_csr;
5847 END IF;
5848
5849 x_return_status := G_RET_STS_UNEXP_ERROR ;
5850 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
5851 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
5852 END IF;
5853 get_print_msgs_stack(p_msg_data => x_msg_data);
5854 END import_variables;
5855
5856 PROCEDURE import_relationships(
5857 x_return_status OUT NOCOPY VARCHAR2,
5858 x_msg_count OUT NOCOPY NUMBER,
5859 x_msg_data OUT NOCOPY VARCHAR2,
5860
5861 p_batch_procs_id IN NUMBER,
5862 p_batch_number IN VARCHAR2,
5863 p_validate_only IN VARCHAR2 := 'Y',
5864 p_fetchsize IN NUMBER := 100,
5865 p_rows_processed OUT NOCOPY NUMBER,
5866 p_rows_failed OUT NOCOPY NUMBER,
5867 p_rows_warned OUT NOCOPY NUMBER
5868 ) IS
5869 l_api_version CONSTANT NUMBER := 1;
5870 l_api_name CONSTANT VARCHAR2(30) := 'import_relationships';
5871 l_sts_warning CONSTANT VARCHAR2(1) := 'W';
5872 l_row_notfound BOOLEAN := FALSE;
5873 l_user_id NUMBER;
5874 l_login_id NUMBER;
5875 l_insert_errors_exception EXCEPTION;
5876 l_insert_errors_error CONSTANT VARCHAR2(1) := 'X';
5877
5878 CURSOR l_rel_interface_csr ( cp_local_org_id IN NUMBER,
5879 cp_batch_number IN VARCHAR2) IS
5880 SELECT
5881 RELINT.INTERFACE_ID ,
5882 RELINT.BATCH_NUMBER ,
5883 RELINT.OBJECT_VERSION_NUMBER ,
5884 RELINT.SOURCE_ARTICLE_TITLE ,
5885 RELINT.TARGET_ARTICLE_TITLE ,
5886 RELINT.ORG_ID,
5887 RELINT.RELATIONSHIP_TYPE ,
5888 RELINT.PROCESS_STATUS ,
5889 RELINT.ACTION ,
5890 RELS.ARTICLE_INTENT SOURCE_INTENT,
5891 RELS.ARTICLE_ID SOURCE_ARTICLE_ID ,
5892 RELT.ARTICLE_INTENT TARGET_INTENT,
5893 RELT.ARTICLE_ID TARGET_ARTICLE_ID
5894 FROM OKC_ART_RELS_INTERFACE RELINT,
5895 OKC_ARTICLES_ALL RELS, OKC_ARTICLES_ALL RELT
5896 WHERE nvl(PROCESS_STATUS,'*') NOT IN ('W', 'S')
5897 AND BATCH_NUMBER = cp_batch_number
5898 AND RELINT.ORG_ID = cp_local_org_id
5899 AND RELINT.SOURCE_ARTICLE_TITLE = RELS.ARTICLE_TITLE(+)
5900 AND RELINT.ORG_ID = RELS.ORG_ID(+)
5901 AND RELINT.TARGET_ARTICLE_TITLE = RELT.ARTICLE_TITLE(+)
5902 AND RELINT.ORG_ID = RELT.ORG_ID(+)
5903 ORDER BY RELINT.SOURCE_ARTICLE_TITLE,RELINT.TARGET_ARTICLE_TITLE ASC;
5904
5905 CURSOR l_rel_exist_csr (cp_src_article_id IN NUMBER,
5906 cp_tar_article_id IN NUMBER,
5907 cp_org_id IN NUMBER,
5908 cp_rel_type IN VARCHAR2) IS
5909 SELECT '1' FROM OKC_ARTICLE_RELATNS_ALL
5910 WHERE source_article_id = cp_src_article_id
5911 AND target_article_id = cp_tar_article_id
5912 AND org_id = cp_org_id
5913 AND relationship_type = cp_rel_type;
5914
5915 CURSOR l_org_valid_csr (cp_org_id IN NUMBER) IS
5916 SELECT '1'
5917 FROM HR_ORGANIZATION_INFORMATION_V orgi, HR_ORGANIZATION_UNITS_V orgu
5918 WHERE orgi.org_information_context = 'OKC_TERMS_LIBRARY_DETAILS'
5919 AND orgi.organization_id = orgu.organization_id
5920 AND orgi.organization_id = cp_org_id;
5921
5922 CURSOR l_provision_csr (cp_article_id IN NUMBER) IS
5923 SELECT provision_yn FROM OKC_ARTICLE_VERSIONS
5924 WHERE article_id = cp_article_id
5925 AND article_version_number = 1;
5926
5927 -- Cursor to check clause in the clause interface Table
5928 CURSOR clause_exists_csr (cp_article_title IN VARCHAR2,
5929 cp_org_id IN NUMBER,
5930 cp_batch_number IN VARCHAR2) IS
5931 SELECT '1'
5932 FROM OKC_ART_INTERFACE_ALL
5933 WHERE article_title = cp_article_title
5934 AND org_id = cp_org_id
5935 AND batch_number = cp_batch_number
5936 AND nvl(process_status,'X') not in ('E');
5937
5938
5939 -- Relationships Interface Rows
5940
5941 TYPE l_rinf_interface_id IS TABLE OF OKC_ART_RELS_INTERFACE.INTERFACE_ID%TYPE INDEX BY BINARY_INTEGER ;
5942 TYPE l_rinf_batch_number IS TABLE OF OKC_ART_RELS_INTERFACE.BATCH_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
5943 TYPE l_rinf_object_version_number IS TABLE OF OKC_ART_RELS_INTERFACE.OBJECT_VERSION_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
5944 TYPE l_rinf_source_article_title IS TABLE OF OKC_ART_RELS_INTERFACE.SOURCE_ARTICLE_TITLE%TYPE INDEX BY BINARY_INTEGER ;
5945 TYPE l_rinf_target_article_title IS TABLE OF OKC_ART_RELS_INTERFACE.TARGET_ARTICLE_TITLE%TYPE INDEX BY BINARY_INTEGER ;
5946 TYPE l_rinf_org_id IS TABLE OF OKC_ART_RELS_INTERFACE.ORG_ID%TYPE INDEX BY BINARY_INTEGER ;
5947 TYPE l_rinf_relationship_type IS TABLE OF OKC_ART_RELS_INTERFACE.RELATIONSHIP_TYPE%TYPE INDEX BY BINARY_INTEGER ;
5948 TYPE l_rinf_process_status IS TABLE OF OKC_ART_RELS_INTERFACE.PROCESS_STATUS%TYPE INDEX BY BINARY_INTEGER ;
5949 TYPE l_rinf_action IS TABLE OF OKC_ART_RELS_INTERFACE.ACTION%TYPE INDEX BY BINARY_INTEGER ;
5950
5951 TYPE l_rinf_source_article_id IS TABLE OF OKC_ARTICLES_ALL.ARTICLE_ID%TYPE INDEX BY BINARY_INTEGER ;
5952 TYPE l_rinf_source_intent IS TABLE OF OKC_ARTICLES_ALL.ARTICLE_INTENT%TYPE INDEX BY BINARY_INTEGER ;
5953 TYPE l_rinf_target_article_id IS TABLE OF OKC_ARTICLES_ALL.ARTICLE_ID%TYPE INDEX BY BINARY_INTEGER ;
5954 TYPE l_rinf_target_intent IS TABLE OF OKC_ARTICLES_ALL.ARTICLE_INTENT%TYPE INDEX BY BINARY_INTEGER ;
5955
5956
5957 l_return_status VARCHAR2(1);
5958 l_error_index NUMBER := 1;
5959 l_batch_process_id NUMBER := 1;
5960 l_context VARCHAR2(50) := NULL;
5961 l_init_msg_list VARCHAR2(200) := okc_api.g_true;
5962 l_tot_rows_processed NUMBER := 0;
5963 l_tot_rows_failed NUMBER := 0;
5964 l_tot_rows_warned NUMBER := 0;
5965 l_part_rows_processed NUMBER := 0;
5966 l_part_rows_failed NUMBER := 0;
5967 l_part_rows_warned NUMBER := 0;
5968 l_bulk_failed VARCHAR2(1) := 'Y';
5969
5970 -- Variables for relationships interface
5971 rinf_interface_id_tbl l_rinf_interface_id ;
5972 rinf_batch_number_tbl l_rinf_batch_number ;
5973 rinf_object_version_number_tbl l_rinf_object_version_number ;
5974 rinf_source_article_title_tbl l_rinf_source_article_title ;
5975 rinf_target_article_title_tbl l_rinf_target_article_title ;
5976 rinf_org_id_tbl l_rinf_org_id ;
5977 rinf_relationship_type_tbl l_rinf_relationship_type ;
5978 rinf_process_status_tbl l_rinf_process_status ;
5979 rinf_action_tbl l_rinf_action ;
5980
5981 rinf_source_article_id_tbl l_rinf_source_article_id ;
5982 rinf_source_intent_tbl l_rinf_source_intent ;
5983 rinf_target_article_id_tbl l_rinf_target_article_id ;
5984 rinf_target_intent_tbl l_rinf_target_intent ;
5985
5986 I NUMBER := 0;
5987 j NUMBER := 0;
5988 k NUMBER := 0;
5989 x NUMBER := 0;
5990 l_program_id OKC_ART_RELS_INTERFACE.PROGRAM_ID%TYPE;
5991 l_program_login_id OKC_ART_RELS_INTERFACE.PROGRAM_LOGIN_ID%TYPE;
5992 l_program_appl_id OKC_ART_RELS_INTERFACE.PROGRAM_APPLICATION_ID%TYPE;
5993 l_request_id OKC_ART_RELS_INTERFACE.REQUEST_ID%TYPE;
5994 l_dummy VARCHAR2(1) := '2';
5995 l_dummy1 VARCHAR2(1) := '3';
5996 l_clause VARCHAR2(1) := NULL;
5997 l_tmp_return_status VARCHAR2(1) := G_RET_STS_SUCCESS;
5998
5999 l_source_provision VARCHAR2(1);
6000 l_target_provision VARCHAR2(1);
6001
6002 BEGIN
6003 IF (l_debug = 'Y') THEN
6004 okc_debug.log('100: Entered relationships_import', 2);
6005 END IF;
6006
6007 ------------------------------------------------------------------------
6008 -- Variable Initialization
6009 -------------------------------------------------------------------------
6010
6011
6012 -- Standard Start of API savepoint
6013 FND_MSG_PUB.initialize;
6014 -- Initialize API return status to success
6015 x_return_status := FND_API.G_RET_STS_SUCCESS;
6016 l_return_status := G_RET_STS_SUCCESS;
6017 -- Cache user_id, login_id and org_id
6018 l_user_id := Fnd_Global.user_id;
6019 l_login_id := Fnd_Global.login_id;
6020 -- MOAC
6021 G_CURRENT_ORG_ID := mo_global.get_current_org_id();
6022 /*
6023 OPEN cur_org_csr;
6024 FETCH cur_org_csr INTO G_CURRENT_ORG_ID;
6025 CLOSE cur_org_csr;
6026 */
6027
6028 -- MOAC
6029 IF G_CURRENT_ORG_ID IS NULL THEN
6030 OKC_API.SET_MESSAGE(G_APP_NAME,'OKC_ART_NULL_ORG_ID');
6031 RAISE FND_API.G_EXC_ERROR ;
6032 END IF;
6033
6034 IF FND_GLOBAL.CONC_PROGRAM_ID = -1 THEN
6035 l_program_id := NULL;
6036 ELSE
6037 l_program_id := FND_GLOBAL.CONC_PROGRAM_ID;
6038 END IF;
6039
6040 IF FND_GLOBAL.CONC_LOGIN_ID = -1 THEN
6041 l_program_login_id := NULL;
6042 ELSE
6043 l_program_login_id := FND_GLOBAL.CONC_LOGIN_ID;
6044 END IF;
6045
6046 IF FND_GLOBAL.PROG_APPL_ID = -1 THEN
6047 l_program_appl_id := NULL;
6048 ELSE
6049 l_program_appl_id := FND_GLOBAL.PROG_APPL_ID;
6050 END IF;
6051
6052 IF FND_GLOBAL.CONC_REQUEST_ID = -1 THEN
6053 l_request_id := NULL;
6054 ELSE
6055 l_request_id := FND_GLOBAL.CONC_REQUEST_ID;
6056 END IF;
6057
6058 l_batch_process_id := p_batch_procs_id;
6059 -------------------------------------------------------------------------
6060 --------------- the outermost loop of this procedure --------------------
6061 -- Bulk fetch all interface rows based on the fetchsize passedby the user
6062 -------------------------------------------------------------------------
6063 l_context :='BULK FETCH RELATIONSHIP INTERFACE ROW';
6064 OPEN l_rel_interface_csr ( G_CURRENT_ORG_ID,p_batch_number );
6065 LOOP
6066 BEGIN
6067 FETCH l_rel_interface_csr BULK COLLECT INTO
6068 rinf_interface_id_tbl ,
6069 rinf_batch_number_tbl ,
6070 rinf_object_version_number_tbl ,
6071 rinf_source_article_title_tbl ,
6072 rinf_target_article_title_tbl ,
6073 rinf_org_id_tbl ,
6074 rinf_relationship_type_tbl ,
6075 rinf_process_status_tbl ,
6076 rinf_action_tbl ,
6077 rinf_source_intent_tbl ,
6078 rinf_source_article_id_tbl ,
6079 rinf_target_intent_tbl ,
6080 rinf_target_article_id_tbl LIMIT p_fetchsize;
6081 EXIT WHEN rinf_interface_id_tbl.COUNT = 0 ;
6082
6083 ------------------------------------------------------------------------
6084 -- Variable initialization
6085 -------------------------------------------------------------------------
6086 --For each fetch, relationship variable table index should be initialized
6087 j := 1;
6088 --##count:initialization
6089 l_tot_rows_processed := l_tot_rows_processed+l_part_rows_processed;
6090 l_tot_rows_failed := l_tot_rows_failed+l_part_rows_failed;
6091 l_tot_rows_warned := l_tot_rows_warned+l_part_rows_warned;
6092 l_part_rows_processed := 0;
6093 l_part_rows_failed := 0;
6094 l_part_rows_warned := 0;
6095 l_bulk_failed := 'N';
6096 ---------------------------------------------------------------------------
6097 --------------------- Inner Loop thru fetched rows for---------------------
6098 -- validation, parse and validate article text, create a variable list
6099 -- prepare rows for DML if validate_only is 'N'
6100 /*** Processing Rule to set process_status
6101 Because we want to collect as much info as possible, we need to
6102 maintain process status while keeping the process moving.
6103 So, we'll set l_return_status as validation goes on and
6104 at the end we will set inf_process_status_tbl(i) with l_return_status
6105 for final result. However, we will get out of this process if there
6106 is a significant error such as 'U'.
6107 The return status examined
6108 -api_return_status : return status for api call
6109 -l_return_status : validation result of each row
6110 -x_return_status : final result status for concurrent program request
6111 Rule to set return status
6112 If api_return_status for api call is
6113 * 'S' then continue
6114 * 'W' and l_return_status not 'E' or 'U' then set l_return_status = 'W'
6115 and build_error_array then continue
6116 * 'E' and it is significant then set l_return_status = 'E' and raise
6117 Exception
6118 * 'E' and it is minor then set l_return_status = 'E' and continue. Raise
6119 'E' at the end of validation
6120 * 'U' then set l_return_status = 'U' and raise 'U' exception
6121 * At the end, if it goes thru with no Exception,
6122 Check if l_return_status is 'E' then raise Exception
6123 Otherwise (meaning l_return_status is 'S' or 'W'),
6124 rinf_process_status_tbl(i) = l_return_status
6125 * In the exception, we will set
6126 rinf_process_status_tbl(i) = l_return_status and build_error_array
6127 ***/
6128 -------------------------------------------------------------------------
6129
6130 FOR i in rinf_interface_id_tbl.FIRST ..rinf_interface_id_tbl.LAST LOOP
6131 BEGIN
6132 -- Increment total processed rows
6133 --##Count
6134 l_part_rows_processed := l_part_rows_processed+1;
6135 -- Initialization for each iteration
6136 l_row_notfound := FALSE;
6137 l_return_status := G_RET_STS_SUCCESS;
6138
6139 l_context := 'RELATIONSHIP VALIDATING';
6140
6141 -- To find duplicate relationship in the batch
6142 IF i>1 THEN
6143 x := i-1;
6144 IF (RTRIM(rinf_source_article_title_tbl(i)) = RTRIM(rinf_source_article_title_tbl(x))) AND
6145 (RTRIM(rinf_target_article_title_tbl(i)) = RTRIM(rinf_target_article_title_tbl(x)))
6146 THEN
6147 Okc_Api.Set_Message(G_APP_NAME,
6148 'OKC_REL_DUP_TITLE_ORG',
6149 'CLAUSE1',
6150 rinf_source_article_title_tbl(i),
6151 'CLAUSE2',
6152 rinf_target_article_title_tbl(i));
6153 l_return_status := G_RET_STS_ERROR;
6154 RAISE FND_API.G_EXC_ERROR;
6155 END IF;
6156 END IF;
6157 -- Logic to decide what to do in case of Action='S'
6158
6159 IF rinf_action_tbl(i) = 'S' THEN
6160 rinf_action_tbl(i) := 'N';
6161 END IF;
6162
6163
6164 IF rinf_action_tbl(i) = 'N' THEN
6165
6166 --TRIM trailing space because
6167 rinf_source_article_title_tbl(i) := RTRIM(rinf_source_article_title_tbl(i));
6168 rinf_target_article_title_tbl(i) := RTRIM(rinf_target_article_title_tbl(i));
6169
6170
6171 IF rinf_source_article_id_tbl(i) is NULL THEN
6172 IF p_validate_only = 'Y' THEN
6173 OPEN clause_exists_csr (rinf_source_article_title_tbl(i),
6174 rinf_org_id_tbl(i),
6175 rinf_batch_number_tbl(i));
6176 FETCH clause_exists_csr into l_clause;
6177 CLOSE clause_exists_csr;
6178 IF l_clause is null THEN
6179 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6180 p_msg_name => 'OKC_SOURCE_ART_NOT_FOUND',
6181 p_token1 => 'ARTICLE_TITLE',
6182 p_token1_value => rinf_source_article_title_tbl(i));
6183 l_return_status := G_RET_STS_ERROR;
6184 RAISE FND_API.G_EXC_ERROR ;
6185 ELSE
6186 -- Reset Local Variables
6187 l_clause := NULL;
6188 END IF;
6189 ELSE
6190 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6191 p_msg_name => 'OKC_SOURCE_ART_NOT_FOUND',
6192 p_token1 => 'ARTICLE_TITLE',
6193 p_token1_value => rinf_source_article_title_tbl(i));
6194 l_return_status := G_RET_STS_ERROR;
6195 RAISE FND_API.G_EXC_ERROR ;
6196 END IF;
6197 END IF;
6198
6199 IF rinf_target_article_id_tbl(i) is NULL THEN
6200 IF p_validate_only = 'Y' THEN
6201 OPEN clause_exists_csr (rinf_target_article_title_tbl(i),
6202 rinf_org_id_tbl(i),
6203 rinf_batch_number_tbl(i));
6204 FETCH clause_exists_csr into l_clause;
6205 CLOSE clause_exists_csr;
6206 IF l_clause is null THEN
6207 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6208 p_msg_name => 'OKC_TARGET_ART_NOT_FOUND',
6209 p_token1 => 'ARTICLE_TITLE',
6210 p_token1_value => rinf_target_article_title_tbl(i));
6211 l_return_status := G_RET_STS_ERROR;
6212 RAISE FND_API.G_EXC_ERROR ;
6213 ELSE
6214 -- Reset Local Variables
6215 l_clause := NULL;
6216 END IF;
6217 ELSE
6218 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6219 p_msg_name => 'OKC_TARGET_ART_NOT_FOUND',
6220 p_token1 => 'ARTICLE_TITLE',
6221 p_token1_value => rinf_target_article_title_tbl(i));
6222 l_return_status := G_RET_STS_ERROR;
6223 RAISE FND_API.G_EXC_ERROR ;
6224 END IF;
6225 END IF;
6226
6227
6228
6229 /* IF rinf_source_article_id_tbl(i) is NULL THEN
6230 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6231 p_msg_name => 'OKC_SOURCE_ART_NOT_FOUND',
6232 p_token1 => 'ARTICLE_TITLE',
6233 p_token1_value => rinf_source_article_title_tbl(i));
6234 l_return_status := G_RET_STS_ERROR;
6235 RAISE FND_API.G_EXC_ERROR ;
6236 END IF;
6237
6238 IF rinf_target_article_id_tbl(i) is NULL THEN
6239 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6240 p_msg_name => 'OKC_TARGET_ART_NOT_FOUND',
6241 p_token1 => 'ARTICLE_TITLE',
6242 p_token1_value => rinf_target_article_title_tbl(i));
6243 l_return_status := G_RET_STS_ERROR;
6244 RAISE FND_API.G_EXC_ERROR ;
6245 END IF;
6246 */
6247 ELSIF rinf_action_tbl(i) = 'D' THEN
6248
6249 -- Check Relationship already exists or not
6250 OPEN l_rel_exist_csr(rinf_source_article_id_tbl(i),
6251 rinf_target_article_id_tbl(i),
6252 rinf_org_id_tbl(i),
6253 rinf_relationship_type_tbl(i));
6254 FETCH l_rel_exist_csr into l_dummy;
6255 CLOSE l_rel_exist_csr;
6256 IF l_dummy <> '1' THEN
6257 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6258 p_msg_name => 'OKC_ART_REL_NOT_EXIST',
6259 p_token1 => 'ARTICLE1',
6260 p_token1_value => rinf_source_article_title_tbl(i),
6261 p_token2 => 'ARTICLE2',
6262 p_token2_value => rinf_target_article_title_tbl(i)
6263 );
6264 -- Reset local variable
6265 l_dummy := NULL;
6266 l_return_status := G_RET_STS_ERROR;
6267 RAISE FND_API.G_EXC_ERROR ;
6268
6269 END IF;
6270 ELSE
6271
6272 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6273 p_msg_name => 'OKC_REL_INV_IMP_ACTION');
6274 l_return_status := G_RET_STS_ERROR;
6275 RAISE FND_API.G_EXC_ERROR ;
6276 END IF;
6277
6278 -----------------------------------------------------------
6279 -- Common validation or attribute settting
6280 -- regardless of status and import action
6281 -- this validation is not included in validate api
6282 -----------------------------------------------------------
6283 IF rinf_action_tbl(i) = 'N' THEN
6284
6285 -- Check Source Article and Target Article should not be same
6286
6287 IF rinf_target_article_id_tbl(i) = rinf_source_article_id_tbl(i) THEN
6288 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6289 p_msg_name => 'OKC_IMP_SAME_ART_RELTNSHP',
6290 p_token1 => 'ARTICLE1',
6291 p_token1_value => rinf_source_article_title_tbl(i));
6292 l_return_status := G_RET_STS_ERROR;
6293 END IF;
6294
6295 -- Check Org id is valid org and EIT is defined for this org
6296 OPEN l_org_valid_csr(rinf_org_id_tbl(i));
6297 FETCH l_org_valid_csr into l_dummy1;
6298 CLOSE l_org_valid_csr;
6299 IF l_dummy1 <> '1' THEN
6300 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6301 p_msg_name => 'OKC_ART_ORG_INVALID');
6302 l_return_status := G_RET_STS_ERROR;
6303 END IF;
6304
6305
6306 -- Check Relationship already exists or not
6307 OPEN l_rel_exist_csr(rinf_source_article_id_tbl(i),
6308 rinf_target_article_id_tbl(i),
6309 rinf_org_id_tbl(i),
6310 rinf_relationship_type_tbl(i));
6311 FETCH l_rel_exist_csr into l_dummy;
6312 CLOSE l_rel_exist_csr;
6313 IF l_dummy = '1' THEN
6314 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6315 p_msg_name => 'OKC_ART_REL_EXIST',
6316 p_token1 => 'ARTICLE1',
6317 p_token1_value => rinf_source_article_title_tbl(i),
6318 p_token2 => 'ARTICLE2',
6319 p_token2_value => rinf_target_article_title_tbl(i));
6320 l_return_status := G_RET_STS_ERROR;
6321 -- Reset local variable
6322 l_dummy := NULL;
6323 END IF;
6324
6325 -- Checking Relationship types
6326 /*
6327 IF nvl(rinf_relationship_type_tbl(i), '*') not in ('ALTERNATE','INCOMPATIBLE') THEN
6328 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6329 p_msg_name => 'OKC_INVALID_RELTYPE');
6330 l_return_status := G_RET_STS_ERROR;
6331 END IF;
6332 */
6333 IF rinf_relationship_type_tbl(i) IS NOT NULL THEN
6334 l_tmp_return_status := okc_util.check_lookup_code('OKC_ARTICLE_RELATIONSHIP_TYPE',rinf_relationship_type_tbl(i));
6335 IF (l_tmp_return_status <> G_RET_STS_SUCCESS) THEN
6336 Okc_Api.Set_Message(G_APP_NAME, G_INVALID_VALUE, G_COL_NAME_TOKEN, 'RELATIONSHIP_TYPE');
6337 l_return_status := G_RET_STS_ERROR;
6338 END IF;
6339 END IF;
6340
6341 -- Soruce Article and Target Article should have same intent
6342 IF rinf_target_intent_tbl(i) <> rinf_source_intent_tbl(i) THEN
6343 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6344 p_msg_name => 'OKC_ART_NOT_SAME_INTENT',
6345 p_token1 => 'ARTICLE1',
6346 p_token1_value => rinf_source_article_title_tbl(i),
6347 p_token2 => 'ARTICLE2',
6348 p_token2_value => rinf_target_article_title_tbl(i));
6349 l_return_status := G_RET_STS_ERROR;
6350 END IF;
6351 -- Soruce Article and Target Article should have same provision flag
6352 FOR source in l_provision_csr(rinf_source_article_id_tbl(i))
6353 LOOP
6354 l_source_provision := source.provision_yn;
6355 END LOOP;
6356 FOR target in l_provision_csr(rinf_target_article_id_tbl(i))
6357 LOOP
6358 l_target_provision := target.provision_yn;
6359 END LOOP;
6360 IF l_source_provision <> l_target_provision THEN
6361 okc_Api.Set_Message(p_app_name => G_APP_NAME,
6362 p_msg_name => 'OKC_ART_IMP_PROVISION_RELATION',
6363 p_token1 => 'ARTICLE1',
6364 p_token1_value => rinf_source_article_title_tbl(i),
6365 p_token2 => 'ARTICLE2',
6366 p_token2_value => rinf_target_article_title_tbl(i));
6367 l_return_status := G_RET_STS_ERROR;
6368 END IF;
6369
6370 END IF;
6371 ------------------------------------------------------------------------
6372 -- Now that we have validated and data is clean we can fetch sequences and ids
6373 -- for new relationships for DML and also set the process status to Success
6374 -------------------------------------------------------------------------
6375
6376 -- Summarize report for this row
6377 -- Status 'F' is for internal use meaning parsing failure marked in
6378 -- java concurrent program
6379 IF (l_return_status = G_RET_STS_SUCCESS) THEN
6380 IF (nvl(rinf_process_status_tbl(i), 'E') = 'E') THEN
6381 rinf_process_status_tbl(i) := G_RET_STS_SUCCESS;
6382 ELSIF ( rinf_process_status_tbl(i) = 'F') THEN
6383 -- ##count parser failure as error
6384 --l_tot_rows_failed := l_tot_rows_failed+1;
6385 l_part_rows_failed := l_part_rows_failed+1;
6386 rinf_process_status_tbl(i) := G_RET_STS_ERROR;
6387 END IF;
6388 ELSIF (l_return_status = l_sts_warning) THEN
6389 IF (nvl(rinf_process_status_tbl(i),'E') = 'E') THEN
6390 rinf_process_status_tbl(i) := l_sts_warning;
6391 --##count
6392 --l_tot_rows_warned := l_tot_rows_warned+1;
6393 l_part_rows_warned := l_part_rows_warned+1;
6394 ELSIF (rinf_process_status_tbl(i) = 'F') THEN
6395 -- ##count parser failure as error
6396 --l_tot_rows_failed := l_tot_rows_failed+1;
6397 l_part_rows_failed := l_part_rows_failed+1;
6398 rinf_process_status_tbl(i) := G_RET_STS_ERROR;
6399 END IF;
6400 ELSIF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
6401 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6402 ELSIF (l_return_status = G_RET_STS_ERROR) THEN
6403 RAISE FND_API.G_EXC_ERROR;
6404 END IF;
6405
6406 -------------------------
6407 -------------------------
6408 -- Exception Block for each iteration in Loop
6409 -- validation and unexpected errors
6410 -- In case of unexpected error, escape the loop
6411 -------------------------
6412 -------------------------
6413
6414
6415 EXCEPTION
6416 WHEN FND_API.G_EXC_ERROR THEN
6417 IF (l_debug = 'Y') THEN
6418 okc_debug.log('300: In Relationships_Import: OKC_API.G_EXCEPTION_ERROR Exception', 2);
6419 END IF;
6420 --l_return_status := G_RET_STS_ERROR ;
6421 build_error_array(
6422 p_msg_data => x_msg_data,
6423 p_context => l_context,
6424 p_batch_process_id => l_batch_process_id,
6425 p_interface_id => rinf_interface_id_tbl(i),
6426 p_article_title => rinf_source_article_title_tbl(i),
6427 p_error_type => G_RET_STS_ERROR,
6428 p_entity => 'RELATIONSHIP'
6429 );
6430 rinf_process_status_tbl(i) := G_RET_STS_ERROR;
6431 --##count
6432 --l_tot_rows_failed := l_tot_rows_failed+1;
6433 l_part_rows_failed := l_part_rows_failed+1;
6434 -- Continue to next row
6435
6436 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6437 IF (l_debug = 'Y') THEN
6438 okc_debug.log('400: Leaving Relationships_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
6439 END IF;
6440
6441 IF l_rel_interface_csr%ISOPEN THEN
6442 CLOSE l_rel_interface_csr;
6443 END IF;
6444
6445 --Set_Message
6446 l_return_status := G_RET_STS_UNEXP_ERROR ;
6447 x_return_status := G_RET_STS_UNEXP_ERROR ;
6448
6449 build_error_array(
6450 p_msg_data => x_msg_data,
6451 p_context => l_context,
6452 p_batch_process_id => l_batch_process_id,
6453 p_interface_id => rinf_interface_id_tbl(i),
6454 p_article_title => rinf_source_article_title_tbl(i),
6455 p_error_type => G_RET_STS_UNEXP_ERROR,
6456 p_entity => 'RELATIONSHIP'
6457 );
6458 rinf_process_status_tbl(i) := G_RET_STS_ERROR;
6459 --##count
6460 --l_tot_rows_failed := l_tot_rows_failed+1;
6461 l_part_rows_failed := l_part_rows_failed+1;
6462 exit; -- exit the current fetch
6463
6464 WHEN OTHERS THEN
6465 IF (l_debug = 'Y') THEN
6466 okc_debug.log('500: Leaving Relationships_Import because of EXCEPTION: '||sqlerrm, 2);
6467 END IF;
6468
6469 IF l_rel_interface_csr%ISOPEN THEN
6470 CLOSE l_rel_interface_csr;
6471 END IF;
6472
6473 l_return_status := G_RET_STS_UNEXP_ERROR ;
6474 x_return_status := G_RET_STS_UNEXP_ERROR ;
6475
6476 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6477 p_msg_name => G_UNEXPECTED_ERROR,
6478 p_token1 => G_SQLCODE_TOKEN,
6479 p_token1_value => sqlcode,
6480 p_token2 => G_SQLERRM_TOKEN,
6481 p_token2_value => sqlerrm);
6482
6483 build_error_array(
6484 p_msg_data => G_UNEXPECTED_ERROR,
6485 p_context => l_context,
6486 p_batch_process_id => l_batch_process_id,
6487 p_interface_id => rinf_interface_id_tbl(i),
6488 p_article_title => rinf_source_article_title_tbl(i),
6489 p_error_type => G_RET_STS_ERROR,
6490 p_entity => 'RELATIONSHIP'
6491 );
6492 rinf_process_status_tbl(i) := G_RET_STS_ERROR;
6493 --##count
6494 --l_tot_rows_failed := l_tot_rows_failed+1;
6495 l_part_rows_failed := l_part_rows_failed+1;
6496 exit; -- exit the current fetch
6497 END;
6498 -------------------------
6499 -------------------------
6500 -- Exception Block for each iteration in Loop ends
6501 -------------------------
6502 -------------------------
6503
6504
6505 END LOOP; -- end of FOR i in inf_interface_id_tbl.FIRST ..
6506 ------------------------------------------------------------------------
6507 -------------- End of Inner Loop thru fetched row for---------------------
6508 -- validation
6509 -------------------------------------------------------------------------
6510 -- In order to propagate Unexpected error raise it if it is 'U'
6511 IF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
6512 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
6513 END IF;
6514
6515 -------------------------
6516 -------------------------
6517 -- Exception Block for Inner Loop starts
6518 -- Handles unexpected errors as last step
6519 -------------------------
6520 -------------------------
6521 EXCEPTION
6522 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6523 IF (l_debug = 'Y') THEN
6524 okc_debug.log('400: Leaving Relationships_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
6525 END IF;
6526
6527 IF l_rel_interface_csr%ISOPEN THEN
6528 CLOSE l_rel_interface_csr;
6529 END IF;
6530 l_return_status := G_RET_STS_UNEXP_ERROR ;
6531 x_return_status := G_RET_STS_UNEXP_ERROR ;
6532 exit; -- exit outermost loop
6533
6534 WHEN OTHERS THEN
6535 IF (l_debug = 'Y') THEN
6536 okc_debug.log('500: Leaving Relationships_Import because of EXCEPTION: '||sqlerrm, 2);
6537 END IF;
6538
6539 IF l_rel_interface_csr%ISOPEN THEN
6540 CLOSE l_rel_interface_csr;
6541 END IF;
6542 l_return_status := G_RET_STS_UNEXP_ERROR ;
6543 x_return_status := G_RET_STS_UNEXP_ERROR ;
6544 exit; -- exit outermost loop
6545 END;
6546
6547 -------------------------
6548 -------------------------
6549 -- Exception Block for Each Iteration of outermost Loop ends
6550 -------------------------
6551 -------------------------
6552
6553 ------------------------------------------------------------------------
6554 --------------------- Start Do_DML for Relationships ---------------
6555 -- Insert or Update Relationships
6556 -------------------------------------------------------------------------
6557 -- initialize l_return_status to track status of DML execution
6558 l_return_status := G_RET_STS_SUCCESS;
6559
6560
6561 IF p_validate_only = 'N' THEN
6562 BEGIN
6563 SAVEPOINT bulkdml;
6564
6565 i := 0;
6566 -- Bulk insert New Valid Records
6567 BEGIN
6568 l_context := 'INSERTING FIRST NEW RELATIONSHIP INTO TABLE';
6569
6570 FORALL i in rinf_interface_id_tbl.FIRST ..rinf_interface_id_tbl.LAST
6571 INSERT INTO OKC_ARTICLE_RELATNS_ALL(
6572 SOURCE_ARTICLE_ID,
6573 TARGET_ARTICLE_ID,
6574 ORG_ID,
6575 RELATIONSHIP_TYPE,
6576 OBJECT_VERSION_NUMBER,
6577 CREATED_BY,
6578 CREATION_DATE,
6579 LAST_UPDATED_BY,
6580 LAST_UPDATE_LOGIN,
6581 LAST_UPDATE_DATE)
6582 SELECT
6583 rinf_source_article_id_tbl(i),
6584 rinf_target_article_id_tbl(i),
6585 rinf_org_id_tbl(i),
6586 rinf_relationship_type_tbl(i),
6587 1.0,
6588 l_user_id,
6589 sysdate,
6590 l_user_id,
6591 l_login_id,
6592 sysdate
6593 FROM DUAL
6594 WHERE rinf_action_tbl(i) = 'N' and
6595 rinf_process_status_tbl(i) in ('S', 'W') ;
6596
6597
6598 FORALL i in rinf_interface_id_tbl.FIRST ..rinf_interface_id_tbl.LAST
6599 INSERT INTO OKC_ARTICLE_RELATNS_ALL(
6600 TARGET_ARTICLE_ID,
6601 SOURCE_ARTICLE_ID,
6602 ORG_ID,
6603 RELATIONSHIP_TYPE,
6604 OBJECT_VERSION_NUMBER,
6605 CREATED_BY,
6606 CREATION_DATE,
6607 LAST_UPDATED_BY,
6608 LAST_UPDATE_LOGIN,
6609 LAST_UPDATE_DATE)
6610 SELECT
6611 rinf_source_article_id_tbl(i),
6612 rinf_target_article_id_tbl(i),
6613 rinf_org_id_tbl(i),
6614 rinf_relationship_type_tbl(i),
6615 1.0,
6616 l_user_id,
6617 sysdate,
6618 l_user_id,
6619 l_login_id,
6620 sysdate
6621 FROM DUAL
6622 WHERE rinf_action_tbl(i) = 'N' and
6623 rinf_process_status_tbl(i) in ('S', 'W') ;
6624 EXCEPTION
6625 WHEN OTHERS THEN
6626 IF (l_debug = 'Y') THEN
6627 okc_debug.log('500: Leaving Relationships_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
6628 END IF;
6629 END;
6630
6631 --
6632 -- End of Insert into OKC_ARTICLE_RELATNS_ALL
6633 --
6634 --
6635
6636
6637 i := 0;
6638 -- Bulk delete Valid Records
6639 BEGIN
6640 l_context := 'DELETE RELATIONSHIP FROM TABLE';
6641
6642 FORALL i in rinf_interface_id_tbl.FIRST ..rinf_interface_id_tbl.LAST
6643 DELETE FROM OKC_ARTICLE_RELATNS_ALL
6644 WHERE
6645 SOURCE_ARTICLE_ID = rinf_source_article_id_tbl(i) AND
6646 TARGET_ARTICLE_ID = rinf_target_article_id_tbl(i) AND
6647 ORG_ID = rinf_org_id_tbl(i) AND
6648 RELATIONSHIP_TYPE = rinf_relationship_type_tbl(i) AND
6649 rinf_action_tbl(i) = 'D' AND
6650 rinf_process_status_tbl(i) in ('S', 'W') ;
6651
6652
6653 FORALL i in rinf_interface_id_tbl.FIRST ..rinf_interface_id_tbl.LAST
6654 DELETE FROM OKC_ARTICLE_RELATNS_ALL
6655 WHERE
6656 TARGET_ARTICLE_ID = rinf_source_article_id_tbl(i) AND
6657 SOURCE_ARTICLE_ID = rinf_target_article_id_tbl(i) AND
6658 ORG_ID = rinf_org_id_tbl(i) AND
6659 RELATIONSHIP_TYPE = rinf_relationship_type_tbl(i) AND
6660 rinf_action_tbl(i) = 'D' AND
6661 rinf_process_status_tbl(i) in ('S', 'W') ;
6662
6663 EXCEPTION
6664 WHEN OTHERS THEN
6665 IF (l_debug = 'Y') THEN
6666 okc_debug.log('500: Leaving Relationships_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
6667 END IF;
6668 END;
6669
6670 --
6671 -- End of Delete from OKC_ARTICLE_RELATNS_ALL
6672 --
6673 --
6674
6675
6676
6677 -- Exception for bulk DML block
6678 EXCEPTION
6679 WHEN OTHERS THEN
6680 l_bulk_failed := 'Y'; -- indicating that bulk operation has failed
6681 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6682 p_msg_name => G_UNEXPECTED_ERROR,
6683 p_token1 => G_SQLCODE_TOKEN,
6684 p_token1_value => sqlcode,
6685 p_token2 => G_SQLERRM_TOKEN,
6686 p_token2_value => sqlerrm);
6687 Okc_API.Set_Message(p_app_name => G_APP_NAME,
6688 p_msg_name => 'OKC_ART_FETCH_FAILED',
6689 p_token1 => 'CONTEXT',
6690 p_token1_value => l_context);
6691
6692 build_error_array(
6693 p_msg_data => null,
6694 p_context => l_context,
6695 p_batch_process_id => l_batch_process_id,
6696 p_interface_id => -99,
6697 p_article_title => NULL,
6698 p_error_type => G_RET_STS_ERROR,
6699 p_entity => 'RELATIONSHIP'
6700 );
6701 l_return_status := G_RET_STS_UNEXP_ERROR;
6702 x_return_status := G_RET_STS_UNEXP_ERROR;
6703
6704 --##count:rollback the count
6705 l_part_rows_failed := l_part_rows_processed;
6706 l_part_rows_warned := 0;
6707
6708 ROLLBACK TO SAVEPOINT bulkdml;
6709 exit; -- exit outermost loop
6710 END;
6711
6712 END IF; --- validate_only = 'N'
6713
6714 ------------------------------------------------------------------------
6715 --------------------- End of Do_DML for Relationships ---------------
6716 -------------------------------------------------------------------------
6717
6718 ------------------------------------------------------------------------
6719 --------------- Start of Do_DML for import related tables ------------
6720 -- Update interface table
6721 -- Insert Errors into Error table
6722 -------------------------------------------------------------------------
6723 -- Update Interface Table
6724 i:=0;
6725 BEGIN
6726 l_context := 'UPDATING RELATIONSHIPS INTERFACE TABLE';
6727 FORALL i in rinf_interface_id_tbl.FIRST..rinf_interface_id_tbl.LAST
6728 UPDATE OKC_ART_RELS_INTERFACE
6729 SET
6730 -- We don't want to update process_status to 'S' or 'W' in validation_mode
6731 -- because it is not going to be picked up in next run if we do so
6732 PROCESS_STATUS = decode(p_validate_only||rinf_process_status_tbl(i)||l_bulk_failed,
6733 'NEN','E',
6734 'NSN','S',
6735 'NWN','W',
6736 'NEY','E',
6737 'NSY',NULL,
6738 'NWY',NULL,
6739 'YEY','E',
6740 'YEN','E',
6741 'NFY','E',
6742 'YFY','E',
6743 'NFN','E',
6744 'YFN','E',NULL),
6745 PROGRAM_ID = l_program_id,
6746 REQUEST_ID = l_request_id,
6747 PROGRAM_LOGIN_ID = l_program_login_id,
6748 PROGRAM_APPLICATION_ID = l_program_appl_id,
6749 OBJECT_VERSION_NUMBER = rinf_object_version_number_tbl(i) + 1,
6750 LAST_UPDATED_BY = l_user_id,
6751 LAST_UPDATE_LOGIN = l_login_id,
6752 LAST_UPDATE_DATE = SYSDATE
6753 WHERE
6754 interface_id = rinf_interface_id_tbl(i);
6755 EXCEPTION
6756 WHEN OTHERS THEN
6757 IF (l_debug = 'Y') THEN
6758 okc_debug.log('500: Leaving Relationships_Import because of EXCEPTION: '||sqlerrm, 2);
6759 END IF;
6760 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6761 p_msg_name => G_UNEXPECTED_ERROR,
6762 p_token1 => G_SQLCODE_TOKEN,
6763 p_token1_value => sqlcode,
6764 p_token2 => G_SQLERRM_TOKEN,
6765 p_token2_value => sqlerrm);
6766 Okc_API.Set_Message(p_app_name => G_APP_NAME,
6767 p_msg_name => 'OKC_REL_INT_UPDATE_FAILED');
6768 build_error_array(
6769 p_msg_data => null,
6770 p_context => l_context,
6771 p_batch_process_id => l_batch_process_id,
6772 p_interface_id => -99,
6773 p_article_title => NULL,
6774 p_error_type => G_RET_STS_ERROR,
6775 p_entity => 'RELATIONSHIP'
6776 );
6777
6778 l_return_status := G_RET_STS_UNEXP_ERROR ;
6779 x_return_status := G_RET_STS_UNEXP_ERROR ;
6780 --##count:rollback the count
6781 l_part_rows_failed := l_part_rows_processed;
6782 l_part_rows_warned := 0;
6783
6784 --RAISE FND_API.G_EXC_ERROR ;
6785 END;
6786 --
6787 -- End of Update OKC_RELATIONSHIPS_INTERFACE
6788 --
6789 --
6790
6791 --
6792 --Insert Errors into Error table for this fetch
6793 --
6794 insert_error_array(
6795 x_return_status => x_return_status,
6796 x_msg_count => x_msg_count,
6797 x_msg_data => x_msg_data
6798 );
6799
6800
6801 IF (x_return_status = l_insert_errors_error) THEN
6802 NULL;
6803 -- Ignore
6804 -- RAISE l_insert_errors_exception;
6805 END IF;
6806
6807 ------------------------------------------------------------------------
6808 --------------- End of Do_DML for import related tables ------------
6809 -------------------------------------------------------------------------
6810 commit;
6811
6812 -- Now delete cache for next bulk fetch
6813
6814 rinf_interface_id_tbl.DELETE;
6815 rinf_batch_number_tbl.DELETE;
6816 rinf_object_version_number_tbl.DELETE;
6817 rinf_source_article_title_tbl.DELETE;
6818 rinf_target_article_title_tbl.DELETE;
6819 rinf_org_id_tbl.DELETE;
6820 rinf_relationship_type_tbl.DELETE;
6821 rinf_process_status_tbl.DELETE;
6822 rinf_action_tbl.DELETE;
6823 rinf_source_intent_tbl.DELETE;
6824 rinf_source_article_id_tbl.DELETE;
6825 rinf_target_intent_tbl.DELETE;
6826 rinf_target_article_id_tbl.DELETE;
6827
6828 err_batch_process_id_tbl.DELETE;
6829 err_article_title_tbl.DELETE;
6830 err_interface_id_tbl.DELETE;
6831 err_error_number_tbl.DELETE;
6832 err_object_version_number_tbl.DELETE;
6833 err_error_type_tbl.DELETE;
6834 err_entity_tbl.DELETE;
6835 err_error_description_tbl.DELETE;
6836
6837 EXIT WHEN l_rel_interface_csr%NOTFOUND;
6838 END LOOP;
6839
6840
6841 -----------------------------------------------------------------------
6842 -- End of outermost loop for bulk fetch
6843 -----------------------------------------------------------------------
6844
6845 IF l_rel_interface_csr%ISOPEN THEN
6846 CLOSE l_rel_interface_csr;
6847 END IF;
6848
6849
6850 --##count:add up last processed counts
6851 l_tot_rows_processed := l_tot_rows_processed + l_part_rows_processed;
6852 l_tot_rows_failed := l_tot_rows_failed + l_part_rows_failed;
6853 l_tot_rows_warned := l_tot_rows_warned + l_part_rows_warned;
6854 /*****************
6855 --Update Batch Process Table as a last step
6856 UPDATE OKC_ART_INT_BATPROCS_ALL
6857 SET
6858 TOTAL_ROWS_PROCESSED = l_tot_rows_processed,
6859 TOTAL_ROWS_FAILED = l_tot_rows_failed,
6860 TOTAL_ROWS_WARNED = l_tot_rows_warned,
6861 END_DATE = SYSDATE,
6862 PROGRAM_ID = l_program_id,
6863 REQUEST_ID = l_request_id,
6864 PROGRAM_LOGIN_ID = l_program_login_id,
6865 PROGRAM_APPLICATION_ID = l_program_appl_id,
6866 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
6867 LAST_UPDATED_BY = l_user_id,
6868 LAST_UPDATE_LOGIN = l_login_id,
6869 LAST_UPDATE_DATE = SYSDATE
6870 WHERE
6871 BATCH_PROCESS_ID = l_batch_process_id
6872 AND ENTITY = 'Relationship' ;
6873 *********************/
6874
6875 p_rows_processed := l_tot_rows_processed;
6876 p_rows_failed := l_tot_rows_failed;
6877 p_rows_warned := l_tot_rows_warned;
6878
6879 IF err_error_number_tbl.COUNT > 0 THEN
6880 insert_error_array(
6881 x_return_status => x_return_status,
6882 x_msg_count => x_msg_count,
6883 x_msg_data => x_msg_data
6884 );
6885 END IF;
6886
6887 -- Print statistic of this run in the log
6888 -- Commented for new XML Based Import - Moved to new_wrap_up in conc_import_articles
6889 --wrap_up(p_validate_only,p_batch_number,l_tot_rows_processed,l_tot_rows_failed,l_tot_rows_warned,l_batch_process_id,'RELATIONSHIP');
6890 /*
6891 FND_MSG_PUB.initialize;
6892 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6893 p_msg_name => 'OKC_ART_IMP_ERR');
6894
6895 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, FND_MSG_PUB.Get(1,p_encoded=>FND_API.G_FALSE));
6896
6897 FND_MSG_PUB.initialize;
6898 */
6899 commit; -- Final commit for status update
6900
6901 IF (l_debug = 'Y') THEN
6902 okc_debug.log('2000: Leaving relationships import', 2);
6903 END IF;
6904 --x_return_status := l_return_status; this may cause to erase error x_return_status
6905
6906 EXCEPTION
6907
6908 WHEN FND_API.G_EXC_ERROR THEN
6909 IF (l_debug = 'Y') THEN
6910 okc_debug.log('3000: Leaving Relationships_Import: OKC_API.G_EXCEPTION_ERROR Exception', 2);
6911 END IF;
6912 --Insert Errors into Error table if there is any
6913 insert_error_array(
6914 x_return_status => x_return_status,
6915 x_msg_count => x_msg_count,
6916 x_msg_data => x_msg_data
6917 );
6918 x_return_status := G_RET_STS_ERROR ;
6919
6920 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6921 IF (l_debug = 'Y') THEN
6922 okc_debug.log('4000: Leaving Relationships_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
6923 END IF;
6924 --Insert Errors into Error table if there is any
6925
6926 insert_error_array(
6927 x_return_status => x_return_status,
6928 x_msg_count => x_msg_count,
6929 x_msg_data => x_msg_data
6930 );
6931 commit;
6932
6933 IF l_rel_interface_csr%ISOPEN THEN
6934 CLOSE l_rel_interface_csr;
6935 END IF;
6936
6937 x_return_status := G_RET_STS_UNEXP_ERROR ;
6938 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
6939 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
6940 END IF;
6941 get_print_msgs_stack(p_msg_data => x_msg_data);
6942
6943 WHEN l_insert_errors_exception THEN
6944 --
6945 -- In this exception handling, we don't insert error array again
6946 -- because error happend in the module
6947 --
6948 IF (l_debug = 'Y') THEN
6949 okc_debug.log('5000: Leaving Relationships_Import because of EXCEPTION in insert_error_array: '||sqlerrm, 2);
6950 END IF;
6951
6952 IF l_rel_interface_csr%ISOPEN THEN
6953 CLOSE l_rel_interface_csr;
6954 END IF;
6955
6956
6957 --x_return_status := G_RET_STS_UNEXP_ERROR ;
6958 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
6959 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
6960 END IF;
6961 get_print_msgs_stack(p_msg_data => x_msg_data);
6962 commit;
6963
6964 WHEN OTHERS THEN
6965 IF (l_debug = 'Y') THEN
6966 okc_debug.log('5000: Leaving Relationships_Import because of EXCEPTION: '||sqlerrm, 2);
6967 END IF;
6968 --Insert Errors into Error table if there is any
6969 insert_error_array(
6970 x_return_status => x_return_status,
6971 x_msg_count => x_msg_count,
6972 x_msg_data => x_msg_data
6973 );
6974 commit;
6975 --
6976 IF l_rel_interface_csr%ISOPEN THEN
6977 CLOSE l_rel_interface_csr;
6978 END IF;
6979
6980 x_return_status := G_RET_STS_UNEXP_ERROR ;
6981 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
6982 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
6983 END IF;
6984 get_print_msgs_stack(p_msg_data => x_msg_data);
6985 END import_relationships;
6986
6987 PROCEDURE import_fnd_flex_value_sets(
6988 x_return_status OUT NOCOPY VARCHAR2,
6989 x_msg_count OUT NOCOPY NUMBER,
6990 x_msg_data OUT NOCOPY VARCHAR2,
6991
6992 p_batch_procs_id IN NUMBER,
6993 p_batch_number IN VARCHAR2,
6994 p_validate_only IN VARCHAR2 := 'Y',
6995 p_fetchsize IN NUMBER := 100
6996 ) IS
6997 l_api_version CONSTANT NUMBER := 1;
6998 l_api_name CONSTANT VARCHAR2(30) := 'import_fnd_flex_value_sets';
6999 l_sts_warning CONSTANT VARCHAR2(1) := 'W';
7000 l_row_notfound BOOLEAN := FALSE;
7001 l_user_id NUMBER;
7002 l_login_id NUMBER;
7003 l_insert_errors_exception EXCEPTION;
7004 l_insert_errors_error CONSTANT VARCHAR2(1) := 'X';
7005
7006 CURSOR l_valset_interface_csr ( cp_batch_number IN VARCHAR2) IS
7007 SELECT
7008 VSINT.INTERFACE_ID ,
7009 VSINT.BATCH_NUMBER ,
7010 VSINT.OBJECT_VERSION_NUMBER ,
7011 VSINT.FLEX_VALUE_SET_NAME ,
7012 VSINT.VALIDATION_TYPE ,
7013 VSINT.PROCESS_STATUS ,
7014 VSINT.ACTION ,
7015 VSINT.FORMAT_TYPE ,
7016 VSINT.MAXIMUM_SIZE ,
7017 VSINT.DESCRIPTION ,
7018 VSINT.MINIMUM_VALUE ,
7019 VSINT.MAXIMUM_VALUE ,
7020 VSINT.NUMBER_PRECISION ,
7021 VSINT.UPPERCASE_ONLY_FLAG ,
7022 VSINT.NUMBER_ONLY_FLAG
7023 FROM OKC_VALUESETS_INTERFACE VSINT
7024 WHERE nvl(PROCESS_STATUS,'*') NOT IN ('W', 'S')
7025 AND BATCH_NUMBER = cp_batch_number
7026 ORDER BY VSINT.FLEX_VALUE_SET_NAME ASC;
7027
7028 -- Flex Valuesets Interface Rows
7029
7030 TYPE l_vsinf_interface_id IS TABLE OF OKC_VALUESETS_INTERFACE.INTERFACE_ID%TYPE INDEX BY BINARY_INTEGER ;
7031 TYPE l_vsinf_batch_number IS TABLE OF OKC_VALUESETS_INTERFACE.BATCH_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
7032 TYPE l_vsinf_obj_ver_number IS TABLE OF OKC_VALUESETS_INTERFACE.OBJECT_VERSION_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
7033 TYPE l_vsinf_flex_value_set_name IS TABLE OF OKC_VALUESETS_INTERFACE.FLEX_VALUE_SET_NAME%TYPE INDEX BY BINARY_INTEGER ;
7034 TYPE l_vsinf_validation_type IS TABLE OF OKC_VALUESETS_INTERFACE.VALIDATION_TYPE%TYPE INDEX BY BINARY_INTEGER ;
7035 TYPE l_vsinf_process_status IS TABLE OF OKC_VALUESETS_INTERFACE.PROCESS_STATUS%TYPE INDEX BY BINARY_INTEGER ;
7036 TYPE l_vsinf_action IS TABLE OF OKC_VALUESETS_INTERFACE.ACTION%TYPE INDEX BY BINARY_INTEGER ;
7037 TYPE l_vsinf_format_type IS TABLE OF OKC_VALUESETS_INTERFACE.FORMAT_TYPE%TYPE INDEX BY BINARY_INTEGER ;
7038 TYPE l_vsinf_maximum_size IS TABLE OF OKC_VALUESETS_INTERFACE.MAXIMUM_SIZE%TYPE INDEX BY BINARY_INTEGER ;
7039 TYPE l_vsinf_description IS TABLE OF OKC_VALUESETS_INTERFACE.DESCRIPTION%TYPE INDEX BY BINARY_INTEGER ;
7040 TYPE l_vsinf_minimum_value IS TABLE OF OKC_VALUESETS_INTERFACE.MINIMUM_VALUE%TYPE INDEX BY BINARY_INTEGER ;
7041 TYPE l_vsinf_maximum_value IS TABLE OF OKC_VALUESETS_INTERFACE.MAXIMUM_VALUE%TYPE INDEX BY BINARY_INTEGER ;
7042 TYPE l_vsinf_number_precision IS TABLE OF OKC_VALUESETS_INTERFACE.NUMBER_PRECISION%TYPE INDEX BY BINARY_INTEGER ;
7043 TYPE l_vsinf_uppercase_only_flag IS TABLE OF OKC_VALUESETS_INTERFACE.UPPERCASE_ONLY_FLAG%TYPE INDEX BY BINARY_INTEGER ;
7044 TYPE l_vsinf_number_only_flag IS TABLE OF OKC_VALUESETS_INTERFACE.NUMBER_ONLY_FLAG%TYPE INDEX BY BINARY_INTEGER ;
7045
7046
7047
7048 l_return_status VARCHAR2(1);
7049 l_error_index NUMBER := 1;
7050 l_batch_process_id NUMBER := 1;
7051 l_context VARCHAR2(50) := NULL;
7052 l_init_msg_list VARCHAR2(200) := okc_api.g_true;
7053 l_tot_rows_processed NUMBER := 0;
7054 l_tot_rows_failed NUMBER := 0;
7055 l_tot_rows_warned NUMBER := 0;
7056 l_part_rows_processed NUMBER := 0;
7057 l_part_rows_failed NUMBER := 0;
7058 l_part_rows_warned NUMBER := 0;
7059 l_bulk_failed VARCHAR2(1) := 'Y';
7060
7061 -- Variables for flex value sets interface
7062 vsinf_interface_id_tbl l_vsinf_interface_id ;
7063 vsinf_batch_number_tbl l_vsinf_batch_number ;
7064 vsinf_obj_ver_number_tbl l_vsinf_obj_ver_number ;
7065 vsinf_flex_value_set_name_tbl l_vsinf_flex_value_set_name ;
7066 vsinf_validation_type_tbl l_vsinf_validation_type ;
7067 vsinf_process_status_tbl l_vsinf_process_status ;
7068 vsinf_action_tbl l_vsinf_action ;
7069 vsinf_format_type_tbl l_vsinf_format_type ;
7070 vsinf_maximum_size_tbl l_vsinf_maximum_size ;
7071 vsinf_description_tbl l_vsinf_description ;
7072 vsinf_minimum_value_tbl l_vsinf_minimum_value ;
7073 vsinf_maximum_value_tbl l_vsinf_maximum_value ;
7074 vsinf_number_precision_tbl l_vsinf_number_precision ;
7075 vsinf_uppercase_only_flag_tbl l_vsinf_uppercase_only_flag ;
7076 vsinf_number_only_flag_tbl l_vsinf_number_only_flag ;
7077
7078
7079 I NUMBER := 0;
7080 j NUMBER := 0;
7081 k NUMBER := 0;
7082 x NUMBER := 0;
7083 l_program_id OKC_VALUESETS_INTERFACE.PROGRAM_ID%TYPE;
7084 l_program_login_id OKC_VALUESETS_INTERFACE.PROGRAM_LOGIN_ID%TYPE;
7085 l_program_appl_id OKC_VALUESETS_INTERFACE.PROGRAM_APPLICATION_ID%TYPE;
7086 l_request_id OKC_VALUESETS_INTERFACE.REQUEST_ID%TYPE;
7087 l_tmp_return_status VARCHAR2(1) := G_RET_STS_SUCCESS;
7088
7089
7090 BEGIN
7091 IF (l_debug = 'Y') THEN
7092 okc_debug.log('100: Entered valueset_import', 2);
7093 END IF;
7094
7095
7096 ------------------------------------------------------------------------
7097 -- Variable Initialization
7098 -------------------------------------------------------------------------
7099
7100 -- Standard Start of API savepoint
7101 FND_MSG_PUB.initialize;
7102 -- Initialize API return status to success
7103 x_return_status := FND_API.G_RET_STS_SUCCESS;
7104 l_return_status := G_RET_STS_SUCCESS;
7105 -- Cache user_id, login_id and org_id
7106 l_user_id := Fnd_Global.user_id;
7107 l_login_id := Fnd_Global.login_id;
7108
7109 IF FND_GLOBAL.CONC_PROGRAM_ID = -1 THEN
7110 l_program_id := NULL;
7111 ELSE
7112 l_program_id := FND_GLOBAL.CONC_PROGRAM_ID;
7113 END IF;
7114
7115 IF FND_GLOBAL.CONC_LOGIN_ID = -1 THEN
7116 l_program_login_id := NULL;
7117 ELSE
7118 l_program_login_id := FND_GLOBAL.CONC_LOGIN_ID;
7119 END IF;
7120
7121 IF FND_GLOBAL.PROG_APPL_ID = -1 THEN
7122 l_program_appl_id := NULL;
7123 ELSE
7124 l_program_appl_id := FND_GLOBAL.PROG_APPL_ID;
7125 END IF;
7126
7127 IF FND_GLOBAL.CONC_REQUEST_ID = -1 THEN
7128 l_request_id := NULL;
7129 ELSE
7130 l_request_id := FND_GLOBAL.CONC_REQUEST_ID;
7131 END IF;
7132
7133
7134 l_batch_process_id := p_batch_procs_id;
7135 -------------------------------------------------------------------------
7136 --------------- the outermost loop of this procedure --------------------
7137 -- Bulk fetch all interface rows based on the fetchsize passedby the user
7138 -------------------------------------------------------------------------
7139
7140 l_context :='BULK FETCH FLEX VALUE SETS INTERFACE ROW';
7141 OPEN l_valset_interface_csr ( p_batch_number );
7142 LOOP
7143 BEGIN
7144 FETCH l_valset_interface_csr BULK COLLECT INTO
7145 vsinf_interface_id_tbl ,
7146 vsinf_batch_number_tbl ,
7147 vsinf_obj_ver_number_tbl ,
7148 vsinf_flex_value_set_name_tbl ,
7149 vsinf_validation_type_tbl ,
7150 vsinf_process_status_tbl ,
7151 vsinf_action_tbl ,
7152 vsinf_format_type_tbl ,
7153 vsinf_maximum_size_tbl ,
7154 vsinf_description_tbl ,
7155 vsinf_minimum_value_tbl ,
7156 vsinf_maximum_value_tbl ,
7157 vsinf_number_precision_tbl ,
7158 vsinf_uppercase_only_flag_tbl ,
7159 vsinf_number_only_flag_tbl LIMIT p_fetchsize;
7160 EXIT WHEN vsinf_interface_id_tbl.COUNT = 0 ;
7161
7162 ------------------------------------------------------------------------
7163 -- Variable initialization
7164 -------------------------------------------------------------------------
7165 --For each fetch, valueset variable table index should be initialized
7166 j := 1;
7167 --##count:initialization
7168 l_tot_rows_processed := l_tot_rows_processed+l_part_rows_processed;
7169 l_tot_rows_failed := l_tot_rows_failed+l_part_rows_failed;
7170 l_tot_rows_warned := l_tot_rows_warned+l_part_rows_warned;
7171 l_part_rows_processed := 0;
7172 l_part_rows_failed := 0;
7173 l_part_rows_warned := 0;
7174 l_bulk_failed := 'N';
7175 ---------------------------------------------------------------------------
7176 --------------------- Inner Loop thru fetched rows for---------------------
7177 -- validation, parse and validate article text, create a variable list
7178 -- prepare rows for DML if validate_only is 'N'
7179 /*** Processing Rule to set process_status
7180 Because we want to collect as much info as possible, we need to
7181 maintain process status while keeping the process moving.
7182 So, we'll set l_return_status as validation goes on and
7183 at the end we will set inf_process_status_tbl(i) with l_return_status
7184 for final result. However, we will get out of this process if there
7185 is a significant error such as 'U'.
7186 The return status examined
7187 -api_return_status : return status for api call
7188 -l_return_status : validation result of each row
7189 -x_return_status : final result status for concurrent program request
7190 Rule to set return status
7191 If api_return_status for api call is
7192 * 'S' then continue
7193 * 'W' and l_return_status not 'E' or 'U' then set l_return_status = 'W'
7194 and build_error_array then continue
7195 * 'E' and it is significant then set l_return_status = 'E' and raise
7196 Exception
7197 * 'E' and it is minor then set l_return_status = 'E' and continue. Raise
7198 'E' at the end of validation
7199 * 'U' then set l_return_status = 'U' and raise 'U' exception
7200 * At the end, if it goes thru with no Exception,
7201 Check if l_return_status is 'E' then raise Exception
7202 Otherwise (meaning l_return_status is 'S' or 'W'),
7203 vsinf_process_status_tbl(i) = l_return_status
7204 * In the exception, we will set
7205 vsinf_process_status_tbl(i) = l_return_status and build_error_array
7206 ***/
7207 -------------------------------------------------------------------------
7208
7209 FOR i in vsinf_interface_id_tbl.FIRST ..vsinf_interface_id_tbl.LAST LOOP
7210 BEGIN
7211 -- Increment total processed rows
7212 --##Count
7213 l_part_rows_processed := l_part_rows_processed+1;
7214 -- Initialization for each iteration
7215 l_row_notfound := FALSE;
7216 l_return_status := G_RET_STS_SUCCESS;
7217
7218 l_context := 'VALUE SETS VALIDATING';
7219
7220 -- To find duplicate value set in the batch
7221 IF i>1 THEN
7222 x := i-1;
7223 IF RTRIM(vsinf_flex_value_set_name_tbl(i)) = RTRIM(vsinf_flex_value_set_name_tbl(x))
7224 THEN
7225 Okc_Api.Set_Message(G_APP_NAME, 'OKC_VALSET_DUP_TITLE','VALUESET',vsinf_flex_value_set_name_tbl(i));
7226 l_return_status := G_RET_STS_ERROR;
7227 RAISE FND_API.G_EXC_ERROR;
7228 END IF;
7229 END IF;
7230 -- Logic to decide what to do in case of Action='S'
7231
7232 IF vsinf_action_tbl(i) = 'S' THEN
7233 vsinf_action_tbl(i) := 'N';
7234 END IF;
7235
7236
7237 IF vsinf_action_tbl(i) = 'N' THEN
7238
7239 --TRIM trailing space because
7240 vsinf_flex_value_set_name_tbl(i) := RTRIM(vsinf_flex_value_set_name_tbl(i));
7241 -- Need to do some defaulting logic
7242 IF vsinf_format_type_tbl(i) = 'N' THEN
7243 vsinf_number_only_flag_tbl(i) := 'Y';
7244 vsinf_uppercase_only_flag_tbl(i) := 'N';
7245 END IF;
7246 IF vsinf_format_type_tbl(i) = 'C' THEN
7247 vsinf_number_only_flag_tbl(i) := 'N';
7248 END IF;
7249 IF vsinf_format_type_tbl(i) in ('X','Y') THEN
7250 vsinf_uppercase_only_flag_tbl(i) := 'Y';
7251 END IF;
7252 IF vsinf_format_type_tbl(i) = 'X' THEN
7253 vsinf_maximum_size_tbl(i) := 11;
7254 END IF;
7255 IF vsinf_format_type_tbl(i) = 'Y' THEN
7256 vsinf_maximum_size_tbl(i) := 20;
7257 END IF;
7258
7259 ELSE
7260
7261 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7262 p_msg_name => 'OKC_VALSET_INV_IMP_ACTION');
7263 l_return_status := G_RET_STS_ERROR;
7264 RAISE FND_API.G_EXC_ERROR ;
7265 END IF;
7266
7267 -----------------------------------------------------------
7268 -- Common validation or attribute settting
7269 -- regardless of status and import action
7270 -- this validation is not included in validate api
7271 -----------------------------------------------------------
7272 -- Check if value set already exists in the System
7273
7274 IF Fnd_Flex_Val_Api.Valueset_Exists(vsinf_flex_value_set_name_tbl(i)) THEN
7275 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7276 p_msg_name => 'OKC_IMP_VALSET_EXIST',
7277 p_token1 => 'VALUESET',
7278 p_token1_value => vsinf_flex_value_set_name_tbl(i)
7279 );
7280 l_return_status := G_RET_STS_ERROR;
7281 --RAISE FND_API.G_EXC_ERROR ;
7282 END IF;
7283
7284 -- Check if format_type is set properly
7285 -- 'N' for Numeric
7286 -- 'C' for Character
7287 -- 'X' for Standard Date in Canonical Format YYYY/MM/DD
7288 -- 'Y' for Standard DateTime in Canonical Format YYYY/MM/DD HH24:MI:SS
7289 -- For Standard Date , Default Max size is 11
7290 -- For Standard DateTime , Default Max size is 12
7291
7292 IF nvl(vsinf_format_type_tbl(i),'*') not in ('N','C','X','Y') THEN
7293 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7294 p_msg_name => 'OKC_INVALID_FORMATTYPE');
7295 l_return_status := G_RET_STS_ERROR;
7296 END IF;
7297
7298 -- Check if Max Value and Min Value is passed then it is as per Format Type
7299 IF vsinf_minimum_value_tbl(i) IS NOT NULL THEN
7300 IF NOT is_value_valid(vsinf_format_type_tbl(i),vsinf_minimum_value_tbl(i)) THEN
7301 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7302 p_msg_name => 'OKC_INVALID_MINIMUM_VALUE');
7303 l_return_status := G_RET_STS_ERROR;
7304
7305 END IF;
7306 END IF;
7307
7308 IF vsinf_maximum_value_tbl(i) IS NOT NULL THEN
7309 IF NOT is_value_valid(vsinf_format_type_tbl(i),vsinf_maximum_value_tbl(i)) THEN
7310 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7311 p_msg_name => 'OKC_INVALID_MAXIMUM_VALUE');
7312 l_return_status := G_RET_STS_ERROR;
7313 END IF;
7314 END IF;
7315 -- Check Maximum Value is always greater than Mimium Value
7316 IF vsinf_minimum_value_tbl(i) IS NOT NULL AND
7317 vsinf_maximum_value_tbl(i) IS NOT NULL
7318 THEN
7319 IF vsinf_format_type_tbl(i) = 'N' THEN
7320 IF to_number(vsinf_minimum_value_tbl(i)) >=
7321 to_number(vsinf_maximum_value_tbl(i)) THEN
7322 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7323 p_msg_name => 'OKC_INVALID_RANGE');
7324 l_return_status := G_RET_STS_ERROR;
7325 END IF;
7326 ELSIF vsinf_format_type_tbl(i) = 'C' THEN
7327 IF vsinf_minimum_value_tbl(i) >= vsinf_maximum_value_tbl(i) THEN
7328 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7329 p_msg_name => 'OKC_INVALID_RANGE');
7330 l_return_status := G_RET_STS_ERROR;
7331 END IF;
7332 ELSIF vsinf_format_type_tbl(i) in ('X','Y') THEN
7333 IF to_date(vsinf_minimum_value_tbl(i),'YYYY/MM/DD HH24:MI:SS') >=
7334 to_date(vsinf_maximum_value_tbl(i),'YYYY/MM/DD HH24:MI:SS') THEN
7335 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7336 p_msg_name => 'OKC_INVALID_RANGE');
7337 l_return_status := G_RET_STS_ERROR;
7338 END IF;
7339
7340 END IF;
7341 END IF;
7342
7343 -- Check if uppercase_only_flag is set properly
7344 IF vsinf_uppercase_only_flag_tbl(i) not in ('Y','N') THEN
7345 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7346 p_msg_name => 'OKC_INVALID_UPPERCASE_FLAG');
7347 l_return_status := G_RET_STS_ERROR;
7348 END IF;
7349
7350 -- Check if number_only_flag is set properly
7351 IF vsinf_number_only_flag_tbl(i) not in ('Y','N') THEN
7352 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7353 p_msg_name => 'OKC_INVALID_NUMBERONLY_FLAG');
7354 l_return_status := G_RET_STS_ERROR;
7355 END IF;
7356
7357 -- Check if format_type and number_only_flag is set properly
7358 IF vsinf_format_type_tbl(i) = 'N' AND
7359 vsinf_number_only_flag_tbl(i) = 'N' THEN
7360 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7361 p_msg_name => 'OKC_INVALID_FORMATTYPE');
7362 l_return_status := G_RET_STS_ERROR;
7363 END IF;
7364
7365 -- Check if format_type and uppercase_only_flag is set properly
7366 IF vsinf_format_type_tbl(i) = 'N' AND
7367 vsinf_uppercase_only_flag_tbl(i) = 'Y' THEN
7368 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7369 p_msg_name => 'OKC_INVALID_FORMATTYPE');
7370 l_return_status := G_RET_STS_ERROR;
7371 END IF;
7372
7373 -- Check if format_type and number_only_flag is set properly
7374 IF vsinf_format_type_tbl(i) = 'C' AND
7375 (vsinf_uppercase_only_flag_tbl(i) = 'Y' AND
7376 vsinf_number_only_flag_tbl(i) = 'Y') THEN
7377 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7378 p_msg_name => 'OKC_INVALID_FORMATTYPE');
7379 l_return_status := G_RET_STS_ERROR;
7380 END IF;
7381
7382 -- Check if format_type and maximum_size is set properly
7383 IF vsinf_format_type_tbl(i) = 'C' AND
7384 vsinf_maximum_size_tbl(i) > 999 THEN
7385 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7386 p_msg_name => 'OKC_INVALID_MAXIMUMSIZE');
7387 l_return_status := G_RET_STS_ERROR;
7388 END IF;
7389
7390 -- Check if format_type and maximum_size is set properly
7391 IF vsinf_format_type_tbl(i) = 'N' AND
7392 vsinf_maximum_size_tbl(i) > 38 THEN
7393 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7394 p_msg_name => 'OKC_INVALID_MAXIMUMSIZE');
7395 l_return_status := G_RET_STS_ERROR;
7396 END IF;
7397
7398 IF ( vsinf_number_precision_tbl(i) IS NOT NULL AND
7399 vsinf_format_type_tbl(i) <> 'N') THEN
7400 vsinf_number_precision_tbl(i) := NULL;
7401 END IF;
7402 /*
7403 -- Check if alphanumeric_allowed_flag is set properly
7404 IF nvl(vsinf_alphanumeric_allowed_flag_tbl(i), '*') not in ('Y','N') THEN
7405 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7406 p_msg_name => 'OKC_INVALID_ALPHANUMERIC_FLAG');
7407 l_return_status := G_RET_STS_ERROR;
7408 END IF;
7409 */
7410 -- Check if Validation Type is 'Independent' or 'None'
7411 IF nvl(vsinf_validation_type_tbl(i), '*') not in ('I','N') THEN
7412 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7413 p_msg_name => 'OKC_INVALID_VALIDATION_TYPE');
7414 l_return_status := G_RET_STS_ERROR;
7415 END IF;
7416
7417 ------------------------------------------------------------------------
7418 -- Now that we have validated and data is clean we can fetch sequences and ids
7419 -- for new relationships for DML and also set the process status to Success
7420 -------------------------------------------------------------------------
7421
7422 -- Summarize report for this row
7423 -- Status 'F' is for internal use meaning parsing failure marked in
7424 -- java concurrent program
7425 IF (l_return_status = G_RET_STS_SUCCESS) THEN
7426 IF (nvl(vsinf_process_status_tbl(i), 'E') = 'E') THEN
7427 vsinf_process_status_tbl(i) := G_RET_STS_SUCCESS;
7428 ELSIF ( vsinf_process_status_tbl(i) = 'F') THEN
7429 -- ##count parser failure as error
7430 --l_tot_rows_failed := l_tot_rows_failed+1;
7431 l_part_rows_failed := l_part_rows_failed+1;
7432 vsinf_process_status_tbl(i) := G_RET_STS_ERROR;
7433 END IF;
7434 ELSIF (l_return_status = l_sts_warning) THEN
7435 IF (nvl(vsinf_process_status_tbl(i),'E') = 'E') THEN
7436 vsinf_process_status_tbl(i) := l_sts_warning;
7437 --##count
7438 --l_tot_rows_warned := l_tot_rows_warned+1;
7439 l_part_rows_warned := l_part_rows_warned+1;
7440 ELSIF (vsinf_process_status_tbl(i) = 'F') THEN
7441 -- ##count parser failure as error
7442 --l_tot_rows_failed := l_tot_rows_failed+1;
7443 l_part_rows_failed := l_part_rows_failed+1;
7444 vsinf_process_status_tbl(i) := G_RET_STS_ERROR;
7445 END IF;
7446 ELSIF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
7447 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7448 ELSIF (l_return_status = G_RET_STS_ERROR) THEN
7449 RAISE FND_API.G_EXC_ERROR;
7450 END IF;
7451
7452 -------------------------
7453 -------------------------
7454 -- Exception Block for each iteration in Loop
7455 -- validation and unexpected errors
7456 -- In case of unexpected error, escape the loop
7457 -------------------------
7458 -------------------------
7459
7460
7461 EXCEPTION
7462 WHEN FND_API.G_EXC_ERROR THEN
7463 IF (l_debug = 'Y') THEN
7464 okc_debug.log('300: In Fnd_flex_value_sets_Import: OKC_API.G_EXCEPTION_ERROR Exception', 2);
7465 END IF;
7466 --l_return_status := G_RET_STS_ERROR ;
7467 build_error_array(
7468 p_msg_data => x_msg_data,
7469 p_context => l_context,
7470 p_batch_process_id => l_batch_process_id,
7471 p_interface_id => vsinf_interface_id_tbl(i),
7472 p_article_title => vsinf_flex_value_set_name_tbl(i),
7473 p_error_type => G_RET_STS_ERROR,
7474 p_entity => 'VALUESET'
7475 );
7476 vsinf_process_status_tbl(i) := G_RET_STS_ERROR;
7477 --##count
7478 --l_tot_rows_failed := l_tot_rows_failed+1;
7479 l_part_rows_failed := l_part_rows_failed+1;
7480 -- Continue to next row
7481
7482 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7483 IF (l_debug = 'Y') THEN
7484 okc_debug.log('400: Leaving Fnd_flex_value_sets_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
7485 END IF;
7486
7487 IF l_valset_interface_csr%ISOPEN THEN
7488 CLOSE l_valset_interface_csr;
7489 END IF;
7490
7491 --Set_Message
7492 l_return_status := G_RET_STS_UNEXP_ERROR ;
7493 x_return_status := G_RET_STS_UNEXP_ERROR ;
7494
7495 build_error_array(
7496 p_msg_data => x_msg_data,
7497 p_context => l_context,
7498 p_batch_process_id => l_batch_process_id,
7499 p_interface_id => vsinf_interface_id_tbl(i),
7500 p_article_title => vsinf_flex_value_set_name_tbl(i),
7501 p_error_type => G_RET_STS_UNEXP_ERROR,
7502 p_entity => 'VALUESET'
7503 );
7504 vsinf_process_status_tbl(i) := G_RET_STS_ERROR;
7505 --##count
7506 --l_tot_rows_failed := l_tot_rows_failed+1;
7507 l_part_rows_failed := l_part_rows_failed+1;
7508 exit; -- exit the current fetch
7509
7510 WHEN OTHERS THEN
7511 IF (l_debug = 'Y') THEN
7512 okc_debug.log('500: Leaving Fnd_flex_value_sets_Import because of EXCEPTION: '||sqlerrm, 2);
7513 END IF;
7514
7515 IF l_valset_interface_csr%ISOPEN THEN
7516 CLOSE l_valset_interface_csr;
7517 END IF;
7518
7519 l_return_status := G_RET_STS_UNEXP_ERROR ;
7520 x_return_status := G_RET_STS_UNEXP_ERROR ;
7521
7522 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7523 p_msg_name => G_UNEXPECTED_ERROR,
7524 p_token1 => G_SQLCODE_TOKEN,
7525 p_token1_value => sqlcode,
7526 p_token2 => G_SQLERRM_TOKEN,
7527 p_token2_value => sqlerrm);
7528
7529 build_error_array(
7530 p_msg_data => G_UNEXPECTED_ERROR,
7531 p_context => l_context,
7532 p_batch_process_id => l_batch_process_id,
7533 p_interface_id => vsinf_interface_id_tbl(i),
7534 p_article_title => vsinf_flex_value_set_name_tbl(i),
7535 p_error_type => G_RET_STS_ERROR,
7536 p_entity => 'VALUESET'
7537 );
7538 vsinf_process_status_tbl(i) := G_RET_STS_ERROR;
7539 --##count
7540 --l_tot_rows_failed := l_tot_rows_failed+1;
7541 l_part_rows_failed := l_part_rows_failed+1;
7542 exit; -- exit the current fetch
7543 END;
7544 -------------------------
7545 -------------------------
7546 -- Exception Block for each iteration in Loop ends
7547 -------------------------
7548 -------------------------
7549
7550
7551 END LOOP; -- end of FOR i in inf_interface_id_tbl.FIRST ..
7552 ------------------------------------------------------------------------
7553 -------------- End of Inner Loop thru fetched row for---------------------
7554 -- validation
7555 -------------------------------------------------------------------------
7556 -- In order to propagate Unexpected error raise it if it is 'U'
7557 IF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
7558 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
7559 END IF;
7560
7561 -------------------------
7562 -------------------------
7563 -- Exception Block for Inner Loop starts
7564 -- Handles unexpected errors as last step
7565 -------------------------
7566 -------------------------
7567 EXCEPTION
7568 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7569 IF (l_debug = 'Y') THEN
7570 okc_debug.log('400: Leaving Fnd_flex_value_sets_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
7571 END IF;
7572
7573 IF l_valset_interface_csr%ISOPEN THEN
7574 CLOSE l_valset_interface_csr;
7575 END IF;
7576 l_return_status := G_RET_STS_UNEXP_ERROR ;
7577 x_return_status := G_RET_STS_UNEXP_ERROR ;
7578 exit; -- exit outermost loop
7579
7580 WHEN OTHERS THEN
7581 IF (l_debug = 'Y') THEN
7582 okc_debug.log('500: Leaving Fnd_flex_value_sets_Import because of EXCEPTION: '||sqlerrm, 2);
7583 END IF;
7584
7585 IF l_valset_interface_csr%ISOPEN THEN
7586 CLOSE l_valset_interface_csr;
7587 END IF;
7588 l_return_status := G_RET_STS_UNEXP_ERROR ;
7589 x_return_status := G_RET_STS_UNEXP_ERROR ;
7590 exit; -- exit outermost loop
7591 END;
7592
7593 -------------------------
7594 -------------------------
7595 -- Exception Block for Each Iteration of outermost Loop ends
7596 -------------------------
7597 -------------------------
7598
7599 ------------------------------------------------------------------------
7600 --------------------- Start Do_DML for Fnd Flex Value Sets ---------------
7601 -- Insert Fnd Flex Value Sets
7602 -------------------------------------------------------------------------
7603 -- initialize l_return_status to track status of DML execution
7604 l_return_status := G_RET_STS_SUCCESS;
7605
7606
7607 IF p_validate_only = 'N' THEN
7608 BEGIN
7609 SAVEPOINT bulkdml;
7610
7611 i := 0;
7612 -- Bulk insert New Valid Records
7613 BEGIN
7614 l_context := 'INSERTING NEW VALUESETS INTO TABLE';
7615 FOR i in vsinf_interface_id_tbl.FIRST ..vsinf_interface_id_tbl.LAST LOOP
7616
7617 IF vsinf_action_tbl(i) = 'N' AND vsinf_process_status_tbl(i) in ('S','W') THEN
7618 IF vsinf_validation_type_tbl(i) = 'N' THEN
7619
7620 -- Set the Session Mode
7621 FND_FLEX_VAL_API.SET_SESSION_MODE('customer_data');
7622
7623 -- Call the API to create value set
7624 FND_FLEX_VAL_API.CREATE_VALUESET_NONE(
7625 VALUE_SET_NAME => vsinf_flex_value_set_name_tbl(i),
7626 DESCRIPTION => vsinf_description_tbl(i),
7627 SECURITY_AVAILABLE => 'N',
7628 ENABLE_LONGLIST => 'N',
7629 FORMAT_TYPE => vsinf_format_type_tbl(i),
7630 MAXIMUM_SIZE => vsinf_maximum_size_tbl(i),
7631 NUMBERS_ONLY => vsinf_number_only_flag_tbl(i),
7632 UPPERCASE_ONLY => vsinf_uppercase_only_flag_tbl(i),
7633 RIGHT_JUSTIFY_ZERO_FILL => 'N',
7634 MIN_VALUE => vsinf_minimum_value_tbl(i),
7635 MAX_VALUE => vsinf_maximum_value_tbl(i),
7636 PRECISION => vsinf_number_precision_tbl(i));
7637
7638 ELSIF vsinf_validation_type_tbl(i) = 'I' THEN
7639
7640 -- Set the Session Mode
7641 FND_FLEX_VAL_API.SET_SESSION_MODE('customer_data');
7642
7643 -- Call the API to create value set
7644 FND_FLEX_VAL_API.CREATE_VALUESET_INDEPENDENT(
7645 VALUE_SET_NAME => vsinf_flex_value_set_name_tbl(i),
7646 DESCRIPTION => vsinf_description_tbl(i),
7647 SECURITY_AVAILABLE => 'N',
7648 ENABLE_LONGLIST => 'N',
7649 FORMAT_TYPE => vsinf_format_type_tbl(i),
7650 MAXIMUM_SIZE => vsinf_maximum_size_tbl(i),
7651 NUMBERS_ONLY => vsinf_number_only_flag_tbl(i),
7652 UPPERCASE_ONLY => vsinf_uppercase_only_flag_tbl(i),
7653 RIGHT_JUSTIFY_ZERO_FILL => 'N',
7654 MIN_VALUE => vsinf_minimum_value_tbl(i),
7655 MAX_VALUE => vsinf_maximum_value_tbl(i),
7656 PRECISION => vsinf_number_precision_tbl(i));
7657
7658 END IF;
7659 END IF;
7660 END LOOP;
7661
7662 EXCEPTION
7663 WHEN OTHERS THEN
7664 IF (l_debug = 'Y') THEN
7665 okc_debug.log('500: Leaving Fnd_flex_value_sets_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
7666 END IF;
7667 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
7668 END;
7669
7670 --
7671 -- End of Insert into FND FLEX VALUE SETS
7672 --
7673 --
7674
7675
7676 -- Exception for bulk DML block
7677 EXCEPTION
7678 WHEN OTHERS THEN
7679 l_bulk_failed := 'Y'; -- indicating that bulk operation has failed
7680 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7681 p_msg_name => G_UNEXPECTED_ERROR,
7682 p_token1 => G_SQLCODE_TOKEN,
7683 p_token1_value => sqlcode,
7684 p_token2 => G_SQLERRM_TOKEN,
7685 p_token2_value => sqlerrm);
7686 Okc_API.Set_Message(p_app_name => G_APP_NAME,
7687 p_msg_name => 'OKC_ART_FETCH_FAILED',
7688 p_token1 => 'CONTEXT',
7689 p_token1_value => l_context);
7690
7691 build_error_array(
7692 p_msg_data => null,
7693 p_context => l_context,
7694 p_batch_process_id => l_batch_process_id,
7695 p_interface_id => -99,
7696 p_article_title => NULL,
7697 p_error_type => G_RET_STS_ERROR,
7698 p_entity => 'VALUESET'
7699 );
7700 l_return_status := G_RET_STS_UNEXP_ERROR;
7701 x_return_status := G_RET_STS_UNEXP_ERROR;
7702
7703 --##count:rollback the count
7704 l_part_rows_failed := l_part_rows_processed;
7705 l_part_rows_warned := 0;
7706
7707 ROLLBACK TO SAVEPOINT bulkdml;
7708 exit; -- exit outermost loop
7709 END;
7710
7711 END IF; --- validate_only = 'N'
7712
7713 ------------------------------------------------------------------------
7714 --------------------- End of Do_DML for Value sets ---------------
7715 -------------------------------------------------------------------------
7716
7717 ------------------------------------------------------------------------
7718 --------------- Start of Do_DML for import related tables ------------
7719 -- Update interface table
7720 -- Insert Errors into Error table
7721 -------------------------------------------------------------------------
7722 -- Update Interface Table
7723 i:=0;
7724 BEGIN
7725 l_context := 'UPDATING VALUE SETS INTERFACE TABLE';
7726 FORALL i in vsinf_interface_id_tbl.FIRST..vsinf_interface_id_tbl.LAST
7727 UPDATE OKC_VALUESETS_INTERFACE
7728 SET
7729 -- We don't want to update process_status to 'S' or 'W' in validation_mode
7730 -- because it is not going to be picked up in next run if we do so
7731 PROCESS_STATUS = decode(p_validate_only||vsinf_process_status_tbl(i)||l_bulk_failed,
7732 'NEN','E',
7733 'NSN','S',
7734 'NWN','W',
7735 'NEY','E',
7736 'NSY',NULL,
7737 'NWY',NULL,
7738 'YEY','E',
7739 'YEN','E',
7740 'NFY','E',
7741 'YFY','E',
7742 'NFN','E',
7743 'YFN','E',NULL),
7744 PROGRAM_ID = l_program_id,
7745 REQUEST_ID = l_request_id,
7746 PROGRAM_LOGIN_ID = l_program_login_id,
7747 PROGRAM_APPLICATION_ID = l_program_appl_id,
7748 OBJECT_VERSION_NUMBER = vsinf_obj_ver_number_tbl(i) + 1,
7749 LAST_UPDATED_BY = l_user_id,
7750 LAST_UPDATE_LOGIN = l_login_id,
7751 LAST_UPDATE_DATE = SYSDATE
7752 WHERE
7753 interface_id = vsinf_interface_id_tbl(i);
7754 EXCEPTION
7755 WHEN OTHERS THEN
7756 IF (l_debug = 'Y') THEN
7757 okc_debug.log('500: Leaving Fnd_flex_value_sets_Import because of EXCEPTION: '||sqlerrm, 2);
7758 END IF;
7759
7760 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7761 p_msg_name => G_UNEXPECTED_ERROR,
7762 p_token1 => G_SQLCODE_TOKEN,
7763 p_token1_value => sqlcode,
7764 p_token2 => G_SQLERRM_TOKEN,
7765 p_token2_value => sqlerrm);
7766 Okc_API.Set_Message(p_app_name => G_APP_NAME,
7767 p_msg_name => 'OKC_VALSET_INT_UPDATE_FAILED');
7768
7769 build_error_array(
7770 p_msg_data => null,
7771 p_context => l_context,
7772 p_batch_process_id => l_batch_process_id,
7773 p_interface_id => -99,
7774 p_article_title => NULL,
7775 p_error_type => G_RET_STS_ERROR,
7776 p_entity => 'VALUESET'
7777 );
7778
7779 l_return_status := G_RET_STS_UNEXP_ERROR ;
7780 x_return_status := G_RET_STS_UNEXP_ERROR ;
7781 --##count:rollback the count
7782 l_part_rows_failed := l_part_rows_processed;
7783 l_part_rows_warned := 0;
7784
7785 --RAISE FND_API.G_EXC_ERROR ;
7786 END;
7787 --
7788 -- End of Update OKC_VALUESETS_INTERFACE
7789 --
7790 --
7791
7792 --
7793 --Insert Errors into Error table for this fetch
7794 --
7795 insert_error_array(
7796 x_return_status => x_return_status,
7797 x_msg_count => x_msg_count,
7798 x_msg_data => x_msg_data
7799 );
7800
7801
7802 IF (x_return_status = l_insert_errors_error) THEN
7803 NULL;
7804 -- Ignore
7805 -- RAISE l_insert_errors_exception;
7806 END IF;
7807
7808 ------------------------------------------------------------------------
7809 --------------- End of Do_DML for import related tables ------------
7810 -------------------------------------------------------------------------
7811 commit;
7812
7813 -- Now delete cache for next bulk fetch
7814
7815 vsinf_interface_id_tbl.DELETE;
7816 vsinf_batch_number_tbl.DELETE;
7817 vsinf_obj_ver_number_tbl.DELETE;
7818 vsinf_flex_value_set_name_tbl.DELETE;
7819 vsinf_validation_type_tbl.DELETE;
7820 vsinf_process_status_tbl.DELETE;
7821 vsinf_action_tbl.DELETE;
7822 vsinf_format_type_tbl.DELETE;
7823 vsinf_maximum_size_tbl.DELETE;
7824 vsinf_description_tbl.DELETE;
7825 vsinf_minimum_value_tbl.DELETE;
7826 vsinf_maximum_value_tbl.DELETE;
7827 vsinf_number_precision_tbl.DELETE;
7828 vsinf_uppercase_only_flag_tbl.DELETE;
7829 vsinf_number_only_flag_tbl.DELETE;
7830
7831 err_batch_process_id_tbl.DELETE;
7832 err_article_title_tbl.DELETE;
7833 err_interface_id_tbl.DELETE;
7834 err_error_number_tbl.DELETE;
7835 err_object_version_number_tbl.DELETE;
7836 err_error_type_tbl.DELETE;
7837 err_entity_tbl.DELETE;
7838 err_error_description_tbl.DELETE;
7839
7840 EXIT WHEN l_valset_interface_csr%NOTFOUND;
7841 END LOOP;
7842
7843
7844 -----------------------------------------------------------------------
7845 -- End of outermost loop for bulk fetch
7846 -----------------------------------------------------------------------
7847
7848 IF l_valset_interface_csr%ISOPEN THEN
7849 CLOSE l_valset_interface_csr;
7850 END IF;
7851
7852
7853 --##count:add up last processed counts
7854 l_tot_rows_processed := l_tot_rows_processed + l_part_rows_processed;
7855 l_tot_rows_failed := l_tot_rows_failed + l_part_rows_failed;
7856 l_tot_rows_warned := l_tot_rows_warned + l_part_rows_warned;
7857
7858 --Update Batch Process Table as a last step
7859 UPDATE OKC_ART_INT_BATPROCS_ALL
7860 SET
7861 TOTAL_ROWS_PROCESSED = l_tot_rows_processed,
7862 TOTAL_ROWS_FAILED = l_tot_rows_failed,
7863 TOTAL_ROWS_WARNED = l_tot_rows_warned,
7864 END_DATE = SYSDATE,
7865 PROGRAM_ID = l_program_id,
7866 REQUEST_ID = l_request_id,
7867 PROGRAM_LOGIN_ID = l_program_login_id,
7868 PROGRAM_APPLICATION_ID = l_program_appl_id,
7869 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
7870 LAST_UPDATED_BY = l_user_id,
7871 LAST_UPDATE_LOGIN = l_login_id,
7872 LAST_UPDATE_DATE = SYSDATE
7873 WHERE
7874 BATCH_PROCESS_ID = l_batch_process_id
7875 AND ENTITY = 'Valueset';
7876 IF err_error_number_tbl.COUNT > 0 THEN
7877 insert_error_array(
7878 x_return_status => x_return_status,
7879 x_msg_count => x_msg_count,
7880 x_msg_data => x_msg_data
7881 );
7882 END IF;
7883
7884 -- Print statistic of this run in the log
7885 -- Commented for new XML Based Import - Moved to new_wrap_up in conc_import_articles
7886 --wrap_up(p_validate_only,p_batch_number,l_tot_rows_processed,l_tot_rows_failed,l_tot_rows_warned,l_batch_process_id,'VALUESET');
7887 commit; -- Final commit for status update
7888
7889 IF (l_debug = 'Y') THEN
7890 okc_debug.log('2000: Leaving Fnd_flex_value_sets import', 2);
7891 END IF;
7892 --x_return_status := l_return_status; this may cause to erase error x_return_status
7893
7894 EXCEPTION
7895
7896 WHEN FND_API.G_EXC_ERROR THEN
7897 IF (l_debug = 'Y') THEN
7898 okc_debug.log('3000: Leaving Fnd_flex_value_sets_Import: OKC_API.G_EXCEPTION_ERROR Exception', 2);
7899 END IF;
7900 --Insert Errors into Error table if there is any
7901 insert_error_array(
7902 x_return_status => x_return_status,
7903 x_msg_count => x_msg_count,
7904 x_msg_data => x_msg_data
7905 );
7906 x_return_status := G_RET_STS_ERROR ;
7907
7908 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7909 IF (l_debug = 'Y') THEN
7910 okc_debug.log('4000: Leaving Fnd_flex_value_sets_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
7911 END IF;
7912 --Insert Errors into Error table if there is any
7913
7914 insert_error_array(
7915 x_return_status => x_return_status,
7916 x_msg_count => x_msg_count,
7917 x_msg_data => x_msg_data
7918 );
7919 commit;
7920
7921 IF l_valset_interface_csr%ISOPEN THEN
7922 CLOSE l_valset_interface_csr;
7923 END IF;
7924
7925 x_return_status := G_RET_STS_UNEXP_ERROR ;
7926 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
7927 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
7928 END IF;
7929 get_print_msgs_stack(p_msg_data => x_msg_data);
7930
7931 WHEN l_insert_errors_exception THEN
7932 --
7933 -- In this exception handling, we don't insert error array again
7934 -- because error happend in the module
7935 --
7936 IF (l_debug = 'Y') THEN
7937 okc_debug.log('5000: Leaving Fnd_flex_value_sets_Import because of EXCEPTION in insert_error_array: '||sqlerrm, 2);
7938 END IF;
7939
7940 IF l_valset_interface_csr%ISOPEN THEN
7941 CLOSE l_valset_interface_csr;
7942 END IF;
7943
7944
7945 --x_return_status := G_RET_STS_UNEXP_ERROR ;
7946 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
7947 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
7948 END IF;
7949 get_print_msgs_stack(p_msg_data => x_msg_data);
7950 commit;
7951
7952 WHEN OTHERS THEN
7953 IF (l_debug = 'Y') THEN
7954 okc_debug.log('5000: Leaving Fnd_flex_value_sets_Import because of EXCEPTION: '||sqlerrm, 2);
7955 END IF;
7956 --Insert Errors into Error table if there is any
7957 insert_error_array(
7958 x_return_status => x_return_status,
7959 x_msg_count => x_msg_count,
7960 x_msg_data => x_msg_data
7961 );
7962 commit;
7963 --
7964 IF l_valset_interface_csr%ISOPEN THEN
7965 CLOSE l_valset_interface_csr;
7966 END IF;
7967
7968 x_return_status := G_RET_STS_UNEXP_ERROR ;
7969 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
7970 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
7971 END IF;
7972 get_print_msgs_stack(p_msg_data => x_msg_data);
7973 END import_fnd_flex_value_sets;
7974
7975 PROCEDURE import_fnd_flex_values(
7976 x_return_status OUT NOCOPY VARCHAR2,
7977 x_msg_count OUT NOCOPY NUMBER,
7978 x_msg_data OUT NOCOPY VARCHAR2,
7979
7980 p_batch_procs_id IN NUMBER,
7981 p_batch_number IN VARCHAR2,
7982 p_validate_only IN VARCHAR2 := 'Y',
7983 p_fetchsize IN NUMBER := 100
7984 ) IS
7985 l_api_version CONSTANT NUMBER := 1;
7986 l_api_name CONSTANT VARCHAR2(30) := 'import_fnd_flex_values';
7987 l_sts_warning CONSTANT VARCHAR2(1) := 'W';
7988 l_row_notfound BOOLEAN := FALSE;
7989 l_user_id NUMBER;
7990 l_login_id NUMBER;
7991 l_insert_errors_exception EXCEPTION;
7992 l_insert_errors_error CONSTANT VARCHAR2(1) := 'X';
7993
7994 CURSOR l_val_interface_csr ( cp_batch_number IN VARCHAR2) IS
7995 SELECT
7996 VINT.INTERFACE_ID ,
7997 VINT.BATCH_NUMBER ,
7998 VINT.OBJECT_VERSION_NUMBER ,
7999 VINT.FLEX_VALUE_SET_NAME ,
8000 VINT.FLEX_VALUE ,
8001 VINT.PROCESS_STATUS ,
8002 VINT.ACTION ,
8003 VINT.ENABLED_FLAG ,
8004 VINT.START_DATE_ACTIVE ,
8005 VINT.END_DATE_ACTIVE ,
8006 VINT.LANGUAGE ,
8007 VINT.DESCRIPTION ,
8008 VINT.FLEX_VALUE_MEANING ,
8009 VS.FLEX_VALUE_SET_ID ,
8010 VS.VALIDATION_TYPE ,
8011 VS.FORMAT_TYPE ,
8012 VS.MAXIMUM_SIZE ,
8013 VS.NUMBER_PRECISION ,
8014 VS.ALPHANUMERIC_ALLOWED_FLAG,
8015 VS.UPPERCASE_ONLY_FLAG ,
8016 VS.NUMERIC_MODE_ENABLED_FLAG,
8017 VS.MINIMUM_VALUE ,
8018 VS.MAXIMUM_VALUE ,
8019 TO_NUMBER(NULL) FLEX_VALUE_ID
8020 FROM OKC_VS_VALUES_INTERFACE VINT,FND_FLEX_VALUE_SETS VS
8021 WHERE VINT.FLEX_VALUE_SET_NAME = VS.FLEX_VALUE_SET_NAME
8022 AND nvl(PROCESS_STATUS,'*') NOT IN ('W', 'S')
8023 AND BATCH_NUMBER = cp_batch_number
8024 UNION ALL
8025 SELECT
8026 VINT.INTERFACE_ID ,
8027 VINT.BATCH_NUMBER ,
8028 VINT.OBJECT_VERSION_NUMBER ,
8029 VINT.FLEX_VALUE_SET_NAME ,
8030 VINT.FLEX_VALUE ,
8031 VINT.PROCESS_STATUS ,
8032 VINT.ACTION ,
8033 VINT.ENABLED_FLAG ,
8034 VINT.START_DATE_ACTIVE ,
8035 VINT.END_DATE_ACTIVE ,
8036 VINT.LANGUAGE ,
8037 VINT.DESCRIPTION ,
8038 VINT.FLEX_VALUE_MEANING ,
8039 TO_NUMBER(NULL) FLEX_VALUE_SET_ID ,
8040 VS.VALIDATION_TYPE ,
8041 VS.FORMAT_TYPE ,
8042 VS.MAXIMUM_SIZE ,
8043 VS.NUMBER_PRECISION ,
8044 TO_CHAR(NULL) ALPHANUMERIC_ALLOWED_FLAG,
8045 VS.UPPERCASE_ONLY_FLAG ,
8046 VS.NUMBER_ONLY_FLAG NUMERIC_MODE_ENABLED_FLAG,
8047 VS.MINIMUM_VALUE ,
8048 VS.MAXIMUM_VALUE ,
8049 TO_NUMBER(NULL) FLEX_VALUE_ID
8050 FROM OKC_VS_VALUES_INTERFACE VINT,OKC_VALUESETS_INTERFACE VS
8051 WHERE VINT.FLEX_VALUE_SET_NAME = VS.FLEX_VALUE_SET_NAME (+)
8052 AND VINT.BATCH_NUMBER = VS.BATCH_NUMBER (+)
8053 AND nvl(VS.PROCESS_STATUS,'*') NOT IN ('E')
8054 AND VINT.BATCH_NUMBER = cp_batch_number
8055 AND NOT EXISTS
8056 ( SELECT 1 FROM FND_FLEX_VALUE_SETS FVS
8057 WHERE FVS.FLEX_VALUE_SET_NAME = VINT.FLEX_VALUE_SET_NAME)
8058 ORDER BY FLEX_VALUE_SET_NAME,FLEX_VALUE ASC;
8059
8060
8061 CURSOR l_val_exist_csr ( l_flex_value IN VARCHAR2, l_flex_value_set_id IN NUMBER ) IS
8062 SELECT
8063 B.FLEX_VALUE_SET_ID ,
8064 B.FLEX_VALUE_ID ,
8065 B.FLEX_VALUE ,
8066 B.START_DATE_ACTIVE ,
8067 B.END_DATE_ACTIVE
8068 FROM FND_FLEX_VALUES B,FND_FLEX_VALUES_TL T
8069 WHERE B.FLEX_VALUE_ID = T.FLEX_VALUE_ID
8070 AND T.LANGUAGE = userenv('LANG')
8071 AND B.FLEX_VALUE = l_flex_value
8072 AND B.FLEX_VALUE_SET_ID = l_flex_value_set_id;
8073
8074 -- Cursor to check valueset in the valueset interface Table
8075 CURSOR valset_exists_csr (cp_vs_name IN VARCHAR2,
8076 cp_batch_number IN VARCHAR2) IS
8077 SELECT '1'
8078 FROM OKC_VALUESETS_INTERFACE
8079 WHERE flex_value_set_name = cp_vs_name
8080 AND batch_number = cp_batch_number
8081 AND nvl(process_status,'X') not in ('E');
8082
8083
8084 -- Flex Values Interface Rows
8085
8086 TYPE l_vinf_interface_id IS TABLE OF OKC_VS_VALUES_INTERFACE.INTERFACE_ID%TYPE INDEX BY BINARY_INTEGER ;
8087 TYPE l_vinf_batch_number IS TABLE OF OKC_VS_VALUES_INTERFACE.BATCH_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
8088 TYPE l_vinf_obj_ver_number IS TABLE OF OKC_VS_VALUES_INTERFACE.OBJECT_VERSION_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
8089 TYPE l_vinf_flex_value_set_name IS TABLE OF OKC_VS_VALUES_INTERFACE.FLEX_VALUE_SET_NAME%TYPE INDEX BY BINARY_INTEGER ;
8090 TYPE l_vinf_flex_value IS TABLE OF OKC_VS_VALUES_INTERFACE.FLEX_VALUE%TYPE INDEX BY BINARY_INTEGER ;
8091 TYPE l_vinf_process_status IS TABLE OF OKC_VS_VALUES_INTERFACE.PROCESS_STATUS%TYPE INDEX BY BINARY_INTEGER ;
8092 TYPE l_vinf_action IS TABLE OF OKC_VS_VALUES_INTERFACE.ACTION%TYPE INDEX BY BINARY_INTEGER ;
8093 TYPE l_vinf_enabled_flag IS TABLE OF OKC_VS_VALUES_INTERFACE.ENABLED_FLAG%TYPE INDEX BY BINARY_INTEGER ;
8094 TYPE l_vinf_start_date_active IS TABLE OF OKC_VS_VALUES_INTERFACE.START_DATE_ACTIVE%TYPE INDEX BY BINARY_INTEGER ;
8095 TYPE l_vinf_end_date_active IS TABLE OF OKC_VS_VALUES_INTERFACE.END_DATE_ACTIVE%TYPE INDEX BY BINARY_INTEGER ;
8096 TYPE l_vinf_language IS TABLE OF OKC_VS_VALUES_INTERFACE.LANGUAGE%TYPE INDEX BY BINARY_INTEGER ;
8097 TYPE l_vinf_description IS TABLE OF OKC_VS_VALUES_INTERFACE.DESCRIPTION%TYPE INDEX BY BINARY_INTEGER ;
8098 TYPE l_vinf_flex_value_meaning IS TABLE OF OKC_VS_VALUES_INTERFACE.FLEX_VALUE_MEANING%TYPE INDEX BY BINARY_INTEGER ;
8099
8100
8101 TYPE l_vinf_flex_value_id IS TABLE OF FND_FLEX_VALUES.flex_value_id%TYPE INDEX BY BINARY_INTEGER ;
8102 TYPE l_vinf_value_set_id IS TABLE OF FND_FLEX_VALUE_SETS.flex_value_set_id%TYPE INDEX BY BINARY_INTEGER ;
8103 TYPE l_vinf_validation_type IS TABLE OF FND_FLEX_VALUE_SETS.VALIDATION_TYPE%TYPE INDEX BY BINARY_INTEGER ;
8104 TYPE l_vinf_format_type IS TABLE OF FND_FLEX_VALUE_SETS.FORMAT_TYPE%TYPE INDEX BY BINARY_INTEGER ;
8105 TYPE l_vinf_maximum_size IS TABLE OF FND_FLEX_VALUE_SETS.MAXIMUM_SIZE%TYPE INDEX BY BINARY_INTEGER ;
8106 TYPE l_vinf_number_precision IS TABLE OF FND_FLEX_VALUE_SETS.NUMBER_PRECISION%TYPE INDEX BY BINARY_INTEGER ;
8107 TYPE l_vinf_alphanum_allowed IS TABLE OF FND_FLEX_VALUE_SETS.ALPHANUMERIC_ALLOWED_FLAG%TYPE INDEX BY BINARY_INTEGER ;
8108 TYPE l_vinf_uppercase_only IS TABLE OF FND_FLEX_VALUE_SETS.UPPERCASE_ONLY_FLAG%TYPE INDEX BY BINARY_INTEGER ;
8109 TYPE l_vinf_num_mode_enabled IS TABLE OF FND_FLEX_VALUE_SETS.NUMERIC_MODE_ENABLED_FLAG%TYPE INDEX BY BINARY_INTEGER ;
8110 TYPE l_vinf_maximum_value IS TABLE OF FND_FLEX_VALUE_SETS.MAXIMUM_VALUE%TYPE INDEX BY BINARY_INTEGER ;
8111 TYPE l_vinf_minimum_value IS TABLE OF FND_FLEX_VALUE_SETS.MINIMUM_VALUE%TYPE INDEX BY BINARY_INTEGER ;
8112
8113
8114 TYPE l_vinf_flex_value_orig IS TABLE OF OKC_VS_VALUES_INTERFACE.FLEX_VALUE%TYPE INDEX BY BINARY_INTEGER ;
8115
8116 l_return_status VARCHAR2(1);
8117 l_error_index NUMBER := 1;
8118 l_batch_process_id NUMBER := 1;
8119 l_context VARCHAR2(50) := NULL;
8120 l_init_msg_list VARCHAR2(200) := okc_api.g_true;
8121 l_tot_rows_processed NUMBER := 0;
8122 l_tot_rows_failed NUMBER := 0;
8123 l_tot_rows_warned NUMBER := 0;
8124 l_part_rows_processed NUMBER := 0;
8125 l_part_rows_failed NUMBER := 0;
8126 l_part_rows_warned NUMBER := 0;
8127 l_bulk_failed VARCHAR2(1) := 'Y';
8128
8129 -- Variables for flex values interface
8130 vinf_interface_id_tbl l_vinf_interface_id ;
8131 vinf_batch_number_tbl l_vinf_batch_number ;
8132 vinf_obj_ver_number_tbl l_vinf_obj_ver_number ;
8133 vinf_flex_value_set_name_tbl l_vinf_flex_value_set_name ;
8134 vinf_flex_value_tbl l_vinf_flex_value ;
8135 vinf_process_status_tbl l_vinf_process_status ;
8136 vinf_action_tbl l_vinf_action ;
8137 vinf_enabled_flag_tbl l_vinf_enabled_flag ;
8138 vinf_start_date_active_tbl l_vinf_start_date_active ;
8139 vinf_end_date_active_tbl l_vinf_end_date_active ;
8140 vinf_language_tbl l_vinf_language ;
8141 vinf_description_tbl l_vinf_description ;
8142 vinf_flex_value_meaning_tbl l_vinf_flex_value_meaning ;
8143
8144 vinf_flex_value_id_tbl l_vinf_flex_value_id ;
8145 vinf_value_set_id_tbl l_vinf_value_set_id ;
8146 vinf_validation_type_tbl l_vinf_validation_type ;
8147 vinf_format_type_tbl l_vinf_format_type ;
8148 vinf_maximum_size_tbl l_vinf_maximum_size ;
8149 vinf_number_precision_tbl l_vinf_number_precision ;
8150 vinf_alphanum_allowed_tbl l_vinf_alphanum_allowed ;
8151 vinf_uppercase_only_tbl l_vinf_uppercase_only ;
8152 vinf_num_mode_enabled_tbl l_vinf_num_mode_enabled ;
8153 vinf_maximum_value_tbl l_vinf_maximum_value ;
8154 vinf_minimum_value_tbl l_vinf_minimum_value ;
8155
8156 --vinf_flex_value_orig_tbl l_vinf_flex_value_orig ;
8157
8158 I NUMBER := 0;
8159 j NUMBER := 0;
8160 k NUMBER := 0;
8161 x NUMBER := 0;
8162 l_program_id OKC_VS_VALUES_INTERFACE.PROGRAM_ID%TYPE;
8163 l_program_login_id OKC_VS_VALUES_INTERFACE.PROGRAM_LOGIN_ID%TYPE;
8164 l_program_appl_id OKC_VS_VALUES_INTERFACE.PROGRAM_APPLICATION_ID%TYPE;
8165 l_request_id OKC_VS_VALUES_INTERFACE.REQUEST_ID%TYPE;
8166 l_rowid ROWID;
8167 api_return_status VARCHAR2(1);
8168 l_tmp_return_status VARCHAR2(1) := G_RET_STS_SUCCESS;
8169 l_display_value VARCHAR2(2000);
8170 l_storage_value VARCHAR2(32000);
8171
8172
8173 l_flex_value_set_id NUMBER;
8174 l_flex_value_id NUMBER;
8175 l_flex_value VARCHAR2(150);
8176 l_start_date DATE;
8177 l_end_date DATE;
8178 l_vs_name VARCHAR2(1) := NULL;
8179
8180
8181 BEGIN
8182 IF (l_debug = 'Y') THEN
8183 okc_debug.log('100: Entered values_import', 2);
8184 END IF;
8185
8186
8187 ------------------------------------------------------------------------
8188 -- Variable Initialization
8189 -------------------------------------------------------------------------
8190
8191 -- Standard Start of API savepoint
8192 FND_MSG_PUB.initialize;
8193 -- Initialize API return status to success
8194 x_return_status := FND_API.G_RET_STS_SUCCESS;
8195 l_return_status := G_RET_STS_SUCCESS;
8196 -- Cache user_id, login_id and org_id
8197 l_user_id := Fnd_Global.user_id;
8198 l_login_id := Fnd_Global.login_id;
8199
8200 IF FND_GLOBAL.CONC_PROGRAM_ID = -1 THEN
8201 l_program_id := NULL;
8202 ELSE
8203 l_program_id := FND_GLOBAL.CONC_PROGRAM_ID;
8204 END IF;
8205
8206 IF FND_GLOBAL.CONC_LOGIN_ID = -1 THEN
8207 l_program_login_id := NULL;
8208 ELSE
8209 l_program_login_id := FND_GLOBAL.CONC_LOGIN_ID;
8210 END IF;
8211
8212 IF FND_GLOBAL.PROG_APPL_ID = -1 THEN
8213 l_program_appl_id := NULL;
8214 ELSE
8215 l_program_appl_id := FND_GLOBAL.PROG_APPL_ID;
8216 END IF;
8217
8218 IF FND_GLOBAL.CONC_REQUEST_ID = -1 THEN
8219 l_request_id := NULL;
8220 ELSE
8221 l_request_id := FND_GLOBAL.CONC_REQUEST_ID;
8222 END IF;
8223
8224
8225 l_batch_process_id := p_batch_procs_id;
8226 -------------------------------------------------------------------------
8227 --------------- the outermost loop of this procedure --------------------
8228 -- Bulk fetch all interface rows based on the fetchsize passedby the user
8229 -------------------------------------------------------------------------
8230
8231 l_context :='BULK FETCH FLEX VALUES INTERFACE ROW';
8232 OPEN l_val_interface_csr ( p_batch_number );
8233 LOOP
8234 BEGIN
8235 FETCH l_val_interface_csr BULK COLLECT INTO
8236 vinf_interface_id_tbl ,
8237 vinf_batch_number_tbl ,
8238 vinf_obj_ver_number_tbl ,
8239 vinf_flex_value_set_name_tbl ,
8240 vinf_flex_value_tbl ,
8241 vinf_process_status_tbl ,
8242 vinf_action_tbl ,
8243 vinf_enabled_flag_tbl ,
8244 vinf_start_date_active_tbl ,
8245 vinf_end_date_active_tbl ,
8246 vinf_language_tbl ,
8247 vinf_description_tbl ,
8248 vinf_flex_value_meaning_tbl ,
8249 vinf_value_set_id_tbl ,
8250 vinf_validation_type_tbl ,
8251 vinf_format_type_tbl ,
8252 vinf_maximum_size_tbl ,
8253 vinf_number_precision_tbl ,
8254 vinf_alphanum_allowed_tbl ,
8255 vinf_uppercase_only_tbl ,
8256 vinf_num_mode_enabled_tbl ,
8257 vinf_maximum_value_tbl ,
8258 vinf_minimum_value_tbl ,
8259 vinf_flex_value_id_tbl LIMIT p_fetchsize;
8260 EXIT WHEN vinf_interface_id_tbl.COUNT = 0 ;
8261
8262 ------------------------------------------------------------------------
8263 -- Variable initialization
8264 -------------------------------------------------------------------------
8265 --For each fetch, value variable table index should be initialized
8266 j := 1;
8267 --##count:initialization
8268 l_tot_rows_processed := l_tot_rows_processed+l_part_rows_processed;
8269 l_tot_rows_failed := l_tot_rows_failed+l_part_rows_failed;
8270 l_tot_rows_warned := l_tot_rows_warned+l_part_rows_warned;
8271 l_part_rows_processed := 0;
8272 l_part_rows_failed := 0;
8273 l_part_rows_warned := 0;
8274 l_bulk_failed := 'N';
8275 ---------------------------------------------------------------------------
8276 --------------------- Inner Loop thru fetched rows for---------------------
8277 -- validation, parse and validate article text, create a variable list
8278 -- prepare rows for DML if validate_only is 'N'
8279 /*** Processing Rule to set process_status
8280 Because we want to collect as much info as possible, we need to
8281 maintain process status while keeping the process moving.
8282 So, we'll set l_return_status as validation goes on and
8283 at the end we will set inf_process_status_tbl(i) with l_return_status
8284 for final result. However, we will get out of this process if there
8285 is a significant error such as 'U'.
8286 The return status examined
8287 -api_return_status : return status for api call
8288 -l_return_status : validation result of each row
8289 -x_return_status : final result status for concurrent program request
8290 Rule to set return status
8291 If api_return_status for api call is
8292 * 'S' then continue
8293 * 'W' and l_return_status not 'E' or 'U' then set l_return_status = 'W'
8294 and build_error_array then continue
8295 * 'E' and it is significant then set l_return_status = 'E' and raise
8296 Exception
8297 * 'E' and it is minor then set l_return_status = 'E' and continue. Raise
8298 'E' at the end of validation
8299 * 'U' then set l_return_status = 'U' and raise 'U' exception
8300 * At the end, if it goes thru with no Exception,
8301 Check if l_return_status is 'E' then raise Exception
8302 Otherwise (meaning l_return_status is 'S' or 'W'),
8303 vinf_process_status_tbl(i) = l_return_status
8304 * In the exception, we will set
8305 vinf_process_status_tbl(i) = l_return_status and build_error_array
8306 ***/
8307 -------------------------------------------------------------------------
8308
8309 FOR i in vinf_interface_id_tbl.FIRST ..vinf_interface_id_tbl.LAST LOOP
8310 BEGIN
8311 -- Increment total processed rows
8312 --##Count
8313 l_part_rows_processed := l_part_rows_processed+1;
8314 -- Initialization for each iteration
8315 l_row_notfound := FALSE;
8316 l_return_status := G_RET_STS_SUCCESS;
8317
8318 l_context := 'VALUES VALIDATING';
8319
8320 -- To find duplicate values in the same valueset in the batch
8321 IF i>1 THEN
8322 x := i-1;
8323 IF RTRIM(vinf_flex_value_set_name_tbl(i)) = RTRIM(vinf_flex_value_set_name_tbl(x)) AND
8324 RTRIM(vinf_flex_value_tbl(i)) = RTRIM(vinf_flex_value_tbl(x))
8325 THEN
8326 Okc_Api.Set_Message(G_APP_NAME,
8327 'OKC_VALSET_VAL_DUP_TITLE',
8328 'VALUE',
8329 vinf_flex_value_tbl(i),
8330 'VALSET',
8331 vinf_flex_value_set_name_tbl(i)
8332 );
8333 l_return_status := G_RET_STS_ERROR;
8334 RAISE FND_API.G_EXC_ERROR;
8335 END IF;
8336 END IF;
8337 -- Logic to decide what to do in case of Action='S'
8338
8339 IF vinf_action_tbl(i) = 'S' THEN
8340 vinf_action_tbl(i) := 'N';
8341 END IF;
8342
8343
8344 IF vinf_action_tbl(i) = 'N' THEN
8345 -- Check if value set already exists in the System
8346 IF NOT Fnd_Flex_Val_Api.Valueset_Exists(vinf_flex_value_set_name_tbl(i)) THEN
8347 IF p_validate_only = 'N' THEN
8348 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8349 p_msg_name => 'OKC_VALSET_NOT_EXISTS',
8350 p_token1 => 'VALUE',
8351 p_token1_value => vinf_flex_value_tbl(i),
8352 p_token2 => 'VALSET',
8353 p_token2_value => vinf_flex_value_set_name_tbl(i)
8354 );
8355 l_return_status := G_RET_STS_ERROR;
8356 RAISE FND_API.G_EXC_ERROR;
8357 ELSE
8358 IF vinf_validation_type_tbl(i) IS NULL AND vinf_format_type_tbl(i) IS NULL THEN
8359 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8360 p_msg_name => 'OKC_VALSET_NOT_EXISTS',
8361 p_token1 => 'VALUE',
8362 p_token1_value => vinf_flex_value_tbl(i),
8363 p_token2 => 'VALSET',
8364 p_token2_value => vinf_flex_value_set_name_tbl(i)
8365 );
8366 l_return_status := G_RET_STS_ERROR;
8367 RAISE FND_API.G_EXC_ERROR;
8368 END IF;
8369 END IF;
8370 END IF;
8371 END IF;
8372
8373 IF vinf_action_tbl(i) = 'N' THEN
8374
8375 --TRIM trailing space because
8376 vinf_flex_value_set_name_tbl(i) := RTRIM(vinf_flex_value_set_name_tbl(i));
8377 vinf_flex_value_tbl(i) := RTRIM(vinf_flex_value_tbl(i));
8378 -- Store original value before converting to display format
8379 --vinf_flex_value_orig_tbl(i) := vinf_flex_value_orig_tbl(i);
8380
8381 -- Need to convert flex value to display format
8382 vinf_flex_value_tbl(i) := Fnd_Flex_Val_Util.to_display_value
8383 (p_value => vinf_flex_value_tbl(i),
8384 p_vset_format => vinf_format_type_tbl(i),
8385 p_vset_name => vinf_flex_value_set_name_tbl(i),
8386 p_max_length => vinf_maximum_size_tbl(i),
8387 p_precision => vinf_number_precision_tbl(i),
8388 p_alpha_allowed => vinf_alphanum_allowed_tbl(i),
8389 p_uppercase_only => vinf_uppercase_only_tbl(i),
8390 p_zero_fill => vinf_num_mode_enabled_tbl(i),
8391 p_min_value => vinf_minimum_value_tbl(i),
8392 p_max_value => vinf_maximum_value_tbl(i));
8393
8394 ELSIF vinf_action_tbl(i) = 'D' THEN
8395 IF vinf_end_date_active_tbl(i) IS NULL THEN
8396 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8397 p_msg_name => 'OKC_NULL_END_DATE');
8398 l_return_status := G_RET_STS_ERROR;
8399 RAISE FND_API.G_EXC_ERROR;
8400 END IF;
8401
8402 -- Check if value exists in the system or not
8403 OPEN l_val_exist_csr(vinf_flex_value_tbl(i),vinf_value_set_id_tbl(i));
8404 FETCH l_val_exist_csr INTO l_flex_value_set_id,
8405 l_flex_value_id,
8406 l_flex_value,
8407 l_start_date,
8408 l_end_date;
8409 IF l_val_exist_csr%NOTFOUND THEN
8410 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8411 p_msg_name => 'OKC_INVALID_VS_VALUE',
8412 p_token1=> 'VALUE',
8413 p_token1_value => vinf_flex_value_tbl(i),
8414 p_token2=> 'VALSET',
8415 p_token2_value => vinf_flex_value_set_name_tbl(i));
8416 l_return_status := G_RET_STS_ERROR;
8417 RAISE FND_API.G_EXC_ERROR;
8418
8419 ELSE
8420
8421 IF l_start_date IS NOT NULL
8422 THEN
8423 IF l_start_date > vinf_end_date_active_tbl(i) THEN
8424 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8425 p_msg_name => 'OKC_INVALID_END_DATE');
8426 l_return_status := G_RET_STS_ERROR;
8427 RAISE FND_API.G_EXC_ERROR;
8428 END IF;
8429 END IF;
8430 END IF;
8431
8432 CLOSE l_val_exist_csr;
8433 ELSE
8434
8435 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8436 p_msg_name => 'OKC_VAL_INV_IMP_ACTION');
8437 l_return_status := G_RET_STS_ERROR;
8438 RAISE FND_API.G_EXC_ERROR ;
8439 END IF;
8440
8441 -----------------------------------------------------------
8442 -- Common validation or attribute settting
8443 -- regardless of status and import action
8444 -- this validation is not included in validate api
8445 -----------------------------------------------------------
8446 IF vinf_action_tbl(i) = 'N' THEN
8447 /*
8448 -- Check if value set already exists in the System
8449 IF NOT Fnd_Flex_Val_Api.Valueset_Exists(vinf_flex_value_set_name_tbl(i)) THEN
8450 IF p_validate_only = 'N' THEN
8451 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8452 p_msg_name => 'OKC_VALSET_NOT_EXISTS',
8453 p_token1 => 'VALUE',
8454 p_token1_value => vinf_flex_value_tbl(i),
8455 p_token2 => 'VALSET',
8456 p_token2_value => vinf_flex_value_set_name_tbl(i)
8457 );
8458 l_return_status := G_RET_STS_ERROR;
8459 ELSE
8460 IF vinf_validation_type_tbl(i) IS NULL AND vinf_format_type_tbl(i) IS NULL THEN
8461 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8462 p_msg_name => 'OKC_VALSET_NOT_EXISTS',
8463 p_token1 => 'VALUE',
8464 p_token1_value => vinf_flex_value_tbl(i),
8465 p_token2 => 'VALSET',
8466 p_token2_value => vinf_flex_value_set_name_tbl(i)
8467 );
8468 l_return_status := G_RET_STS_ERROR;
8469 END IF;
8470 END IF;
8471 END IF;
8472 */
8473
8474
8475 -- Check if Validation Type for value set is 'I' otherwise values cannot be created
8476 IF (vinf_validation_type_tbl(i) <> 'I') THEN
8477 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8478 p_msg_name => 'OKC_VAL_VALSET_NOT_VALID',
8479 p_token1 => 'VALUE',
8480 p_token1_value => vinf_flex_value_tbl(i),
8481 p_token2 => 'VALSET',
8482 p_token2_value => vinf_flex_value_set_name_tbl(i)
8483 );
8484 l_return_status := G_RET_STS_ERROR;
8485 END IF;
8486
8487
8488 -- Check if value is valid for the value set
8489 l_display_value := fnd_flex_ext.get_message;
8490 IF (NOT Fnd_Flex_Val_Util.Is_Value_Valid
8491 (p_value => vinf_flex_value_tbl(i),
8492 --p_is_displayed => TRUE,
8493 p_vset_name => vinf_flex_value_set_name_tbl(i),
8494 p_vset_format => vinf_format_type_tbl(i),
8495 p_max_length => vinf_maximum_size_tbl(i),
8496 p_precision => vinf_number_precision_tbl(i),
8497 p_alpha_allowed => vinf_alphanum_allowed_tbl(i),
8498 p_uppercase_only => vinf_uppercase_only_tbl(i),
8499 p_zero_fill => vinf_num_mode_enabled_tbl(i),
8500 p_min_value => vinf_minimum_value_tbl(i),
8501 p_max_value => vinf_maximum_value_tbl(i),
8502 x_storage_value => l_storage_value,
8503 x_display_value => l_display_value)) THEN
8504 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8505 p_msg_name => 'OKC_VAL_NOT_VALID');
8506 l_return_status := G_RET_STS_ERROR;
8507 END IF;
8508
8509 IF nvl(vinf_enabled_flag_tbl(i),'*') not in ('N','Y') THEN
8510 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8511 p_msg_name => 'OKC_INVALID_ENABLED_FLAG');
8512 l_return_status := G_RET_STS_ERROR;
8513
8514 END IF;
8515
8516 IF vinf_start_date_active_tbl(i) IS NOT NULL
8517 AND vinf_end_date_active_tbl(i) IS NOT NULL
8518 THEN
8519 IF vinf_start_date_active_tbl(i) > vinf_end_date_active_tbl(i) THEN
8520 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8521 p_msg_name => 'OKC_INVALID_END_DATE');
8522 l_return_status := G_RET_STS_ERROR;
8523 END IF;
8524 END IF;
8525
8526 END IF;
8527 ------------------------------------------------------------------------
8528 -- Now that we have validated and data is clean, we can
8529 -- get ready for DML and also set the process status to Success
8530 -------------------------------------------------------------------------
8531
8532 -- Summarize report for this row
8533 -- Status 'F' is for internal use meaning parsing failure marked in
8534 -- java concurrent program
8535 IF (l_return_status = G_RET_STS_SUCCESS) THEN
8536 IF (nvl(vinf_process_status_tbl(i), 'E') = 'E') THEN
8537 vinf_process_status_tbl(i) := G_RET_STS_SUCCESS;
8538 ELSIF ( vinf_process_status_tbl(i) = 'F') THEN
8539 -- ##count parser failure as error
8540 --l_tot_rows_failed := l_tot_rows_failed+1;
8541 l_part_rows_failed := l_part_rows_failed+1;
8542 vinf_process_status_tbl(i) := G_RET_STS_ERROR;
8543 END IF;
8544 ELSIF (l_return_status = l_sts_warning) THEN
8545 IF (nvl(vinf_process_status_tbl(i),'E') = 'E') THEN
8546 vinf_process_status_tbl(i) := l_sts_warning;
8547 --##count
8548 --l_tot_rows_warned := l_tot_rows_warned+1;
8549 l_part_rows_warned := l_part_rows_warned+1;
8550 ELSIF (vinf_process_status_tbl(i) = 'F') THEN
8551 -- ##count parser failure as error
8552 --l_tot_rows_failed := l_tot_rows_failed+1;
8553 l_part_rows_failed := l_part_rows_failed+1;
8554 vinf_process_status_tbl(i) := G_RET_STS_ERROR;
8555 END IF;
8556 ELSIF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
8557 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8558 ELSIF (l_return_status = G_RET_STS_ERROR) THEN
8559 RAISE FND_API.G_EXC_ERROR;
8560 END IF;
8561
8562 -------------------------
8563 -------------------------
8564 -- Exception Block for each iteration in Loop
8565 -- validation and unexpected errors
8566 -- In case of unexpected error, escape the loop
8567 -------------------------
8568 -------------------------
8569
8570
8571 EXCEPTION
8572 WHEN FND_API.G_EXC_ERROR THEN
8573 IF (l_debug = 'Y') THEN
8574 okc_debug.log('300: In Fnd_flex_values_Import: OKC_API.G_EXCEPTION_ERROR Exception', 2);
8575 END IF;
8576 IF l_val_exist_csr%ISOPEN THEN
8577 CLOSE l_val_exist_csr;
8578 END IF;
8579 --l_return_status := G_RET_STS_ERROR ;
8580 build_error_array(
8581 p_msg_data => x_msg_data,
8582 p_context => l_context,
8583 p_batch_process_id => l_batch_process_id,
8584 p_interface_id => vinf_interface_id_tbl(i),
8585 p_article_title => vinf_flex_value_tbl(i),
8586 p_error_type => G_RET_STS_ERROR,
8587 p_entity => 'VALUE'
8588 );
8589 vinf_process_status_tbl(i) := G_RET_STS_ERROR;
8590 --##count
8591 --l_tot_rows_failed := l_tot_rows_failed+1;
8592 l_part_rows_failed := l_part_rows_failed+1;
8593 -- Continue to next row
8594
8595 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8596 IF (l_debug = 'Y') THEN
8597 okc_debug.log('400: Leaving Fnd_flex_values_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
8598 END IF;
8599
8600 IF l_val_exist_csr%ISOPEN THEN
8601 CLOSE l_val_exist_csr;
8602 END IF;
8603 IF l_val_interface_csr%ISOPEN THEN
8604 CLOSE l_val_interface_csr;
8605 END IF;
8606
8607 --Set_Message
8608 l_return_status := G_RET_STS_UNEXP_ERROR ;
8609 x_return_status := G_RET_STS_UNEXP_ERROR ;
8610
8611 build_error_array(
8612 p_msg_data => x_msg_data,
8613 p_context => l_context,
8614 p_batch_process_id => l_batch_process_id,
8615 p_interface_id => vinf_interface_id_tbl(i),
8616 p_article_title => vinf_flex_value_tbl(i),
8617 p_error_type => G_RET_STS_UNEXP_ERROR,
8618 p_entity => 'VALUE'
8619 );
8620 vinf_process_status_tbl(i) := G_RET_STS_ERROR;
8621 --##count
8622 --l_tot_rows_failed := l_tot_rows_failed+1;
8623 l_part_rows_failed := l_part_rows_failed+1;
8624 exit; -- exit the current fetch
8625
8626 WHEN OTHERS THEN
8627 IF (l_debug = 'Y') THEN
8628 okc_debug.log('500: Leaving Fnd_flex_values_Import because of EXCEPTION: '||sqlerrm, 2);
8629 END IF;
8630 IF l_val_exist_csr%ISOPEN THEN
8631 CLOSE l_val_exist_csr;
8632 END IF;
8633
8634 IF l_val_interface_csr%ISOPEN THEN
8635 CLOSE l_val_interface_csr;
8636 END IF;
8637
8638 l_return_status := G_RET_STS_UNEXP_ERROR ;
8639 x_return_status := G_RET_STS_UNEXP_ERROR ;
8640
8641 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8642 p_msg_name => G_UNEXPECTED_ERROR,
8643 p_token1 => G_SQLCODE_TOKEN,
8644 p_token1_value => sqlcode,
8645 p_token2 => G_SQLERRM_TOKEN,
8646 p_token2_value => sqlerrm);
8647
8648 build_error_array(
8649 p_msg_data => G_UNEXPECTED_ERROR,
8650 p_context => l_context,
8651 p_batch_process_id => l_batch_process_id,
8652 p_interface_id => vinf_interface_id_tbl(i),
8653 p_article_title => vinf_flex_value_tbl(i),
8654 p_error_type => G_RET_STS_ERROR,
8655 p_entity => 'VALUE'
8656 );
8657 vinf_process_status_tbl(i) := G_RET_STS_ERROR;
8658 --##count
8659 --l_tot_rows_failed := l_tot_rows_failed+1;
8660 l_part_rows_failed := l_part_rows_failed+1;
8661 exit; -- exit the current fetch
8662 END;
8663 -------------------------
8664 -------------------------
8665 -- Exception Block for each iteration in Loop ends
8666 -------------------------
8667 -------------------------
8668
8669
8670 END LOOP; -- end of FOR i in inf_interface_id_tbl.FIRST ..
8671 ------------------------------------------------------------------------
8672 -------------- End of Inner Loop thru fetched row for validation --------
8673 -------------------------------------------------------------------------
8674 -- In order to propagate Unexpected error raise it if it is 'U'
8675 IF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
8676 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8677 END IF;
8678
8679 -------------------------
8680 -------------------------
8681 -- Exception Block for Inner Loop starts
8682 -- Handles unexpected errors as last step
8683 -------------------------
8684 -------------------------
8685 EXCEPTION
8686 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8687 IF (l_debug = 'Y') THEN
8688 okc_debug.log('400: Leaving Fnd_flex_values_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
8689 END IF;
8690 IF l_val_exist_csr%ISOPEN THEN
8691 CLOSE l_val_exist_csr;
8692 END IF;
8693
8694 IF l_val_interface_csr%ISOPEN THEN
8695 CLOSE l_val_interface_csr;
8696 END IF;
8697 l_return_status := G_RET_STS_UNEXP_ERROR ;
8698 x_return_status := G_RET_STS_UNEXP_ERROR ;
8699 exit; -- exit outermost loop
8700
8701 WHEN OTHERS THEN
8702 IF (l_debug = 'Y') THEN
8703 okc_debug.log('500: Leaving Fnd_flex_values_Import because of EXCEPTION: '||sqlerrm, 2);
8704 END IF;
8705 IF l_val_exist_csr%ISOPEN THEN
8706 CLOSE l_val_exist_csr;
8707 END IF;
8708
8709 IF l_val_interface_csr%ISOPEN THEN
8710 CLOSE l_val_interface_csr;
8711 END IF;
8712 l_return_status := G_RET_STS_UNEXP_ERROR ;
8713 x_return_status := G_RET_STS_UNEXP_ERROR ;
8714 exit; -- exit outermost loop
8715 END;
8716
8717 -------------------------
8718 -------------------------
8719 -- Exception Block for Each Iteration of outermost Loop ends
8720 -------------------------
8721 -------------------------
8722
8723 ------------------------------------------------------------------------
8724 --------------------- Start Do_DML for Fnd Flex Values ---------------
8725 -- Insert Fnd Flex Values
8726 -------------------------------------------------------------------------
8727 -- initialize l_return_status to track status of DML execution
8728 l_return_status := G_RET_STS_SUCCESS;
8729
8730
8731 IF p_validate_only = 'N' THEN
8732 BEGIN
8733 SAVEPOINT bulkdml;
8734
8735 i := 0;
8736 -- Bulk insert New Valid Records
8737 BEGIN
8738 l_context := 'INSERTING NEW VALUES INTO TABLE';
8739 FOR i in vinf_interface_id_tbl.FIRST ..vinf_interface_id_tbl.LAST LOOP
8740
8741 IF vinf_action_tbl(i) = 'N' AND vinf_process_status_tbl(i) in ('S','W') THEN
8742
8743
8744 FND_FLEX_VAL_API.CREATE_INDEPENDENT_VSET_VALUE(
8745 P_FLEX_VALUE_SET_NAME => vinf_flex_value_set_name_tbl(i),
8746 P_FLEX_VALUE => vinf_flex_value_tbl(i),
8747 P_DESCRIPTION => vinf_description_tbl(i),
8748 P_ENABLED_FLAG => vinf_enabled_flag_tbl(i),
8749 P_START_DATE_ACTIVE => vinf_start_date_active_tbl(i),
8750 P_END_DATE_ACTIVE => vinf_end_date_active_tbl(i),
8751 P_SUMMARY_FLAG => 'N',
8752 P_STRUCTURED_HIERARCHY_LEVEL => NULL,
8753 P_HIERARCHY_LEVEL => NULL,
8754 X_STORAGE_VALUE => l_storage_value);
8755
8756 END IF;
8757 END LOOP;
8758
8759 EXCEPTION
8760 WHEN OTHERS THEN
8761 IF (l_debug = 'Y') THEN
8762 okc_debug.log('500: Leaving Fnd_flex_values_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
8763 END IF;
8764 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8765 END;
8766
8767 --
8768 -- End of Insert into FND FLEX VALUES
8769 --
8770 --
8771
8772 i := 0;
8773 -- Bulk disable Valid Records
8774 BEGIN
8775 l_context := 'DISABLE VALUES BY UPDATING THE END DATE';
8776 FOR i in vinf_interface_id_tbl.FIRST ..vinf_interface_id_tbl.LAST LOOP
8777
8778 IF vinf_action_tbl(i) = 'D' AND vinf_process_status_tbl(i) in ('S','W') THEN
8779
8780
8781 FND_FLEX_VAL_API.UPDATE_INDEPENDENT_VSET_VALUE(
8782 P_FLEX_VALUE_SET_NAME => vinf_flex_value_set_name_tbl(i),
8783 P_FLEX_VALUE => vinf_flex_value_tbl(i),
8784 --P_DESCRIPTION => vinf_description_tbl(i),
8785 --P_ENABLED_FLAG => vinf_enabled_flag_tbl(i),
8786 --P_START_DATE_ACTIVE => vinf_start_date_active_tbl(i),
8787 P_END_DATE_ACTIVE => vinf_end_date_active_tbl(i),
8788 --P_SUMMARY_FLAG => 'N',
8789 --P_STRUCTURED_HIERARCHY_LEVEL => NULL,
8790 --P_HIERARCHY_LEVEL => NULL,
8791 X_STORAGE_VALUE => l_storage_value);
8792
8793 END IF;
8794 END LOOP;
8795
8796 EXCEPTION
8797 WHEN OTHERS THEN
8798 IF (l_debug = 'Y') THEN
8799 okc_debug.log('500: Leaving Fnd_flex_values_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
8800 END IF;
8801 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8802 END;
8803
8804 --
8805 -- End of Disable FND FLEX VALUES
8806 --
8807 --
8808
8809
8810
8811 -- Exception for bulk DML block
8812 EXCEPTION
8813 WHEN OTHERS THEN
8814 l_bulk_failed := 'Y'; -- indicating that bulk operation has failed
8815 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8816 p_msg_name => G_UNEXPECTED_ERROR,
8817 p_token1 => G_SQLCODE_TOKEN,
8818 p_token1_value => sqlcode,
8819 p_token2 => G_SQLERRM_TOKEN,
8820 p_token2_value => sqlerrm);
8821 Okc_API.Set_Message(p_app_name => G_APP_NAME,
8822 p_msg_name => 'OKC_ART_FETCH_FAILED',
8823 p_token1 => 'CONTEXT',
8824 p_token1_value => l_context);
8825
8826 build_error_array(
8827 p_msg_data => null,
8828 p_context => l_context,
8829 p_batch_process_id => l_batch_process_id,
8830 p_interface_id => -99,
8831 p_article_title => NULL,
8832 p_error_type => G_RET_STS_ERROR,
8833 p_entity => 'VALUE'
8834 );
8835 l_return_status := G_RET_STS_UNEXP_ERROR;
8836 x_return_status := G_RET_STS_UNEXP_ERROR;
8837
8838 --##count:rollback the count
8839 l_part_rows_failed := l_part_rows_processed;
8840 l_part_rows_warned := 0;
8841
8842 ROLLBACK TO SAVEPOINT bulkdml;
8843 exit; -- exit outermost loop
8844 END;
8845
8846 END IF; --- validate_only = 'N'
8847
8848 ------------------------------------------------------------------------
8849 --------------------- End of Do_DML for Values ---------------
8850 -------------------------------------------------------------------------
8851
8852 ------------------------------------------------------------------------
8853 --------------- Start of Do_DML for import related tables ------------
8854 -- Update interface table
8855 -- Insert Errors into Error table
8856 -------------------------------------------------------------------------
8857 -- Update Interface Table
8858 i:=0;
8859 BEGIN
8860 l_context := 'UPDATING VALUES INTERFACE TABLE';
8861 FORALL i in vinf_interface_id_tbl.FIRST..vinf_interface_id_tbl.LAST
8862 UPDATE OKC_VS_VALUES_INTERFACE
8863 SET
8864 -- We don't want to update process_status to 'S' or 'W' in validation_mode
8865 -- because it is not going to be picked up in next run if we do so
8866 PROCESS_STATUS = decode(p_validate_only||vinf_process_status_tbl(i)||l_bulk_failed,
8867 'NEN','E',
8868 'NSN','S',
8869 'NWN','W',
8870 'NEY','E',
8871 'NSY',NULL,
8872 'NWY',NULL,
8873 'YEY','E',
8874 'YEN','E',
8875 'NFY','E',
8876 'YFY','E',
8877 'NFN','E',
8878 'YFN','E',NULL),
8879 PROGRAM_ID = l_program_id,
8880 REQUEST_ID = l_request_id,
8881 PROGRAM_LOGIN_ID = l_program_login_id,
8882 PROGRAM_APPLICATION_ID = l_program_appl_id,
8883 OBJECT_VERSION_NUMBER = vinf_obj_ver_number_tbl(i) + 1,
8884 LAST_UPDATED_BY = l_user_id,
8885 LAST_UPDATE_LOGIN = l_login_id,
8886 LAST_UPDATE_DATE = SYSDATE
8887 WHERE
8888 interface_id = vinf_interface_id_tbl(i);
8889 EXCEPTION
8890 WHEN OTHERS THEN
8891 IF (l_debug = 'Y') THEN
8892 okc_debug.log('500: Leaving Fnd_flex_values_Import because of EXCEPTION: '||sqlerrm, 2);
8893 END IF;
8894
8895 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8896 p_msg_name => G_UNEXPECTED_ERROR,
8897 p_token1 => G_SQLCODE_TOKEN,
8898 p_token1_value => sqlcode,
8899 p_token2 => G_SQLERRM_TOKEN,
8900 p_token2_value => sqlerrm);
8901 Okc_API.Set_Message(p_app_name => G_APP_NAME,
8902 p_msg_name => 'OKC_VAL_INT_UPDATE_FAILED');
8903 build_error_array(
8904 p_msg_data => null,
8905 p_context => l_context,
8906 p_batch_process_id => l_batch_process_id,
8907 p_interface_id => -99,
8908 p_article_title => NULL,
8909 p_error_type => G_RET_STS_ERROR,
8910 p_entity => 'VALUE'
8911 );
8912
8913 l_return_status := G_RET_STS_UNEXP_ERROR ;
8914 x_return_status := G_RET_STS_UNEXP_ERROR ;
8915 --##count:rollback the count
8916 l_part_rows_failed := l_part_rows_processed;
8917 l_part_rows_warned := 0;
8918
8919 --RAISE FND_API.G_EXC_ERROR ;
8920 END;
8921 --
8922 -- End of Update OKC_VS_VALUES_INTERFACE
8923 --
8924 --
8925
8926 --
8927 --Insert Errors into Error table for this fetch
8928 --
8929 insert_error_array(
8930 x_return_status => x_return_status,
8931 x_msg_count => x_msg_count,
8932 x_msg_data => x_msg_data
8933 );
8934
8935
8936 IF (x_return_status = l_insert_errors_error) THEN
8937 NULL;
8938 -- Ignore
8939 -- RAISE l_insert_errors_exception;
8940 END IF;
8941
8942 ------------------------------------------------------------------------
8943 --------------- End of Do_DML for import related tables ------------
8944 -------------------------------------------------------------------------
8945 commit;
8946
8947 -- Now delete cache for next bulk fetch
8948
8949 vinf_interface_id_tbl.DELETE;
8950 vinf_batch_number_tbl.DELETE;
8951 vinf_obj_ver_number_tbl.DELETE;
8952 vinf_flex_value_set_name_tbl.DELETE;
8953 vinf_flex_value_tbl.DELETE;
8954 vinf_process_status_tbl.DELETE;
8955 vinf_action_tbl.DELETE;
8956 vinf_enabled_flag_tbl.DELETE;
8957 vinf_start_date_active_tbl.DELETE;
8958 vinf_end_date_active_tbl.DELETE;
8959 vinf_language_tbl.DELETE;
8960 vinf_description_tbl.DELETE;
8961 vinf_flex_value_meaning_tbl.DELETE;
8962
8963 vinf_flex_value_id_tbl.DELETE;
8964 vinf_value_set_id_tbl.DELETE;
8965 vinf_format_type_tbl.DELETE;
8966 vinf_maximum_size_tbl.DELETE;
8967 vinf_number_precision_tbl.DELETE;
8968 vinf_alphanum_allowed_tbl.DELETE;
8969 vinf_uppercase_only_tbl.DELETE;
8970 vinf_num_mode_enabled_tbl.DELETE;
8971 vinf_maximum_value_tbl.DELETE;
8972 vinf_minimum_value_tbl.DELETE;
8973
8974 --vinf_flex_value_orig_tbl.DELETE;
8975
8976 err_batch_process_id_tbl.DELETE;
8977 err_article_title_tbl.DELETE;
8978 err_interface_id_tbl.DELETE;
8979 err_error_number_tbl.DELETE;
8980 err_object_version_number_tbl.DELETE;
8981 err_error_type_tbl.DELETE;
8982 err_entity_tbl.DELETE;
8983 err_error_description_tbl.DELETE;
8984
8985 EXIT WHEN l_val_interface_csr%NOTFOUND;
8986 END LOOP;
8987
8988
8989 -----------------------------------------------------------------------
8990 -- End of outermost loop for bulk fetch
8991 -----------------------------------------------------------------------
8992
8993 IF l_val_interface_csr%ISOPEN THEN
8994 CLOSE l_val_interface_csr;
8995 END IF;
8996
8997
8998 --##count:add up last processed counts
8999 l_tot_rows_processed := l_tot_rows_processed + l_part_rows_processed;
9000 l_tot_rows_failed := l_tot_rows_failed + l_part_rows_failed;
9001 l_tot_rows_warned := l_tot_rows_warned + l_part_rows_warned;
9002
9003 --Update Batch Process Table as a last step
9004 UPDATE OKC_ART_INT_BATPROCS_ALL
9005 SET
9006 TOTAL_ROWS_PROCESSED = l_tot_rows_processed,
9007 TOTAL_ROWS_FAILED = l_tot_rows_failed,
9008 TOTAL_ROWS_WARNED = l_tot_rows_warned,
9009 END_DATE = SYSDATE,
9010 PROGRAM_ID = l_program_id,
9011 REQUEST_ID = l_request_id,
9012 PROGRAM_LOGIN_ID = l_program_login_id,
9013 PROGRAM_APPLICATION_ID = l_program_appl_id,
9014 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
9015 LAST_UPDATED_BY = l_user_id,
9016 LAST_UPDATE_LOGIN = l_login_id,
9017 LAST_UPDATE_DATE = SYSDATE
9018 WHERE
9019 BATCH_PROCESS_ID = l_batch_process_id
9020 AND ENTITY = 'Value';
9021
9022 IF err_error_number_tbl.COUNT > 0 THEN
9023 insert_error_array(
9024 x_return_status => x_return_status,
9025 x_msg_count => x_msg_count,
9026 x_msg_data => x_msg_data
9027 );
9028 END IF;
9029
9030 -- Print statistic of this run in the log
9031 -- Commented for new XML Based Import - Moved to new_wrap_up in conc_import_articles
9032 --wrap_up(p_validate_only,p_batch_number,l_tot_rows_processed,l_tot_rows_failed,l_tot_rows_warned,l_batch_process_id,'VALUE');
9033 commit; -- Final commit for status update
9034
9035 IF (l_debug = 'Y') THEN
9036 okc_debug.log('2000: Leaving Fnd_flex_values import', 2);
9037 END IF;
9038 --x_return_status := l_return_status; this may cause to erase error x_return_status
9039
9040 EXCEPTION
9041
9042 WHEN FND_API.G_EXC_ERROR THEN
9043 IF (l_debug = 'Y') THEN
9044 okc_debug.log('3000: Leaving Fnd_flex_values_Import: OKC_API.G_EXCEPTION_ERROR Exception', 2);
9045 END IF;
9046 --Insert Errors into Error table if there is any
9047 insert_error_array(
9048 x_return_status => x_return_status,
9049 x_msg_count => x_msg_count,
9050 x_msg_data => x_msg_data
9051 );
9052 x_return_status := G_RET_STS_ERROR ;
9053
9054 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9055 IF (l_debug = 'Y') THEN
9056 okc_debug.log('4000: Leaving Fnd_flex_values_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
9057 END IF;
9058 --Insert Errors into Error table if there is any
9059
9060 insert_error_array(
9061 x_return_status => x_return_status,
9062 x_msg_count => x_msg_count,
9063 x_msg_data => x_msg_data
9064 );
9065 commit;
9066
9067 IF l_val_interface_csr%ISOPEN THEN
9068 CLOSE l_val_interface_csr;
9069 END IF;
9070
9071 x_return_status := G_RET_STS_UNEXP_ERROR ;
9072 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
9073 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
9074 END IF;
9075 get_print_msgs_stack(p_msg_data => x_msg_data);
9076
9077 WHEN l_insert_errors_exception THEN
9078 --
9079 -- In this exception handling, we don't insert error array again
9080 -- because error happend in the module
9081 --
9082 IF (l_debug = 'Y') THEN
9083 okc_debug.log('5000: Leaving Fnd_flex_values_Import because of EXCEPTION in insert_error_array: '||sqlerrm, 2);
9084 END IF;
9085
9086 IF l_val_interface_csr%ISOPEN THEN
9087 CLOSE l_val_interface_csr;
9088 END IF;
9089
9090
9091 --x_return_status := G_RET_STS_UNEXP_ERROR ;
9092 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
9093 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
9094 END IF;
9095 get_print_msgs_stack(p_msg_data => x_msg_data);
9096 commit;
9097
9098 WHEN OTHERS THEN
9099 IF (l_debug = 'Y') THEN
9100 okc_debug.log('5000: Leaving Fnd_flex_values_Import because of EXCEPTION: '||sqlerrm, 2);
9101 END IF;
9102 --Insert Errors into Error table if there is any
9103 insert_error_array(
9104 x_return_status => x_return_status,
9105 x_msg_count => x_msg_count,
9106 x_msg_data => x_msg_data
9107 );
9108 commit;
9109 --
9110 IF l_val_interface_csr%ISOPEN THEN
9111 CLOSE l_val_interface_csr;
9112 END IF;
9113
9114 x_return_status := G_RET_STS_UNEXP_ERROR ;
9115 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
9116 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
9117 END IF;
9118 get_print_msgs_stack(p_msg_data => x_msg_data);
9119 END import_fnd_flex_values;
9120
9121 -- MOAC
9122 /*
9123 BEGIN
9124 OPEN cur_org_csr;
9125 FETCH cur_org_csr INTO G_CURRENT_ORG_ID;
9126 CLOSE cur_org_csr;
9127 */
9128
9129 END OKC_ARTICLES_IMPORT_GRP;