[Home] [Help]
PACKAGE BODY: APPS.OKC_ARTICLES_IMPORT_GRP
Source
1 PACKAGE BODY okc_articles_import_grp AS
2 /* $Header: OKCGAIMB.pls 120.28.12020000.3 2012/07/20 14:30:38 serukull 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, FND_DATE.calendar_aware_alt) 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, FND_DATE.calendar_aware_alt) 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 --Clause editing in word
1832 INTRFC.EDITED_IN_WORD,
1833 INTRFC.ARTICLE_TEXT_IN_WORD,
1834 TO_NUMBER(NULL) ARTICLE_VERSION_ID
1835 FROM OKC_ART_INTERFACE_ALL INTRFC, OKC_ARTICLES_ALL ART
1836 WHERE nvl(PROCESS_STATUS,'*') NOT IN ('W', 'S')
1837 AND INTRFC.ORG_ID = cp_local_org_id
1838 AND BATCH_NUMBER = cp_batch_number
1839 AND RTRIM(INTRFC.ARTICLE_TITLE) = ART.ARTICLE_TITLE(+)
1840 AND INTRFC.ORG_ID = ART.ORG_ID(+)
1841 AND ART.STANDARD_YN(+) = 'Y'
1842 ORDER BY RTRIM(INTRFC.ARTICLE_TITLE) ASC;
1843
1844 -- Cursor returns article status, version id and version number
1845 -- for the most recent version with article_id
1846
1847 CURSOR get_max_article_version_csr (cp_article_id IN NUMBER) IS
1848 SELECT
1849 ARTICLE_VERSION_ID,
1850 ARTICLE_VERSION_NUMBER,
1851 ARTICLE_STATUS,
1852 START_DATE,
1853 --Clause Editing
1854 EDITED_IN_WORD
1855 FROM OKC_ARTICLE_VERSIONS A
1856 WHERE article_id = cp_article_id
1857 and start_date = (SELECT max(start_date)
1858 FROM okc_article_versions
1859 WHERE article_id = a.article_id);
1860
1861 -- Cursor to get article level information for V, U interface row
1862 CURSOR get_article_info_csr (cp_article_id IN NUMBER) IS
1863 SELECT
1864 ARTICLE_INTENT,
1865 ARTICLE_LANGUAGE
1866 FROM OKC_ARTICLES_ALL
1867 WHERE ARTICLE_ID = cp_article_id;
1868
1869 -- Cursor to validate article type
1870 -- If article type is not active any more but it is not valid
1871 CURSOR validate_article_type_csr ( cp_article_type IN VARCHAR2,
1872 cp_article_id IN NUMBER,
1873 cp_action IN VARCHAR2) IS
1874 SELECT lookup_code
1875 FROM fnd_lookups
1876 WHERE lookup_type = 'OKC_SUBJECT'
1877 AND lookup_code = cp_article_type
1878 AND start_date_active <= trunc(sysdate)
1879 AND nvl(end_date_active,sysdate+1) >= trunc(sysdate);
1880
1881 -- Check validity of valueset
1882 -- Split into two cursor for performance as var_name may not be used frequently
1883 CURSOR l_check_valid_valueset_csr (cp_variable_code IN VARCHAR2) IS
1884 SELECT FLX.FLEX_VALUE_SET_ID,
1885 BVB.VARIABLE_TYPE
1886 FROM
1887 OKC_BUS_VARIABLES_B BVB,
1888 FND_FLEX_VALUE_SETS FLX
1889 WHERE BVB.VARIABLE_CODE = cp_variable_code
1890 --AND BVB.VARIABLE_TYPE = 'U'
1891 AND FLX.FLEX_VALUE_SET_ID(+) = BVB.VALUE_SET_ID;
1892
1893 CURSOR l_var_name_csr (cp_variable_code IN VARCHAR2,
1894 cp_lang IN VARCHAR2) IS
1895 SELECT BVT.VARIABLE_NAME
1896 FROM
1897 OKC_BUS_VARIABLES_TL BVT
1898 WHERE BVT.VARIABLE_CODE = cp_variable_code
1899 AND BVT.LANGUAGE = cp_lang;
1900
1901 -- Interface Rows
1902
1903 TYPE l_inf_interface_id IS TABLE OF OKC_ART_INTERFACE_ALL.INTERFACE_ID%TYPE INDEX BY BINARY_INTEGER ;
1904 TYPE l_inf_batch_number IS TABLE OF OKC_ART_INTERFACE_ALL.BATCH_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
1905 TYPE l_inf_object_version_number IS TABLE OF OKC_ART_INTERFACE_ALL.OBJECT_VERSION_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
1906 TYPE l_inf_article_title IS TABLE OF OKC_ART_INTERFACE_ALL.ARTICLE_TITLE%TYPE INDEX BY BINARY_INTEGER ;
1907 TYPE l_inf_org_id IS TABLE OF OKC_ART_INTERFACE_ALL.ORG_ID%TYPE INDEX BY BINARY_INTEGER ;
1908 TYPE l_inf_process_status IS TABLE OF OKC_ART_INTERFACE_ALL.PROCESS_STATUS%TYPE INDEX BY BINARY_INTEGER ;
1909 TYPE l_inf_action IS TABLE OF OKC_ART_INTERFACE_ALL.ACTION%TYPE INDEX BY BINARY_INTEGER ;
1910 TYPE l_inf_article_number IS TABLE OF OKC_ART_INTERFACE_ALL.ARTICLE_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
1911 TYPE l_inf_article_intent IS TABLE OF OKC_ART_INTERFACE_ALL.ARTICLE_INTENT%TYPE INDEX BY BINARY_INTEGER ;
1912 TYPE l_inf_article_language IS TABLE OF OKC_ART_INTERFACE_ALL.ARTICLE_LANGUAGE%TYPE INDEX BY BINARY_INTEGER ;
1913 TYPE l_inf_article_type IS TABLE OF OKC_ART_INTERFACE_ALL.ARTICLE_TYPE%TYPE INDEX BY BINARY_INTEGER ;
1914 TYPE l_inf_article_id IS TABLE OF OKC_ARTICLES_ALL.ARTICLE_ID%TYPE INDEX BY BINARY_INTEGER ;
1915 TYPE l_inf_art_reference_code IS TABLE OF OKC_ART_INTERFACE_ALL.ART_SYSTEM_REFERENCE_CODE%TYPE INDEX BY BINARY_INTEGER ;
1916 TYPE l_inf_art_reference_id1 IS TABLE OF OKC_ART_INTERFACE_ALL.ART_SYSTEM_REFERENCE_ID1%TYPE INDEX BY BINARY_INTEGER ;
1917 TYPE l_inf_art_reference_id2 IS TABLE OF OKC_ART_INTERFACE_ALL.ART_SYSTEM_REFERENCE_ID2%TYPE INDEX BY BINARY_INTEGER ;
1918 TYPE l_inf_article_text IS TABLE OF OKC_ART_INTERFACE_ALL.ARTICLE_TEXT%TYPE INDEX BY BINARY_INTEGER ;
1919 TYPE l_inf_provision_yn IS TABLE OF OKC_ART_INTERFACE_ALL.PROVISION_YN%TYPE INDEX BY BINARY_INTEGER ;
1920 TYPE l_inf_insert_by_reference IS TABLE OF OKC_ART_INTERFACE_ALL.INSERT_BY_REFERENCE%TYPE INDEX BY BINARY_INTEGER ;
1921 TYPE l_inf_lock_text IS TABLE OF OKC_ART_INTERFACE_ALL.LOCK_TEXT%TYPE INDEX BY BINARY_INTEGER ;
1922 TYPE l_inf_global_yn IS TABLE OF OKC_ART_INTERFACE_ALL.GLOBAL_YN%TYPE INDEX BY BINARY_INTEGER ;
1923 TYPE l_inf_article_status IS TABLE OF OKC_ART_INTERFACE_ALL.ARTICLE_STATUS%TYPE INDEX BY BINARY_INTEGER ;
1924 TYPE l_inf_start_date IS TABLE OF OKC_ART_INTERFACE_ALL.START_DATE%TYPE INDEX BY BINARY_INTEGER ;
1925 TYPE l_inf_end_date IS TABLE OF OKC_ART_INTERFACE_ALL.END_DATE%TYPE INDEX BY BINARY_INTEGER ;
1926 TYPE l_inf_display_name IS TABLE OF OKC_ART_INTERFACE_ALL.DISPLAY_NAME%TYPE INDEX BY BINARY_INTEGER ;
1927 TYPE l_inf_article_description IS TABLE OF OKC_ART_INTERFACE_ALL.ARTICLE_DESCRIPTION%TYPE INDEX BY BINARY_INTEGER ;
1928 TYPE l_inf_date_approved IS TABLE OF OKC_ART_INTERFACE_ALL.DATE_APPROVED%TYPE INDEX BY BINARY_INTEGER ;
1929 TYPE l_inf_default_section IS TABLE OF OKC_ART_INTERFACE_ALL.DEFAULT_SECTION%TYPE INDEX BY BINARY_INTEGER ;
1930 TYPE l_inf_reference_source IS TABLE OF OKC_ART_INTERFACE_ALL.REFERENCE_SOURCE%TYPE INDEX BY BINARY_INTEGER ;
1931 TYPE l_inf_reference_text IS TABLE OF OKC_ART_INTERFACE_ALL.REFERENCE_TEXT%TYPE INDEX BY BINARY_INTEGER ;
1932 TYPE l_inf_ver_reference_code IS TABLE OF OKC_ART_INTERFACE_ALL.VER_SYSTEM_REFERENCE_CODE%TYPE INDEX BY BINARY_INTEGER ;
1933 TYPE l_inf_ver_reference_id1 IS TABLE OF OKC_ART_INTERFACE_ALL.VER_SYSTEM_REFERENCE_ID1%TYPE INDEX BY BINARY_INTEGER ;
1934 TYPE l_inf_ver_reference_id2 IS TABLE OF OKC_ART_INTERFACE_ALL.VER_SYSTEM_REFERENCE_ID2%TYPE INDEX BY BINARY_INTEGER ;
1935 TYPE l_inf_instructions IS TABLE OF OKC_ART_INTERFACE_ALL.ADDITIONAL_INSTRUCTIONS%TYPE INDEX BY BINARY_INTEGER ;
1936 TYPE l_inf_date_published IS TABLE OF OKC_ART_INTERFACE_ALL.DATE_PUBLISHED%TYPE INDEX BY BINARY_INTEGER ;
1937 TYPE l_inf_attribute_category IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE_CATEGORY%TYPE INDEX BY BINARY_INTEGER ;
1938 TYPE l_inf_attribute1 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE1%TYPE INDEX BY BINARY_INTEGER ;
1939 TYPE l_inf_attribute2 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE2%TYPE INDEX BY BINARY_INTEGER ;
1940 TYPE l_inf_attribute3 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE3%TYPE INDEX BY BINARY_INTEGER ;
1941 TYPE l_inf_attribute4 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE4%TYPE INDEX BY BINARY_INTEGER ;
1942 TYPE l_inf_attribute5 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE5%TYPE INDEX BY BINARY_INTEGER ;
1943 TYPE l_inf_attribute6 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE6%TYPE INDEX BY BINARY_INTEGER ;
1944 TYPE l_inf_attribute7 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE7%TYPE INDEX BY BINARY_INTEGER ;
1945 TYPE l_inf_attribute8 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE8%TYPE INDEX BY BINARY_INTEGER ;
1946 TYPE l_inf_attribute9 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE9%TYPE INDEX BY BINARY_INTEGER ;
1947 TYPE l_inf_attribute10 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE10%TYPE INDEX BY BINARY_INTEGER ;
1948 TYPE l_inf_attribute11 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE11%TYPE INDEX BY BINARY_INTEGER ;
1949 TYPE l_inf_attribute12 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE12%TYPE INDEX BY BINARY_INTEGER ;
1950 TYPE l_inf_attribute13 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE13%TYPE INDEX BY BINARY_INTEGER ;
1951 TYPE l_inf_attribute14 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE14%TYPE INDEX BY BINARY_INTEGER ;
1952 TYPE l_inf_attribute15 IS TABLE OF OKC_ART_INTERFACE_ALL.ATTRIBUTE15%TYPE INDEX BY BINARY_INTEGER ;
1953 --Clause Editing
1954 TYPE l_inf_edited_in_word IS TABLE OF OKC_ART_INTERFACE_ALL.EDITED_IN_WORD%TYPE INDEX BY BINARY_INTEGER ;
1955 TYPE l_inf_article_text_in_word IS TABLE OF OKC_ART_INTERFACE_ALL.ARTICLE_TEXT_IN_WORD%TYPE INDEX BY BINARY_INTEGER ;
1956 TYPE l_inf_article_version_id IS TABLE OF OKC_ARTICLE_VERSIONS.ARTICLE_VERSION_ID%TYPE INDEX BY BINARY_INTEGER ;
1957 TYPE l_inf_article_version_number IS TABLE OF OKC_ART_INTERFACE_ALL.ARTICLE_VERSION_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
1958 TYPE l_inf_adoption_type IS TABLE OF OKC_ARTICLE_VERSIONS.ADOPTION_TYPE%TYPE INDEX BY BINARY_INTEGER ;
1959 --clm
1960 -- TYPE l_inf_variable_code IS TABLE OF OKC_ARTICLE_VERSIONS.VARIABLE_CODE%TYPE INDEX BY BINARY_INTEGER ;
1961
1962 -- For Article Variables
1963 TYPE list_artv_article_version_id IS TABLE OF OKC_ARTICLE_VARIABLES.ARTICLE_VERSION_ID%TYPE INDEX BY BINARY_INTEGER ;
1964 TYPE list_artv_variable_code IS TABLE OF OKC_ARTICLE_VARIABLES.VARIABLE_CODE%TYPE INDEX BY BINARY_INTEGER ;
1965 TYPE list_artv_action IS TABLE OF VARCHAR2(1) INDEX BY BINARY_INTEGER ;
1966
1967 l_article_language VARCHAR2(3);
1968
1969 -- Variables for interface
1970 inf_interface_id_tbl l_inf_interface_id ;
1971 inf_batch_number_tbl l_inf_batch_number ;
1972 inf_object_version_number_tbl l_inf_object_version_number ;
1973 inf_article_title_tbl l_inf_article_title ;
1974 inf_org_id_tbl l_inf_org_id ;
1975 inf_process_status_tbl l_inf_process_status ;
1976 inf_action_tbl l_inf_action ;
1977 inf_article_number_tbl l_inf_article_number ;
1978 inf_article_intent_tbl l_inf_article_intent ;
1979 inf_x_article_intent_tbl l_inf_article_intent ;
1980 inf_article_language_tbl l_inf_article_language ;
1981 inf_x_article_language_tbl l_inf_article_language ;
1982 inf_article_type_tbl l_inf_article_type ;
1983 inf_article_id_tbl l_inf_article_id ;
1984 inf_art_reference_code_tbl l_inf_art_reference_code ;
1985 inf_art_reference_id1_tbl l_inf_art_reference_id1 ;
1986 inf_art_reference_id2_tbl l_inf_art_reference_id2 ;
1987 inf_article_text_tbl l_inf_article_text ;
1988 inf_provision_yn_tbl l_inf_provision_yn ;
1989 inf_insert_by_reference_tbl l_inf_insert_by_reference ;
1990 inf_lock_text_tbl l_inf_lock_text ;
1991 inf_global_yn_tbl l_inf_global_yn ;
1992 inf_article_status_tbl l_inf_article_status ;
1993 inf_start_date_tbl l_inf_start_date ;
1994 inf_end_date_tbl l_inf_end_date ;
1995 inf_display_name_tbl l_inf_display_name ;
1996 inf_article_description_tbl l_inf_article_description ;
1997 inf_date_approved_tbl l_inf_date_approved ;
1998 inf_default_section_tbl l_inf_default_section ;
1999 inf_reference_source_tbl l_inf_reference_source ;
2000 inf_reference_text_tbl l_inf_reference_text ;
2001 inf_ver_reference_code_tbl l_inf_ver_reference_code ;
2002 inf_ver_reference_id1_tbl l_inf_ver_reference_id1 ;
2003 inf_ver_reference_id2_tbl l_inf_ver_reference_id2 ;
2004 inf_instructions_tbl l_inf_instructions ;
2005 inf_date_published_tbl l_inf_date_published ;
2006 inf_attribute_category_tbl l_inf_attribute_category ;
2007 inf_attribute1_tbl l_inf_attribute1 ;
2008 inf_attribute2_tbl l_inf_attribute2 ;
2009 inf_attribute3_tbl l_inf_attribute3 ;
2010 inf_attribute4_tbl l_inf_attribute4 ;
2011 inf_attribute5_tbl l_inf_attribute5 ;
2012 inf_attribute6_tbl l_inf_attribute6 ;
2013 inf_attribute7_tbl l_inf_attribute7 ;
2014 inf_attribute8_tbl l_inf_attribute8 ;
2015 inf_attribute9_tbl l_inf_attribute9 ;
2016 inf_attribute10_tbl l_inf_attribute10 ;
2017 inf_attribute11_tbl l_inf_attribute11 ;
2018 inf_attribute12_tbl l_inf_attribute12 ;
2019 inf_attribute13_tbl l_inf_attribute13 ;
2020 inf_attribute14_tbl l_inf_attribute14 ;
2021 inf_attribute15_tbl l_inf_attribute15 ;
2022 --Clause Editing
2023 inf_edited_in_word_tbl l_inf_edited_in_word ;
2024 inf_article_text_in_word_tbl l_inf_article_text_in_word ;
2025 inf_article_version_id_tbl l_inf_article_version_id ;
2026 inf_earlier_version_id_tbl l_inf_article_version_id ;
2027 inf_article_version_number_tbl l_inf_article_version_number ;
2028 inf_adoption_type_tbl l_inf_adoption_type;
2029 --clm
2030 -- inf_variable_code_tbl l_inf_variable_code;
2031
2032 artv_article_version_id_tbl list_artv_article_version_id ;
2033 artv_variable_code_tbl OKC_ARTICLES_GRP.variable_code_tbl_type ;
2034 artv_action_tbl list_artv_action ;
2035 l_variable_code_tbl OKC_ARTICLES_GRP.variable_code_tbl_type ;
2036
2037 I NUMBER := 0;
2038 j NUMBER := 0;
2039 k NUMBER := 0;
2040 x NUMBER := 0;
2041 l_earlier_version_id OKC_ARTICLE_VERSIONS.ARTICLE_VERSION_ID%TYPE;
2042 l_article_version_id OKC_ARTICLE_VERSIONS.ARTICLE_VERSION_ID%TYPE;
2043 l_article_status OKC_ARTICLE_VERSIONS.ARTICLE_STATUS%TYPE;
2044 l_start_date OKC_ARTICLE_VERSIONS.START_DATE%TYPE;
2045 l_edited_in_word OKC_ARTICLE_VERSIONS.EDITED_IN_WORD%TYPE;
2046 l_tmp_article_status OKC_ARTICLE_VERSIONS.ARTICLE_STATUS%TYPE;
2047 l_earlier_version_number OKC_ARTICLE_VERSIONS.ARTICLE_VERSION_NUMBER%TYPE;
2048 l_earlier_adoption_type OKC_ARTICLE_VERSIONS.ADOPTION_TYPE%TYPE;
2049 l_article_number OKC_ARTICLES_ALL.ARTICLE_NUMBER%TYPE;
2050 l_article_version_number OKC_ARTICLE_VERSIONS.ARTICLE_VERSION_NUMBER%TYPE;
2051 l_variables_to_insert_tbl OKC_ARTICLES_GRP.variable_code_tbl_type;
2052 l_variables_to_delete_tbl OKC_ARTICLES_GRP.variable_code_tbl_type;
2053 l_adoption_type OKC_ARTICLE_VERSIONS.ADOPTION_TYPE%TYPE;
2054 l_program_id OKC_ART_INTERFACE_ALL.PROGRAM_ID%TYPE;
2055 l_program_login_id OKC_ART_INTERFACE_ALL.PROGRAM_LOGIN_ID%TYPE;
2056 l_program_appl_id OKC_ART_INTERFACE_ALL.PROGRAM_APPLICATION_ID%TYPE;
2057 l_request_id OKC_ART_INTERFACE_ALL.REQUEST_ID%TYPE;
2058 l_variable_name OKC_BUS_VARIABLES_TL.VARIABLE_NAME%TYPE;
2059 l_variable_type OKC_BUS_VARIABLES_B.VARIABLE_TYPE%TYPE;
2060 l_value_set_id FND_FLEX_VALUE_SETS.FLEX_VALUE_SET_ID%TYPE;
2061 l_return_status VARCHAR2(1);
2062 api_return_status VARCHAR2(1);
2063 l_doc_sequence_type CHAR(1);
2064 l_error_index NUMBER := 1;
2065 l_replace_text VARCHAR2(1) := 'N';
2066 l_batch_process_id NUMBER := 1;
2067 l_context VARCHAR2(50) := NULL;
2068 l_init_msg_list VARCHAR2(200) := okc_api.g_true;
2069 l_tot_rows_processed NUMBER := 0;
2070 l_tot_rows_failed NUMBER := 0;
2071 l_tot_rows_warned NUMBER := 0;
2072 l_part_rows_processed NUMBER := 0;
2073 l_part_rows_failed NUMBER := 0;
2074 l_part_rows_warned NUMBER := 0;
2075 l_bulk_failed VARCHAR2(1) := 'Y';
2076 l_exist_approver VARCHAR2(5) := 'NOK';
2077 save_threshold WF_ENGINE.threshold%TYPE;
2078
2079 ------------------------------------------------------------------------
2080 -- PROCEDURE import_articles body starts
2081 -------------------------------------------------------------------------
2082
2083 BEGIN
2084
2085
2086 IF (l_debug = 'Y') THEN
2087 okc_debug.log('100: Entered article_import', 2);
2088 END IF;
2089
2090
2091 ------------------------------------------------------------------------
2092 -- Variable Initialization
2093 -------------------------------------------------------------------------
2094
2095 -- Standard Start of API savepoint
2096 FND_MSG_PUB.initialize;
2097 -- Initialize API return status to success
2098 x_return_status := FND_API.G_RET_STS_SUCCESS;
2099 l_return_status := G_RET_STS_SUCCESS;
2100 -- Cache user_id, login_id and org_id
2101 l_user_id := Fnd_Global.user_id;
2102 l_login_id := Fnd_Global.login_id;
2103 l_userenv_lang := USERENV('LANG');
2104
2105 -- MOAC
2106 G_CURRENT_ORG_ID := mo_global.get_current_org_id();
2107 /*
2108 OPEN cur_org_csr;
2109 FETCH cur_org_csr INTO G_CURRENT_ORG_ID;
2110 CLOSE cur_org_csr;
2111 */
2112 -- MOAC
2113 IF G_CURRENT_ORG_ID IS NULL THEN
2114 Okc_Api.Set_Message(G_APP_NAME,'OKC_ART_NULL_ORG_ID');
2115 RAISE FND_API.G_EXC_ERROR;
2116 END IF;
2117
2118
2119 IF G_CURRENT_ORG_ID = G_GLOBAL_ORG_ID THEN
2120 l_adoption_type := NULL;
2121 ELSE
2122 l_adoption_type := 'LOCAL';
2123 END IF;
2124
2125
2126 IF FND_GLOBAL.CONC_PROGRAM_ID = -1 THEN
2127 l_program_id := NULL;
2128 ELSE
2129 l_program_id := FND_GLOBAL.CONC_PROGRAM_ID;
2130 END IF;
2131
2132 IF FND_GLOBAL.CONC_LOGIN_ID = -1 THEN
2133 l_program_login_id := NULL;
2134 ELSE
2135 l_program_login_id := FND_GLOBAL.CONC_LOGIN_ID;
2136 END IF;
2137
2138 IF FND_GLOBAL.PROG_APPL_ID = -1 THEN
2139 l_program_appl_id := NULL;
2140 ELSE
2141 l_program_appl_id := FND_GLOBAL.PROG_APPL_ID;
2142 END IF;
2143
2144 IF FND_GLOBAL.CONC_REQUEST_ID = -1 THEN
2145 l_request_id := NULL;
2146 ELSE
2147 l_request_id := FND_GLOBAL.CONC_REQUEST_ID;
2148 END IF;
2149
2150 l_batch_process_id := p_batch_procs_id;
2151 ------------------------------------------------------------------------
2152 -- Parameter Validation
2153 -------------------------------------------------------------------------
2154
2155 IF (p_fetchsize > G_FETCHSIZE_LIMIT) THEN
2156 x_return_status := G_RET_STS_ERROR;
2157 l_return_status := G_RET_STS_ERROR;
2158
2159 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2160 p_msg_name => 'OKC_ART_IMP_LIM_FETCHSIZE');
2161
2162 build_error_array(
2163 p_msg_data => x_msg_data,
2164 p_context => NULL,
2165 p_batch_process_id => l_batch_process_id,
2166 p_interface_id => -99,
2167 p_article_title => NULL,
2168 p_error_type => l_return_status,
2169 p_entity => 'CLAUSE'
2170 );
2171
2172 RAISE FND_API.G_EXC_ERROR ;
2173 END IF;
2174
2175 ------------------------------------------------------------------------
2176 -- Global TempClob Array Initialization
2177 -------------------------------------------------------------------------
2178 g_temp_clob_tbl.extend(p_fetchsize);
2179 FOR i in 1..p_fetchsize LOOP
2180 -- Create Temporary Clob. Clob is created not in session level to prevent
2181 -- from running ouf of session memory
2182 DBMS_LOB.CREATETEMPORARY(g_temp_clob_tbl(i), TRUE);
2183 END LOOP;
2184
2185 -------------------------------------------------------------------------
2186 --------------- the outermost loop of this procedure --------------------
2187 -- Bulk fetch all interface rows based on the fetchsize passed by the user
2188 -------------------------------------------------------------------------
2189
2190 l_context :='BULK FETCH CLAUSE INTERFACE ROW';
2191 OPEN l_interface_csr ( G_CURRENT_ORG_ID ,
2192 p_batch_number );
2193 LOOP
2194 BEGIN
2195 FETCH l_interface_csr BULK COLLECT INTO
2196 inf_interface_id_tbl ,
2197 inf_batch_number_tbl ,
2198 inf_object_version_number_tbl ,
2199 inf_article_title_tbl ,
2200 inf_org_id_tbl ,
2201 inf_process_status_tbl ,
2202 inf_action_tbl ,
2203 inf_article_number_tbl ,
2204 inf_article_intent_tbl ,
2205 inf_x_article_intent_tbl ,
2206 inf_article_language_tbl ,
2207 inf_x_article_language_tbl ,
2208 inf_article_type_tbl ,
2209 inf_article_id_tbl ,
2210 inf_art_reference_code_tbl ,
2211 inf_art_reference_id1_tbl ,
2212 inf_art_reference_id2_tbl ,
2213 inf_article_version_number_tbl ,
2214 inf_article_text_tbl ,
2215 inf_provision_yn_tbl ,
2216 inf_insert_by_reference_tbl ,
2217 inf_lock_text_tbl ,
2218 inf_global_yn_tbl ,
2219 inf_article_status_tbl ,
2220 inf_start_date_tbl ,
2221 inf_end_date_tbl ,
2222 inf_display_name_tbl ,
2223 inf_article_description_tbl ,
2224 inf_date_approved_tbl ,
2225 inf_default_section_tbl ,
2226 inf_reference_source_tbl ,
2227 inf_reference_text_tbl ,
2228 inf_ver_reference_code_tbl ,
2229 inf_ver_reference_id1_tbl ,
2230 inf_ver_reference_id2_tbl ,
2231 inf_instructions_tbl ,
2232 inf_date_published_tbl ,
2233 inf_attribute_category_tbl ,
2234 inf_attribute1_tbl ,
2235 inf_attribute2_tbl ,
2236 inf_attribute3_tbl ,
2237 inf_attribute4_tbl ,
2238 inf_attribute5_tbl ,
2239 inf_attribute6_tbl ,
2240 inf_attribute7_tbl ,
2241 inf_attribute8_tbl ,
2242 inf_attribute9_tbl ,
2243 inf_attribute10_tbl ,
2244 inf_attribute11_tbl ,
2245 inf_attribute12_tbl ,
2246 inf_attribute13_tbl ,
2247 inf_attribute14_tbl ,
2248 inf_attribute15_tbl ,
2249 inf_edited_in_word_tbl ,
2250 inf_article_text_in_word_tbl ,
2251 inf_article_version_id_tbl LIMIT p_fetchsize;
2252 EXIT WHEN inf_interface_id_tbl.COUNT = 0 ;
2253
2254 ------------------------------------------------------------------------
2255 -- Variable initialization
2256 -------------------------------------------------------------------------
2257 --For each fetch, article variable table index should be initialized
2258 j := 1;
2259 --##count:initialization
2260 l_tot_rows_processed := l_tot_rows_processed+l_part_rows_processed;
2261 l_tot_rows_failed := l_tot_rows_failed+l_part_rows_failed;
2262 l_tot_rows_warned := l_tot_rows_warned+l_part_rows_warned;
2263 l_part_rows_processed := 0;
2264 l_part_rows_failed := 0;
2265 l_part_rows_warned := 0;
2266 l_bulk_failed := 'N';
2267 ---------------------------------------------------------------------------
2268 --------------------- Inner Loop thru fetched rows for---------------------
2269 -- validation, parse and validate article text, create a variable list
2270 -- prepare rows for DML if validate_only is 'N'
2271 /*** Processing Rule to set process_status
2272 Because we want to collect as much info as possible, we need to
2273 maintain process status while keeping the process moving.
2274 So, we'll set l_return_status as validation goes on and
2275 at the end we will set inf_process_status_tbl(i) with l_return_status
2276 for final result. However, we will get out of this process if there
2277 is a significant error such as 'U'.
2278 The return status examined
2279 -api_return_status : return status for api call
2280 -l_return_status : validation result of each row
2281 -x_return_status : final result status for concurrent program request
2282 Rule to set return status
2283 If api_return_status for api call is
2284 * 'S' then continue
2285 * 'W' and l_return_status not 'E' or 'U' then set l_return_status = 'W'
2286 and build_error_array then continue
2287 * 'E' and it is significant then set l_return_status = 'E' and raise
2288 Exception
2289 * 'E' and it is minor then set l_return_status = 'E' and continue. Raise
2290 'E' at the end of validation
2291 * 'U' then set l_return_status = 'U' and raise 'U' exception
2292 * At the end, if it goes thru with no Exception,
2293 Check if l_return_status is 'E' then raise Exception
2294 Otherwise (meaning l_return_status is 'S' or 'W'),
2295 inf_process_status_tbl(i) = l_return_status
2296 * In the exception, we will set
2297 inf_process_status_tbl(i) = l_return_status and build_error_array
2298 ***/
2299 -------------------------------------------------------------------------
2300
2301 FOR i in inf_interface_id_tbl.FIRST ..inf_interface_id_tbl.LAST LOOP
2302 BEGIN
2303 -- Increment total processed rows
2304 --##Count
2305 --l_tot_rows_processed := l_tot_rows_processed+1;
2306 l_part_rows_processed := l_part_rows_processed+1;
2307 -- Initialization for each iteration
2308 l_row_notfound := FALSE;
2309 l_return_status := G_RET_STS_SUCCESS;
2310 --for validate_row, we will pass 'DRAFT' status for 'APPROVED'
2311 --and 'PENDING_APPROVAL' status as it just means for submission for approval
2312 --or approved
2313 l_tmp_article_status := inf_article_status_tbl(i);
2314 -- following variables are not fetched from interface table
2315 -- thus initialize it here
2316 inf_earlier_version_id_tbl(i) := -99;
2317 inf_adoption_type_tbl(i) := l_adoption_type;
2318
2319
2320 l_context := 'CLAUSE VALIDATING';
2321
2322 -- To find duplicate title in the batch after RTRIM is performed Bug 3487759
2323 IF i>1 THEN
2324 x := i-1;
2325 IF RTRIM(inf_article_title_tbl(i)) = RTRIM(inf_article_title_tbl(x)) THEN
2326 Okc_Api.Set_Message(G_APP_NAME, 'OKC_ART_DUP_TITLE_ORG');
2327 l_return_status := G_RET_STS_ERROR;
2328 RAISE FND_API.G_EXC_ERROR;
2329 END IF;
2330 END IF;
2331 -- Logic to decide what to do in case of Action='S'
2332 -- If there is no existing article in system then it is 'N' otherwise 'V'
2333
2334 IF inf_action_tbl(i) = 'S' THEN
2335 IF inf_article_id_tbl(i) IS NULL THEN
2336 inf_action_tbl(i) := 'N';
2337 ELSE
2338 -- Changes for Bug# 6891498 Begins
2339 OPEN get_max_article_version_csr (inf_article_id_tbl(i));
2340 FETCH get_max_article_version_csr INTO l_article_version_id,
2341 l_article_version_number,
2342 l_article_status,
2343 l_start_date,
2344 l_edited_in_word;
2345 l_row_notfound := get_max_article_version_csr%NOTFOUND;
2346 CLOSE get_max_article_version_csr;
2347 IF nvl(l_article_status,'*') in ('DRAFT', 'REJECTED') THEN
2348 inf_action_tbl(i) := 'U';
2349 ELSE
2350 -- Changes for Bug# 6891498 Ends
2351 inf_action_tbl(i) := 'V';
2352 END IF; -- For Bug# 6891498
2353 --Clause Editing start
2354 IF nvl(l_edited_in_word,'N') = 'Y' AND inf_edited_in_word_tbl(i) = 'N' THEN
2355 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2356 p_msg_name => 'OKC_ART_IMP_INV_EDT_WORD_UPD');
2357 l_return_status := G_RET_STS_ERROR;
2358 RAISE FND_API.G_EXC_ERROR ;
2359 END IF;
2360 --Clause Editing end
2361 END IF;
2362 END IF;
2363
2364 IF inf_action_tbl(i) = 'N' THEN
2365
2366 inf_article_id_tbl(i) := NULL;
2367 IF nvl(inf_article_status_tbl(i), '*') not in
2368 ('DRAFT','APPROVED','PENDING_APPROVAL') THEN
2369 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2370 p_msg_name => 'OKC_ART_IMP_INV_STS_NEWA',
2371 p_token1 => 'STATUS1',
2372 p_token1_value => 'DRAFT',
2373 p_token2 => 'STATUS2',
2374 p_token2_value => 'APPROVED',
2375 p_token3 => 'STATUS3',
2376 p_token3_value => 'PENDING_APPROVAL');
2377 l_return_status := G_RET_STS_ERROR;
2378 RAISE FND_API.G_EXC_ERROR ;
2379 END IF;
2380
2381 --TRIM trailing space because article title in library table has been trimmed
2382 --for successful comparison, this should be trimmed
2383 inf_article_title_tbl(i) := RTRIM(inf_article_title_tbl(i));
2384
2385 -- Set article version number as 1
2386 inf_article_version_number_tbl(i) := 1;
2387
2388 --validate this article with 'DRAFT'
2389 l_tmp_article_status := 'DRAFT';
2390
2391 ELSIF inf_action_tbl(i) = 'U' THEN
2392
2393 IF inf_article_id_tbl(i) is NULL THEN
2394 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2395 p_msg_name => 'OKC_ART_ARTICLE_NOT_FOUND',
2396 p_token1 => 'ARTICLE_TITLE',
2397 p_token1_value => inf_article_title_tbl(i));
2398 l_return_status := G_RET_STS_ERROR;
2399 RAISE FND_API.G_EXC_ERROR ;
2400 END IF;
2401
2402 OPEN get_max_article_version_csr (inf_article_id_tbl(i));
2403 FETCH get_max_article_version_csr INTO l_article_version_id,
2404 l_article_version_number,
2405 l_article_status,
2406 l_start_date,
2407 l_edited_in_word;
2408 l_row_notfound := get_max_article_version_csr%NOTFOUND;
2409 CLOSE get_max_article_version_csr;
2410
2411 IF nvl(l_article_status,'*') not in ('DRAFT', 'REJECTED') THEN
2412 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2413 p_msg_name => 'OKC_ART_IMP_INV_CUR_STS_UPD');
2414 l_return_status := G_RET_STS_ERROR;
2415 RAISE FND_API.G_EXC_ERROR ;
2416 END IF;
2417 --Clause Editing start
2418 IF nvl(l_edited_in_word,'N') = 'Y' AND inf_edited_in_word_tbl(i) = 'N' THEN
2419 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2420 p_msg_name => 'OKC_ART_IMP_INV_EDT_WORD_NV');
2421 l_return_status := G_RET_STS_ERROR;
2422 RAISE FND_API.G_EXC_ERROR ;
2423 END IF;
2424 --Clause Editing end
2425 -- this status may be null for update row
2426 -- inf_article_status_tbl(i) := l_article_status;
2427 -- set the version number
2428 inf_article_version_number_tbl(i) := l_article_version_number;
2429 -- set article version id
2430 inf_article_version_id_tbl(i) := l_article_version_id;
2431
2432 IF nvl(inf_article_status_tbl(i), '*') not in
2433 ('DRAFT','REJECTED','APPROVED','PENDING_APPROVAL') THEN
2434 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2435 p_msg_name => 'OKC_ART_IMP_INV_STS_UPD',
2436 p_token1 => 'STATUS1',
2437 p_token1_value => 'DRAFT',
2438 p_token2 => 'STATUS2',
2439 p_token2_value => 'REJECTED',
2440 p_token3 => 'STATUS3',
2441 p_token3_value => 'APPROVED',
2442 p_token4 => 'STATUS4',
2443 p_token4_value => 'PENDING_APPROVAL');
2444 l_return_status := G_RET_STS_ERROR;
2445 RAISE FND_API.G_EXC_ERROR ;
2446 END IF;
2447
2448 --if interface article status is DRAFT and REJECTED then keep
2449 --the one in the library table. We don't want user to be able to change them
2450 --validate this article with 'DRAFT' for 'DRAFT', 'APPROVED', 'PENDING_APPROVAL'
2451 --or 'REJECTED' for 'REJECTED'
2452 IF nvl(inf_article_status_tbl(i), '*') in ('DRAFT', 'REJECTED') THEN
2453 inf_article_status_tbl(i) := l_article_status;
2454 l_tmp_article_status := l_article_status;
2455 ELSE
2456 l_tmp_article_status := 'DRAFT';
2457 END IF;
2458
2459
2460 -- User entered attribute in article level (intent, language) may not be
2461 -- accurate because we do not validate them for Update
2462 -- so here we need to fill some important attribute
2463 -- in interface table from database
2464 inf_article_intent_tbl(i) := inf_x_article_intent_tbl(i);
2465 inf_article_language_tbl(i) := inf_x_article_language_tbl(i);
2466
2467 ELSIF inf_action_tbl(i) = 'V' THEN
2468
2469 inf_article_version_id_tbl(i) := NULL;
2470 IF inf_article_id_tbl(i) is NULL THEN
2471 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2472 p_msg_name => 'OKC_ART_ARTICLE_NOT_FOUND',
2473 p_token1 => 'ARTICLE_TITLE',
2474 p_token1_value => inf_article_title_tbl(i));
2475 l_return_status := G_RET_STS_ERROR;
2476 RAISE FND_API.G_EXC_ERROR ;
2477 END IF;
2478
2479 IF nvl(inf_article_status_tbl(i), '*') not in
2480 ('DRAFT','APPROVED','PENDING_APPROVAL') THEN
2481 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2482 p_msg_name => 'OKC_ART_IMP_INV_STS_NEWA',
2483 p_token1 => 'STATUS1',
2484 p_token1_value => 'DRAFT',
2485 p_token2 => 'STATUS2',
2486 p_token2_value => 'APPROVED',
2487 p_token3 => 'STATUS3',
2488 p_token3_value => 'PENDING_APPROVAL');
2489 l_return_status := G_RET_STS_ERROR;
2490 RAISE FND_API.G_EXC_ERROR;
2491 END IF;
2492
2493
2494 -- User entered attribute in article level (intent, language)may not be
2495 -- accurate because we do not validate them for New Version
2496 -- so here we need to fill some important attribute
2497 -- in interface table from database
2498 inf_article_intent_tbl(i) := inf_x_article_intent_tbl(i);
2499 inf_article_language_tbl(i) := inf_x_article_language_tbl(i);
2500
2501 OPEN get_max_article_version_csr (inf_article_id_tbl(i));
2502 FETCH get_max_article_version_csr INTO l_article_version_id,
2503 l_article_version_number,
2504 l_article_status,
2505 l_start_date,
2506 l_edited_in_word;
2507 l_row_notfound := get_max_article_version_csr%NOTFOUND;
2508 CLOSE get_max_article_version_csr;
2509 --Clause Editing
2510 IF nvl(l_edited_in_word,'N') = 'Y' AND inf_edited_in_word_tbl(i) = 'N' THEN
2511 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2512 p_msg_name => 'OKC_ART_IMP_INV_EDT_WORD_NV');
2513 l_return_status := G_RET_STS_ERROR;
2514 RAISE FND_API.G_EXC_ERROR ;
2515 END IF;
2516 --Clause Editing
2517 -- Set article version number
2518 inf_article_version_number_tbl(i) := l_article_version_number +1;
2519
2520 --validate article with 'DRAFT' status
2521 --because validate_row api validation for 'Approved' article
2522 --is more suitable for article in 'Approved' status already
2523 --but in import, status 'Approved' means submission for approval
2524 l_tmp_article_status := 'DRAFT';
2525 ELSIF inf_action_tbl(i) = 'D' THEN
2526
2527 IF inf_article_id_tbl(i) is NULL THEN
2528 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2529 p_msg_name => 'OKC_ART_ARTICLE_NOT_FOUND',
2530 p_token1 => 'ARTICLE_TITLE',
2531 p_token1_value => inf_article_title_tbl(i));
2532 l_return_status := G_RET_STS_ERROR;
2533 RAISE FND_API.G_EXC_ERROR ;
2534 END IF;
2535
2536 IF inf_end_date_tbl(i) IS NULL THEN
2537 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2538 p_msg_name => 'OKC_ART_NULL_END_DATE');
2539 l_return_status := G_RET_STS_ERROR;
2540 RAISE FND_API.G_EXC_ERROR;
2541 END IF;
2542
2543 OPEN get_max_article_version_csr (inf_article_id_tbl(i));
2544 FETCH get_max_article_version_csr INTO l_article_version_id,
2545 l_article_version_number,
2546 l_article_status,
2547 l_start_date,
2548 l_edited_in_word;
2549 l_row_notfound := get_max_article_version_csr%NOTFOUND;
2550 CLOSE get_max_article_version_csr;
2551
2552 IF l_row_notfound THEN
2553 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2554 p_msg_name => 'OKC_ART_ARTICLE_NOT_FOUND',
2555 p_token1 => 'ARTICLE_TITLE',
2556 p_token1_value => inf_article_title_tbl(i));
2557
2558 l_return_status := G_RET_STS_ERROR;
2559 RAISE FND_API.G_EXC_ERROR;
2560 ELSE
2561
2562 IF l_start_date IS NOT NULL
2563 THEN
2564 IF l_start_date > inf_end_date_tbl(i) THEN
2565 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2566 p_msg_name => 'OKC_INVALID_END_DATE');
2567 l_return_status := G_RET_STS_ERROR;
2568 RAISE FND_API.G_EXC_ERROR;
2569 END IF;
2570 END IF;
2571 END IF;
2572
2573 -- set the version number
2574 inf_article_version_number_tbl(i) := l_article_version_number;
2575 -- set article version id
2576 inf_article_version_id_tbl(i) := l_article_version_id;
2577
2578 ELSE
2579
2580 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2581 p_msg_name => 'OKC_ART_INV_IMP_ACTION');
2582 l_return_status := G_RET_STS_ERROR;
2583 RAISE FND_API.G_EXC_ERROR ;
2584 END IF;
2585
2586 -----------------------------------------------------------
2587 -- Common validation or attribute settting
2588 -- regardless of status and import action
2589 -- this validation is not included in validate api
2590 -----------------------------------------------------------
2591
2592 -- Do not import article if status or org_id or global_flag is not provided
2593 IF inf_article_status_tbl(i) IS NULL OR
2594 inf_org_id_tbl(i) IS NULL OR
2595 inf_global_yn_tbl(i) IS NULL THEN
2596 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2597 p_msg_name => 'OKC_ART_ATTRS_NOT_PROVIDED');
2598 l_return_status := G_RET_STS_ERROR;
2599 END IF;
2600
2601 -- Do not import 'PENDING_APPROVAL' article if approver is not set
2602 IF nvl(inf_article_status_tbl(i), '*') = 'PENDING_APPROVAL' THEN
2603 l_exist_approver := OKC_ARTWF_PVT.pre_submit_validation(G_CURRENT_ORG_ID);
2604 IF l_exist_approver = 'NOK' THEN
2605 l_return_status := G_RET_STS_ERROR;
2606 END IF;
2607 END IF;
2608
2609 -- Do not import article if orig_system_reference_code begins with 'OKCMIG'
2610 IF instr(nvl(inf_art_reference_code_tbl(i), '*'), 'OKCMIG') = 1 THEN
2611 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2612 p_msg_name => 'OKC_ART_IMP_RES_SYS_REF_CODE');
2613 l_return_status := G_RET_STS_ERROR;
2614 END IF;
2615
2616 IF instr(nvl(inf_ver_reference_code_tbl(i), '*'), 'OKCMIG') = 1 THEN
2617 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2618 p_msg_name => 'OKC_ART_IMP_RES_SYS_REF_CODE');
2619 l_return_status := G_RET_STS_ERROR;
2620 END IF;
2621
2622
2623 --for non 'APPROVED' article, make DATE_APPROVED null
2624 IF nvl(inf_article_status_tbl(i),'*') <> 'APPROVED' THEN
2625 inf_date_approved_tbl(i) := NULL;
2626 END IF;
2627
2628 --if article status is in 'APPROVED' and date_approved is null
2629 --then set date approved as sysdate
2630 --otherwise, the validate api will complain
2631 IF nvl(inf_article_status_tbl(i), '*') in ('APPROVED') AND
2632 inf_date_approved_tbl(i) is NULL THEN
2633 inf_date_approved_tbl(i) := sysdate;
2634 END IF;
2635
2636 --Bug 3680486: no provision for sell intent clause
2637 IF nvl(inf_article_intent_tbl(i), '*') = 'S'
2638 AND nvl(inf_provision_yn_tbl(i), '*') = 'Y' THEN
2639 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2640 p_msg_name => 'OKC_ART_INVALID_PROVISIONYN');
2641 l_return_status := G_RET_STS_ERROR;
2642 END IF;
2643
2644 -- Validate attrs of the interface row
2645 IF inf_action_tbl(i) = 'N' THEN
2646 api_return_status :=
2647 OKC_ARTICLES_ALL_PVT.VALIDATE_RECORD(
2648 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
2649 p_import_action => inf_action_tbl(i),
2650 p_article_id => inf_article_id_tbl(i),
2651 p_article_title => inf_article_title_tbl(i),
2652 p_org_id => G_CURRENT_ORG_ID,
2653 p_article_number => inf_article_number_tbl(i),
2654 p_standard_yn => 'Y',
2655 p_article_intent => inf_article_intent_tbl(i),
2656 p_article_language => inf_article_language_tbl(i),
2657 p_article_type => inf_article_type_tbl(i),
2658 p_orig_system_reference_code => inf_art_reference_code_tbl(i),
2659 p_orig_system_reference_id1 => inf_art_reference_id1_tbl(i),
2660 p_orig_system_reference_id2 => inf_art_reference_id2_tbl(i),
2661 p_attribute_category => NULL ,
2662 p_attribute1 => NULL ,
2663 p_attribute2 => NULL ,
2664 p_attribute3 => NULL ,
2665 p_attribute4 => NULL ,
2666 p_attribute5 => NULL ,
2667 p_attribute6 => NULL ,
2668 p_attribute7 => NULL ,
2669 p_attribute8 => NULL ,
2670 p_attribute9 => NULL ,
2671 p_attribute10 => NULL ,
2672 p_attribute11 => NULL ,
2673 p_attribute12 => NULL ,
2674 p_attribute13 => NULL ,
2675 p_attribute14 => NULL ,
2676 p_attribute15 => NULL
2677 );
2678 --
2679 -- If error is Unexpected then raise exception
2680 -- Otherwise, keep going
2681 --
2682 IF (api_return_status = G_RET_STS_UNEXP_ERROR) THEN
2683 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2684 ELSIF (api_return_status = G_RET_STS_ERROR) THEN
2685 l_return_status := G_RET_STS_ERROR;
2686 END IF;
2687 api_return_status :=
2688 OKC_ARTICLE_VERSIONS_PVT.validate_record(
2689 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
2690 p_import_action => inf_action_tbl(i),
2691 x_earlier_adoption_type => l_earlier_adoption_type,
2692 x_earlier_version_id => l_earlier_version_id,
2693 x_earlier_version_number => l_earlier_version_number,
2694 x_article_language => l_article_language,
2695 p_article_version_id => inf_article_version_id_tbl(i),
2696 p_article_id => inf_article_id_tbl(i),
2697 p_article_version_number => inf_article_version_number_tbl(i),
2698 p_article_text => inf_article_text_tbl(i),
2699 p_provision_yn => inf_provision_yn_tbl(i),
2700 p_insert_by_reference => inf_insert_by_reference_tbl(i),
2701 p_lock_text => inf_lock_text_tbl(i),
2702 p_global_yn => inf_global_yn_tbl(i),
2703 p_article_language => inf_article_language_tbl(i),
2704 p_article_status => l_tmp_article_status,
2705 p_sav_release => NULL,
2706 p_start_date => inf_start_date_tbl(i),
2707 p_end_date => inf_end_date_tbl(i),
2708 p_std_article_version_id => NULL,
2709 p_display_name => inf_display_name_tbl(i),
2710 p_translated_yn => NULL,
2711 p_article_description => inf_article_description_tbl(i),
2712 p_date_approved => inf_date_approved_tbl(i),
2713 p_default_section => inf_default_section_tbl(i),
2714 p_reference_source => inf_reference_source_tbl(i),
2715 p_reference_text => inf_reference_text_tbl(i),
2716 p_orig_system_reference_code => inf_art_reference_code_tbl(i),
2717 p_orig_system_reference_id1 => inf_art_reference_id1_tbl(i),
2718 p_orig_system_reference_id2 => inf_art_reference_id2_tbl(i),
2719 p_program_id => NULL,
2720 p_program_application_id => NULL,
2721 p_request_id => NULL,
2722 p_current_org_id => G_CURRENT_ORG_ID,
2723 p_additional_instructions => inf_instructions_tbl(i),
2724 p_variation_description => NULL,
2725 p_date_published => inf_date_published_tbl(i) ,
2726 p_attribute_category => inf_attribute_category_tbl(i) ,
2727 p_attribute1 => inf_attribute1_tbl(i) ,
2728 p_attribute2 => inf_attribute2_tbl(i) ,
2729 p_attribute3 => inf_attribute3_tbl(i) ,
2730 p_attribute4 => inf_attribute4_tbl(i) ,
2731 p_attribute5 => inf_attribute5_tbl(i) ,
2732 p_attribute6 => inf_attribute6_tbl(i) ,
2733 p_attribute7 => inf_attribute7_tbl(i) ,
2734 p_attribute8 => inf_attribute8_tbl(i) ,
2735 p_attribute9 => inf_attribute9_tbl(i) ,
2736 p_attribute10 => inf_attribute10_tbl(i) ,
2737 p_attribute11 => inf_attribute11_tbl(i) ,
2738 p_attribute12 => inf_attribute12_tbl(i) ,
2739 p_attribute13 => inf_attribute13_tbl(i) ,
2740 p_attribute14 => inf_attribute14_tbl(i) ,
2741 p_attribute15 => inf_attribute15_tbl(i) ,
2742 --Clause Editing
2743 p_edited_in_word => inf_edited_in_word_tbl(i) ,
2744 p_article_text_in_word => inf_article_text_in_word_tbl(i)
2745 --clm
2746 --p_variable_code => inf_variable_code_tbl(i)
2747 );
2748
2749 IF (api_return_status = G_RET_STS_UNEXP_ERROR) THEN
2750 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2751 ELSIF (api_return_status = G_RET_STS_ERROR) THEN
2752 l_return_status := G_RET_STS_ERROR;
2753 END IF;
2754
2755 ELSIF inf_action_tbl(i) in ('U','V') THEN
2756 --validating only article type because only article type is updated
2757 l_row_notfound := FALSE;
2758 OPEN validate_article_type_csr (inf_article_type_tbl(i),
2759 inf_article_id_tbl(i),
2760 inf_action_tbl(i));
2761 FETCH validate_article_type_csr INTO inf_article_type_tbl(i);
2762 l_row_notfound := validate_article_type_csr%NOTFOUND;
2763 CLOSE validate_article_type_csr;
2764
2765 IF l_row_notfound THEN
2766 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2767 p_msg_name => 'OKC_ART_INVALID_ARTICLE_TYPE',
2768 p_token1 => 'ARTICLE_TITLE',
2769 p_token1_value => inf_article_title_tbl(i));
2770 l_return_status := G_RET_STS_ERROR;
2771
2772 END IF;
2773
2774 -- nvl for nullable column to avoid getting database value
2775 -- in the validate API
2776 api_return_status :=
2777 OKC_ARTICLE_VERSIONS_PVT.validate_record(
2778 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
2779 p_import_action => inf_action_tbl(i),
2780 x_earlier_adoption_type => l_earlier_adoption_type,
2781 x_earlier_version_id => l_earlier_version_id,
2782 x_earlier_version_number => l_earlier_version_number,
2783 x_article_language => l_article_language,
2784 p_article_version_id => inf_article_version_id_tbl(i),
2785 p_article_id => inf_article_id_tbl(i),
2786 p_article_version_number => inf_article_version_number_tbl(i),
2787 p_article_text => inf_article_text_tbl(i),
2788 p_provision_yn => inf_provision_yn_tbl(i),
2789 p_insert_by_reference => inf_insert_by_reference_tbl(i),
2790 p_lock_text => inf_lock_text_tbl(i),
2791 p_global_yn => inf_global_yn_tbl(i),
2792 p_article_language => inf_article_language_tbl(i),
2793 p_article_status => l_tmp_article_status,
2794 p_sav_release => NULL,
2795 p_start_date => inf_start_date_tbl(i),
2796 p_end_date => inf_end_date_tbl(i),
2797 p_std_article_version_id => NULL,
2798 p_display_name => inf_display_name_tbl(i),
2799 p_translated_yn => NULL,
2800 p_article_description => inf_article_description_tbl(i),
2801 p_date_approved => inf_date_approved_tbl(i),
2802 p_default_section => inf_default_section_tbl(i),
2803 p_reference_source => inf_reference_source_tbl(i),
2804 p_reference_text => inf_reference_text_tbl(i),
2805 p_orig_system_reference_code => inf_art_reference_code_tbl(i),
2806 p_orig_system_reference_id1 => inf_art_reference_id1_tbl(i),
2807 p_orig_system_reference_id2 => inf_art_reference_id2_tbl(i),
2808 p_program_id => NULL,
2809 p_program_application_id => NULL,
2810 p_request_id => NULL,
2811 p_current_org_id => G_CURRENT_ORG_ID,
2812 p_additional_instructions => inf_instructions_tbl(i),
2813 p_variation_description => NULL,
2814 p_date_published => inf_date_published_tbl(i) ,
2815 p_attribute_category => inf_attribute_category_tbl(i) ,
2816 p_attribute1 => inf_attribute1_tbl(i) ,
2817 p_attribute2 => inf_attribute2_tbl(i) ,
2818 p_attribute3 => inf_attribute3_tbl(i) ,
2819 p_attribute4 => inf_attribute4_tbl(i) ,
2820 p_attribute5 => inf_attribute5_tbl(i) ,
2821 p_attribute6 => inf_attribute6_tbl(i) ,
2822 p_attribute7 => inf_attribute7_tbl(i) ,
2823 p_attribute8 => inf_attribute8_tbl(i) ,
2824 p_attribute9 => inf_attribute9_tbl(i) ,
2825 p_attribute10 => inf_attribute10_tbl(i) ,
2826 p_attribute11 => inf_attribute11_tbl(i) ,
2827 p_attribute12 => inf_attribute12_tbl(i) ,
2828 p_attribute13 => inf_attribute13_tbl(i) ,
2829 p_attribute14 => inf_attribute14_tbl(i) ,
2830 p_attribute15 => inf_attribute15_tbl(i) ,
2831 p_edited_in_word => inf_edited_in_word_tbl(i) ,
2832 p_article_text_in_word => inf_article_text_in_word_tbl(i)
2833 --clm
2834 --p_variable_code => inf_variable_code_tbl(i)
2835 );
2836 END IF;
2837
2838
2839 --
2840 --
2841 -- If error is Unexpected then raise exception
2842 -- Otherwise, keep going
2843 --
2844 --
2845 IF (api_return_status = G_RET_STS_UNEXP_ERROR) THEN
2846 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2847 ELSIF (api_return_status = G_RET_STS_ERROR) THEN
2848 l_return_status := G_RET_STS_ERROR;
2849 END IF;
2850
2851 -- Continue with the rest of validation unless some unexpected error is encountered.
2852 -- It is always a good idea to show all errors at one shot.
2853 -- Parse through the article text and build the list of variables to be used.
2854 -- For validate only mode = N change the user friendly variable tags with valid XML and variable codes.
2855
2856 IF p_validate_only = 'N' THEN
2857 l_replace_text := 'Y';
2858 ELSE
2859 l_replace_text := 'N';
2860 END IF;
2861
2862 --
2863 -- Copying the clob in interface into temporary clob
2864 --
2865 --
2866
2867 DBMS_LOB.TRIM(g_temp_clob_tbl(i), 0);
2868
2869 OKC_ARTICLES_GRP.parse_n_replace_text(
2870 p_api_version => l_api_version,
2871 p_init_msg_list => l_init_msg_list,
2872 p_article_text => inf_article_text_tbl(i),
2873 p_dest_clob => g_temp_clob_tbl(i),
2874 p_calling_mode => 'IMPORT',
2875 p_batch_number => p_batch_number, -- Bug 4659659
2876 p_replace_text => l_replace_text,
2877 p_article_intent => inf_article_intent_tbl(i),
2878 p_language => inf_article_language_tbl(i),
2879 x_return_status => api_return_status,
2880 x_msg_count => x_msg_count,
2881 x_msg_data => x_msg_data,
2882 x_variables_tbl => l_variable_code_tbl
2883 ) ;
2884
2885 -- Add value_set check for 'PENDING_APPROVAL' and 'APPROVED' clause
2886 IF (inf_article_status_tbl(i) in ('PENDING_APPROVAL','APPROVED')) THEN
2887 IF l_variable_code_tbl.COUNT > 0 THEN
2888 k:=0;
2889 FOR k in l_variable_code_tbl.FIRST ..l_variable_code_tbl.LAST LOOP
2890 OPEN l_check_valid_valueset_csr (l_variable_code_tbl(k));
2891 FETCH l_check_valid_valueset_csr INTO l_value_set_id,
2892 l_variable_type;
2893 CLOSE l_check_valid_valueset_csr;
2894
2895 IF l_value_set_id is NULL AND l_variable_type = 'U' THEN
2896 OPEN l_var_name_csr (l_variable_code_tbl(k),
2897 inf_article_language_tbl(i));
2898 FETCH l_var_name_csr INTO l_variable_name;
2899 CLOSE l_var_name_csr;
2900 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
2901 p_msg_name => 'OKC_ART_INV_VALUESET',
2902 p_token1 => 'VARIABLE_NAME',
2903 p_token1_value => l_variable_name,
2904 p_token2 => 'ARTICLE_TITLE',
2905 p_token2_value => inf_article_title_tbl(i),
2906 p_token3 => 'ARTICLE_VERSION',
2907 p_token3_value => inf_article_version_number_tbl(i));
2908 api_return_status := G_RET_STS_ERROR;
2909 END IF;
2910 END LOOP;
2911 END IF;
2912 END IF;
2913
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 RAISE FND_API.G_EXC_ERROR ;
2918 ELSIF (l_return_status = G_RET_STS_ERROR) THEN
2919 RAISE FND_API.G_EXC_ERROR ;
2920 END IF;
2921
2922 ------------------------------------------------------------------------
2923 -- Now that we have validated and data is clean we can fetch sequences and ids
2924 -- for new articles for DML and also set the process status to Success
2925 -------------------------------------------------------------------------
2926 IF p_validate_only = 'N' THEN
2927 l_context:='PREPARING DML FOR CLAUSE';
2928
2929 IF inf_action_tbl(i) = 'N' THEN
2930 -- Generate article number based on autonumbering
2931
2932 -- When article number is not given, then we get number from autonumber API
2933 IF nvl(inf_article_number_tbl(i),'-99') = '-99' THEN
2934 OKC_ARTICLES_GRP.GET_ARTICLE_SEQ_NUMBER
2935 (p_article_number =>inf_article_number_tbl(i),
2936 p_seq_type_info_only => 'N',
2937 p_org_id => G_CURRENT_ORG_ID,
2938 x_article_number => l_article_number,
2939 x_doc_sequence_type => l_doc_sequence_type,
2940 x_return_status => api_return_status
2941 ) ;
2942
2943 IF api_return_status = G_RET_STS_SUCCESS Then
2944 inf_article_number_tbl(i) := l_article_number;
2945 ELSIF (api_return_status = G_RET_STS_UNEXP_ERROR) THEN
2946 l_return_status := api_return_status;
2947 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2948 ELSE
2949 l_return_status := api_return_status; -- whatever error, it will overwrite it
2950 END IF;
2951 END IF;
2952
2953 -- Get article id.
2954 api_return_status := Get_Seq_Id (p_object_type => 'ART',
2955 x_object_id => inf_article_id_tbl(i));
2956 IF (api_return_status = G_RET_STS_UNEXP_ERROR) THEN
2957 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2958 ELSIF (api_return_status = G_RET_STS_ERROR) THEN
2959 l_return_status := api_return_status;
2960 RAISE FND_API.G_EXC_ERROR ;
2961 END IF;
2962
2963 api_return_status := Get_Seq_Id (p_object_type => 'VER',
2964 x_object_id => inf_article_version_id_tbl(i));
2965 IF (api_return_status = G_RET_STS_UNEXP_ERROR) THEN
2966 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2967 ELSIF (api_return_status = G_RET_STS_ERROR) THEN
2968 l_return_status := api_return_status;
2969 RAISE FND_API.G_EXC_ERROR ;
2970 END IF;
2971
2972 -- Create variable association for the new article - 1st version.
2973 IF l_variable_code_tbl.COUNT > 0 THEN
2974 FOR k in l_variable_code_tbl.FIRST ..l_variable_code_tbl.LAST LOOP
2975 artv_variable_code_tbl(j) := l_variable_code_tbl(k);
2976 artv_article_version_id_tbl(j) := inf_article_version_id_tbl(i);
2977 artv_action_tbl(j) := 'N';
2978 j := j+1;
2979 END LOOP;
2980
2981 END IF;
2982
2983
2984 ELSIF inf_action_tbl(i) = 'V' THEN -- new version
2985
2986 -- if status is APPROVED then save id of prev. version
2987 -- to set end date of previous version
2988 IF inf_article_status_tbl(i) = 'APPROVED' THEN
2989 inf_earlier_version_id_tbl(i) := l_earlier_version_id;
2990 END IF;
2991
2992 -- Get article version id.
2993
2994 api_return_status := Get_Seq_Id (p_object_type => 'VER',
2995 x_object_id => inf_article_version_id_tbl(i));
2996 IF (api_return_status = G_RET_STS_UNEXP_ERROR) THEN
2997 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2998 ELSIF (api_return_status = G_RET_STS_ERROR) THEN
2999 l_return_status := api_return_status;
3000 RAISE FND_API.G_EXC_ERROR ;
3001 END IF;
3002
3003 -- Create variable association for the new version.
3004 IF l_variable_code_tbl.COUNT > 0 THEN
3005
3006 FOR k in l_variable_code_tbl.FIRST ..l_variable_code_tbl.LAST LOOP
3007 artv_variable_code_tbl(j) := l_variable_code_tbl(k);
3008 artv_article_version_id_tbl(j) := inf_article_version_id_tbl(i);
3009 artv_action_tbl(j) := 'N';
3010 j := j+1;
3011 END LOOP;
3012 END IF;
3013
3014 -- Set adoption type with earlier adoption type
3015 inf_adoption_type_tbl(i) := l_earlier_adoption_type;
3016
3017
3018 ELSIF inf_action_tbl(i) = 'U' THEN
3019
3020 -- Find out the variables that need to be added as these are new
3021 -- or those that need to be deleted as they are no longer used.
3022
3023 OKC_ARTICLES_GRP.UPDATE_ARTICLE_VARIABLES (
3024 p_article_version_id => inf_article_version_id_tbl(i),
3025 p_variable_code_tbl => l_variable_code_tbl,
3026 p_do_dml => 'N', -- indicates not to do dml in the API
3027 x_variables_to_insert_tbl => l_variables_to_insert_tbl,
3028 x_variables_to_delete_tbl => l_variables_to_delete_tbl,
3029 x_return_status => api_return_status);
3030 IF (api_return_status = G_RET_STS_UNEXP_ERROR) THEN
3031 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3032 ELSIF (api_return_status = G_RET_STS_ERROR) THEN
3033 RAISE FND_API.G_EXC_ERROR ;
3034 END IF;
3035
3036 -- New Variables
3037 IF l_variables_to_insert_tbl.COUNT > 0 THEN
3038
3039 FOR k in l_variables_to_insert_tbl.FIRST ..l_variables_to_insert_tbl.LAST LOOP
3040 artv_variable_code_tbl(j) := l_variables_to_insert_tbl(k);
3041 artv_article_version_id_tbl(j) := inf_article_version_id_tbl(i);
3042 artv_action_tbl(j) := 'N';
3043 j := j+1;
3044 END LOOP;
3045 END IF;
3046 -- Variables no longer used.
3047 IF l_variables_to_delete_tbl.COUNT > 0 THEN
3048 FOR k in l_variables_to_delete_tbl.FIRST ..l_variables_to_delete_tbl.LAST LOOP
3049 artv_variable_code_tbl(j) := l_variables_to_delete_tbl(k);
3050 artv_article_version_id_tbl(j) := inf_article_version_id_tbl(i);
3051 artv_action_tbl(j) := 'D';
3052 j := j+1;
3053 END LOOP;
3054 END IF;
3055
3056 END IF; -- end of IF inf_action_tbl(i) = 'N'
3057
3058 --Delete variables cache tables for next interface row
3059 l_variables_to_insert_tbl.DELETE;
3060 l_variables_to_delete_tbl.DELETE;
3061 l_variable_code_tbl.DELETE;
3062
3063 END IF; -- validate_only = 'N'
3064
3065 -- Summarize report for this row
3066 -- Status 'F' is for internal use meaning parsing failure marked in
3067 -- java concurrent program
3068 IF (l_return_status = G_RET_STS_SUCCESS) THEN
3069 IF (nvl(inf_process_status_tbl(i), 'E') = 'E') THEN
3070 inf_process_status_tbl(i) := G_RET_STS_SUCCESS;
3071 ELSIF ( inf_process_status_tbl(i) = 'F') THEN
3072 -- ##count parser failure as error
3073 --l_tot_rows_failed := l_tot_rows_failed+1;
3074 l_part_rows_failed := l_part_rows_failed+1;
3075 inf_process_status_tbl(i) := G_RET_STS_ERROR;
3076 END IF;
3077 ELSIF (l_return_status = l_sts_warning) THEN
3078 IF (nvl(inf_process_status_tbl(i),'E') = 'E') THEN
3079 inf_process_status_tbl(i) := l_sts_warning;
3080 --##count
3081 --l_tot_rows_warned := l_tot_rows_warned+1;
3082 l_part_rows_warned := l_part_rows_warned+1;
3083 ELSIF (inf_process_status_tbl(i) = 'F') THEN
3084 -- ##count parser failure as error
3085 --l_tot_rows_failed := l_tot_rows_failed+1;
3086 l_part_rows_failed := l_part_rows_failed+1;
3087 inf_process_status_tbl(i) := G_RET_STS_ERROR;
3088 END IF;
3089 ELSIF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
3090 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3091 ELSIF (l_return_status = G_RET_STS_ERROR) THEN
3092 RAISE FND_API.G_EXC_ERROR;
3093 END IF;
3094
3095 -------------------------
3096 -------------------------
3097 -- Exception Block for each iteration in Loop
3098 -- validation and unexpected errors
3099 -- In case of unexpected error, escape the loop
3100 -------------------------
3101 -------------------------
3102
3103 EXCEPTION
3104 WHEN FND_API.G_EXC_ERROR THEN
3105 IF (l_debug = 'Y') THEN
3106 okc_debug.log('300: In Articles_Import: OKC_API.G_EXCEPTION_ERROR Exception', 2);
3107 END IF;
3108 --l_return_status := G_RET_STS_ERROR ;
3109 build_error_array(
3110 p_msg_data => x_msg_data,
3111 p_context => l_context,
3112 p_batch_process_id => l_batch_process_id,
3113 p_interface_id => inf_interface_id_tbl(i),
3114 p_article_title => inf_article_title_tbl(i),
3115 p_error_type => G_RET_STS_ERROR,
3116 p_entity => 'CLAUSE'
3117 );
3118 inf_process_status_tbl(i) := G_RET_STS_ERROR;
3119 --##count
3120 --l_tot_rows_failed := l_tot_rows_failed+1;
3121 l_part_rows_failed := l_part_rows_failed+1;
3122 -- Continue to next row
3123
3124 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3125 IF (l_debug = 'Y') THEN
3126 okc_debug.log('400: Leaving Articles_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
3127 END IF;
3128
3129 --
3130 -- Freeing temporary clobs
3131 --
3132 j := g_temp_clob_tbl.FIRST;
3133 LOOP
3134 DBMS_LOB.FREETEMPORARY(g_temp_clob_tbl(j));
3135 EXIT WHEN (j = g_temp_clob_tbl.LAST);
3136 j := g_temp_clob_tbl.NEXT(j);
3137 END LOOP;
3138 g_temp_clob_tbl.DELETE;
3139 --
3140 -- Freeing temporary clobs
3141 --
3142
3143 IF l_interface_csr%ISOPEN THEN
3144 CLOSE l_interface_csr;
3145 END IF;
3146
3147 IF get_max_article_version_csr%ISOPEN THEN
3148 CLOSE get_max_article_version_csr;
3149 END IF;
3150
3151 IF get_article_info_csr%ISOPEN THEN
3152 CLOSE get_article_info_csr;
3153 END IF;
3154
3155 IF validate_article_type_csr%ISOPEN THEN
3156 CLOSE validate_article_type_csr;
3157 END IF;
3158 --Set_Message
3159 l_return_status := G_RET_STS_UNEXP_ERROR ;
3160 x_return_status := G_RET_STS_UNEXP_ERROR ;
3161
3162 build_error_array(
3163 p_msg_data => x_msg_data,
3164 p_context => l_context,
3165 p_batch_process_id => l_batch_process_id,
3166 p_interface_id => inf_interface_id_tbl(i),
3167 p_article_title => inf_article_title_tbl(i),
3168 p_error_type => G_RET_STS_UNEXP_ERROR,
3169 p_entity => 'CLAUSE'
3170 );
3171 inf_process_status_tbl(i) := G_RET_STS_ERROR;
3172 --##count
3173 --l_tot_rows_failed := l_tot_rows_failed+1;
3174 l_part_rows_failed := l_part_rows_failed+1;
3175 exit; -- exit the current fetch
3176
3177 WHEN OTHERS THEN
3178 IF (l_debug = 'Y') THEN
3179 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION: '||sqlerrm, 2);
3180 END IF;
3181
3182
3183 --
3184 -- Freeing temporary clobs
3185 --
3186 j := g_temp_clob_tbl.FIRST;
3187 LOOP
3188 DBMS_LOB.FREETEMPORARY(g_temp_clob_tbl(j));
3189 EXIT WHEN (j = g_temp_clob_tbl.LAST);
3190 j := g_temp_clob_tbl.NEXT(j);
3191 END LOOP;
3192 g_temp_clob_tbl.DELETE;
3193 --
3194 -- Freeing temporary clobs
3195 --
3196
3197 IF l_interface_csr%ISOPEN THEN
3198 CLOSE l_interface_csr;
3199 END IF;
3200
3201 IF get_max_article_version_csr%ISOPEN THEN
3202 CLOSE get_max_article_version_csr;
3203 END IF;
3204
3205 IF get_article_info_csr%ISOPEN THEN
3206 CLOSE get_article_info_csr;
3207 END IF;
3208
3209 IF validate_article_type_csr%ISOPEN THEN
3210 CLOSE validate_article_type_csr;
3211 END IF;
3212 l_return_status := G_RET_STS_UNEXP_ERROR ;
3213 x_return_status := G_RET_STS_UNEXP_ERROR ;
3214
3215 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
3216 p_msg_name => G_UNEXPECTED_ERROR,
3217 p_token1 => G_SQLCODE_TOKEN,
3218 p_token1_value => sqlcode,
3219 p_token2 => G_SQLERRM_TOKEN,
3220 p_token2_value => sqlerrm);
3221
3222 build_error_array(
3223 p_msg_data => G_UNEXPECTED_ERROR,
3224 p_context => l_context,
3225 p_batch_process_id => l_batch_process_id,
3226 p_interface_id => inf_interface_id_tbl(i),
3227 p_article_title => inf_article_title_tbl(i),
3228 p_error_type => G_RET_STS_ERROR,
3229 p_entity => 'CLAUSE'
3230 );
3231 inf_process_status_tbl(i) := G_RET_STS_ERROR;
3232 --##count
3233 --l_tot_rows_failed := l_tot_rows_failed+1;
3234 l_part_rows_failed := l_part_rows_failed+1;
3235 exit; -- exit the current fetch
3236 END;
3237 -------------------------
3238 -------------------------
3239 -- Exception Block for each iteration in Loop ends
3240 -------------------------
3241 -------------------------
3242
3243
3244 END LOOP; -- end of FOR i in inf_interface_id_tbl.FIRST ..
3245 ------------------------------------------------------------------------
3246 -------------- End of Inner Loop thru fetched row for---------------------
3247 -- validation, parse and validate article text, create a variable list
3248 -- prepare rows for DML if validate_only is 'N'
3249 -------------------------------------------------------------------------
3250 -- In order to propagate Unexpected error raise it if it is 'U'
3251 IF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
3252 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3253 END IF;
3254
3255 -------------------------
3256 -------------------------
3257 -- Exception Block for Inner Loop starts
3258 -- Handles unexpected errors as last step
3259 -------------------------
3260 -------------------------
3261 EXCEPTION
3262 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3263 IF (l_debug = 'Y') THEN
3264 okc_debug.log('400: Leaving Articles_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
3265 END IF;
3266 --
3267 -- Freeing temporary clobs
3268 --
3269 j := g_temp_clob_tbl.FIRST;
3270 LOOP
3271 DBMS_LOB.FREETEMPORARY(g_temp_clob_tbl(j));
3272 EXIT WHEN (j = g_temp_clob_tbl.LAST);
3273 j := g_temp_clob_tbl.NEXT(j);
3274 END LOOP;
3275 g_temp_clob_tbl.DELETE;
3276 --
3277 -- Freeing temporary clobs
3278 --
3279
3280 IF l_interface_csr%ISOPEN THEN
3281 CLOSE l_interface_csr;
3282 END IF;
3283 IF get_max_article_version_csr%ISOPEN THEN
3284 CLOSE get_max_article_version_csr;
3285 END IF;
3286 IF get_article_info_csr%ISOPEN THEN
3287 CLOSE get_article_info_csr;
3288 END IF;
3289 IF validate_article_type_csr%ISOPEN THEN
3290 CLOSE validate_article_type_csr;
3291 END IF;
3292 l_return_status := G_RET_STS_UNEXP_ERROR ;
3293 x_return_status := G_RET_STS_UNEXP_ERROR ;
3294 exit; -- exit outermost loop
3295
3296 WHEN OTHERS THEN
3297 IF (l_debug = 'Y') THEN
3298 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION: '||sqlerrm, 2);
3299 END IF;
3300
3301 --
3302 -- Freeing temporary clobs
3303 --
3304 j := g_temp_clob_tbl.FIRST;
3305 LOOP
3306 DBMS_LOB.FREETEMPORARY(g_temp_clob_tbl(j));
3307 EXIT WHEN (j = g_temp_clob_tbl.LAST);
3308 j := g_temp_clob_tbl.NEXT(j);
3309 END LOOP;
3310 g_temp_clob_tbl.DELETE;
3311 --
3312 -- Freeing temporary clobs
3313 --
3314
3315 IF l_interface_csr%ISOPEN THEN
3316 CLOSE l_interface_csr;
3317 END IF;
3318 IF get_max_article_version_csr%ISOPEN THEN
3319 CLOSE get_max_article_version_csr;
3320 END IF;
3321 IF get_article_info_csr%ISOPEN THEN
3322 CLOSE get_article_info_csr;
3323 END IF;
3324 IF validate_article_type_csr%ISOPEN THEN
3325 CLOSE validate_article_type_csr;
3326 END IF;
3327 l_return_status := G_RET_STS_UNEXP_ERROR ;
3328 x_return_status := G_RET_STS_UNEXP_ERROR ;
3329 exit; -- exit outermost loop
3330 END;
3331
3332 -------------------------
3333 -------------------------
3334 -- Exception Block for Each Iteration of outermost Loop ends
3335 -------------------------
3336 -------------------------
3337
3338 ------------------------------------------------------------------------
3339 --------------------- Start Do_DML for Article Library ---------------
3340 -- Insert or Update Article, Article Version
3341 -- Insert variable association
3342 -------------------------------------------------------------------------
3343 -- initialize l_return_status to track status of DML execution
3344 l_return_status := G_RET_STS_SUCCESS;
3345
3346
3347 IF p_validate_only = 'N' THEN
3348 BEGIN
3349 SAVEPOINT bulkdml;
3350
3351 i := 0;
3352 -- Bulk insert New Valid Records
3353 BEGIN
3354 l_context := 'INSERTING NEW CLAUSE';
3355
3356 FORALL i in inf_interface_id_tbl.FIRST ..inf_interface_id_tbl.LAST
3357 INSERT INTO OKC_ARTICLES_ALL(
3358 ARTICLE_ID,
3359 ARTICLE_TITLE,
3360 ORG_ID,
3361 ARTICLE_NUMBER,
3362 STANDARD_YN,
3363 ARTICLE_INTENT,
3364 ARTICLE_LANGUAGE,
3365 ARTICLE_TYPE,
3366 ORIG_SYSTEM_REFERENCE_CODE,
3367 ORIG_SYSTEM_REFERENCE_ID1,
3368 ORIG_SYSTEM_REFERENCE_ID2,
3369 CZ_TRANSFER_STATUS_FLAG,
3370 PROGRAM_ID,
3371 PROGRAM_LOGIN_ID,
3372 PROGRAM_APPLICATION_ID,
3373 REQUEST_ID,
3374 OBJECT_VERSION_NUMBER,
3375 CREATED_BY,
3376 CREATION_DATE,
3377 LAST_UPDATED_BY,
3378 LAST_UPDATE_LOGIN,
3379 LAST_UPDATE_DATE)
3380 SELECT
3381 inf_article_id_tbl(i),
3382 inf_article_title_tbl(i),
3383 G_CURRENT_ORG_ID,
3384 inf_article_number_tbl(i),
3385 'Y',
3386 inf_article_intent_tbl(i),
3387 nvl(inf_article_language_tbl(i),l_userenv_lang),
3388 inf_article_type_tbl(i),
3389 inf_art_reference_code_tbl(i),
3390 inf_art_reference_id1_tbl(i),
3391 inf_art_reference_id2_tbl(i),
3392 'N',
3393 l_program_id,
3394 l_program_login_id,
3395 l_program_appl_id,
3396 l_request_id,
3397 1.0,
3398 l_user_id,
3399 sysdate,
3400 l_user_id,
3401 l_login_id,
3402 sysdate
3403 FROM DUAL
3404 WHERE inf_action_tbl(i) = 'N' and
3405 inf_process_status_tbl(i) in ('S', 'W') ;
3406
3407 -- Using a " select from dual" aproach as above prevents creation of
3408 -- additional PL/SQL tables for bulk insert of
3409 -- articles if we were to use a FORALL INSERT INTO .... VALUES .... approach.
3410 -- We cannot use FORALL INSERT INTO .... VALUES ....using
3411 -- the existing inf*tbl since the error rows need to be
3412 -- filtered out.
3413
3414 EXCEPTION
3415 WHEN OTHERS THEN
3416 IF (l_debug = 'Y') THEN
3417 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
3418 END IF;
3419 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3420 END;
3421
3422 --
3423 -- End of Insert into OKC_ARTICLES_ALL
3424 --
3425 --
3426
3427 i := 0;
3428 BEGIN
3429 l_context := 'INSERTING NEW VERSION OF CLAUSE';
3430
3431 FORALL i in inf_interface_id_tbl.FIRST ..inf_interface_id_tbl.LAST
3432 INSERT INTO OKC_ARTICLE_VERSIONS(
3433 ARTICLE_VERSION_ID,
3434 ARTICLE_ID,
3435 ARTICLE_VERSION_NUMBER,
3436 ARTICLE_TEXT,
3437 PROVISION_YN,
3438 INSERT_BY_REFERENCE,
3439 LOCK_TEXT,
3440 GLOBAL_YN,
3441 ARTICLE_LANGUAGE,
3442 ARTICLE_STATUS,
3443 SAV_RELEASE,
3444 START_DATE,
3445 END_DATE,
3446 STD_ARTICLE_VERSION_ID,
3447 DISPLAY_NAME,
3448 TRANSLATED_YN,
3449 ARTICLE_DESCRIPTION,
3450 DATE_APPROVED,
3451 DEFAULT_SECTION,
3452 REFERENCE_SOURCE,
3453 REFERENCE_TEXT,
3454 ORIG_SYSTEM_REFERENCE_CODE,
3455 ORIG_SYSTEM_REFERENCE_ID1,
3456 ORIG_SYSTEM_REFERENCE_ID2,
3457 ADDITIONAL_INSTRUCTIONS,
3458 VARIATION_DESCRIPTION,
3459 DATE_PUBLISHED,
3460 ADOPTION_TYPE,
3461 PROGRAM_ID,
3462 PROGRAM_LOGIN_ID,
3463 PROGRAM_APPLICATION_ID,
3464 REQUEST_ID,
3465 ATTRIBUTE_CATEGORY,
3466 ATTRIBUTE1,
3467 ATTRIBUTE2,
3468 ATTRIBUTE3,
3469 ATTRIBUTE4,
3470 ATTRIBUTE5,
3471 ATTRIBUTE6,
3472 ATTRIBUTE7,
3473 ATTRIBUTE8,
3474 ATTRIBUTE9,
3475 ATTRIBUTE10,
3476 ATTRIBUTE11,
3477 ATTRIBUTE12,
3478 ATTRIBUTE13,
3479 ATTRIBUTE14,
3480 ATTRIBUTE15,
3481 --Clause Editing
3482 EDITED_IN_WORD,
3483 ARTICLE_TEXT_IN_WORD,
3484 OBJECT_VERSION_NUMBER,
3485 CREATED_BY,
3486 CREATION_DATE,
3487 LAST_UPDATED_BY,
3488 LAST_UPDATE_LOGIN,
3489 LAST_UPDATE_DATE)
3490 SELECT
3491 inf_article_version_id_tbl(i),
3492 inf_article_id_tbl(i),
3493 inf_article_version_number_tbl(i),
3494 g_temp_clob_tbl(i),
3495 inf_provision_yn_tbl(i),
3496 inf_insert_by_reference_tbl(i),
3497 inf_lock_text_tbl(i),
3498 inf_global_yn_tbl(i),
3499 nvl(inf_article_language_tbl(i),l_userenv_lang),
3500 inf_article_status_tbl(i),
3501 NULL,
3502 trunc(inf_start_date_tbl(i)),
3503 trunc(inf_end_date_tbl(i)),
3504 NULL,
3505 inf_display_name_tbl(i),
3506 NULL,
3507 inf_article_description_tbl(i),
3508 inf_date_approved_tbl(i),
3509 inf_default_section_tbl(i),
3510 inf_reference_source_tbl(i),
3511 inf_reference_text_tbl(i),
3512 inf_ver_reference_code_tbl(i),
3513 inf_ver_reference_id1_tbl(i),
3514 inf_ver_reference_id2_tbl(i),
3515 inf_instructions_tbl(i),
3516 NULL,
3517 inf_date_published_tbl(i),
3518 inf_adoption_type_tbl(i),
3519 l_program_id,
3520 l_program_login_id,
3521 l_program_appl_id,
3522 l_request_id,
3523 inf_attribute_category_tbl(i),
3524 inf_attribute1_tbl(i),
3525 inf_attribute2_tbl(i),
3526 inf_attribute3_tbl(i),
3527 inf_attribute4_tbl(i),
3528 inf_attribute5_tbl(i),
3529 inf_attribute6_tbl(i),
3530 inf_attribute7_tbl(i),
3531 inf_attribute8_tbl(i),
3532 inf_attribute9_tbl(i),
3533 inf_attribute10_tbl(i),
3534 inf_attribute11_tbl(i),
3535 inf_attribute12_tbl(i),
3536 inf_attribute13_tbl(i),
3537 inf_attribute14_tbl(i),
3538 inf_attribute15_tbl(i),
3539 --Clause Editing
3540 inf_edited_in_word_tbl(i),
3541 inf_article_text_in_word_tbl(i),
3542 1.0,
3543 l_user_id,
3544 sysdate,
3545 l_user_id,
3546 l_login_id,
3547 sysdate
3548 FROM OKC_ARTICLES_ALL
3549 WHERE inf_action_tbl(i) IN ( 'N', 'V')
3550 AND inf_process_status_tbl(i) in ('S', 'W')
3551 AND article_id = inf_article_id_tbl(i);
3552
3553 EXCEPTION
3554 WHEN OTHERS THEN
3555 IF (l_debug = 'Y') THEN
3556 okc_debug.log('500: Leaving Article Import because of EXCEPTION: '||l_context||sqlerrm, 2);
3557 END IF;
3558 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3559 END;
3560
3561 --
3562 -- End of Insert into OKC_ARTICLE_VERSIONS
3563 --
3564 --
3565
3566 i := 0;
3567 BEGIN
3568 IF artv_variable_code_tbl.COUNT > 0 Then
3569 l_context := 'INSERT ASSOCIATION FOR VARIABLES';
3570
3571 i := 0;
3572
3573 FORALL i in artv_variable_code_tbl.FIRST .. artv_variable_code_tbl.LAST
3574 INSERT INTO OKC_ARTICLE_VARIABLES
3575 (
3576 ARTICLE_VERSION_ID ,
3577 VARIABLE_CODE ,
3578 OBJECT_VERSION_NUMBER ,
3579 CREATED_BY ,
3580 CREATION_DATE ,
3581 LAST_UPDATE_DATE ,
3582 LAST_UPDATED_BY ,
3583 LAST_UPDATE_LOGIN
3584 )
3585 SELECT
3586 artv_article_version_id_tbl(i),
3587 artv_variable_code_tbl(i),
3588 1.0,
3589 l_user_id,
3590 sysdate,
3591 sysdate,
3592 l_user_id,
3593 l_login_id
3594 FROM OKC_ARTICLE_VERSIONS
3595 WHERE artv_action_tbl(i) = 'N'
3596 AND article_version_id = artv_article_version_id_tbl(i);
3597
3598 END IF;
3599
3600 IF artv_variable_code_tbl.COUNT > 0 Then
3601 l_context := 'DELETE ASSOCIATION FOR VARIABLES';
3602 FORALL i in artv_variable_code_tbl.FIRST .. artv_variable_code_tbl.LAST
3603 DELETE FROM OKC_ARTICLE_VARIABLES
3604 WHERE VARIABLE_CODE = artv_variable_code_tbl(i)
3605 AND ARTICLE_VERSION_ID = artv_article_version_id_tbl(i)
3606 AND artv_action_tbl(i) = 'D';
3607 END IF;
3608 EXCEPTION
3609 WHEN OTHERS THEN
3610 IF (l_debug = 'Y') THEN
3611 okc_debug.log('500: Leaving Article Import because of EXCEPTION: '||l_context||sqlerrm, 2);
3612 END IF;
3613 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3614 END;
3615
3616 artv_article_version_id_tbl.DELETE;
3617 artv_variable_code_tbl.DELETE;
3618 artv_action_tbl.DELETE;
3619
3620 --
3621 -- End of OKC_ARTICLES_VARIABLES
3622 --
3623 --
3624
3625 i := 0;
3626 BEGIN
3627 l_context := 'SET END DATE IN PREV. VER';
3628
3629 FORALL i in inf_interface_id_tbl.FIRST ..inf_interface_id_tbl.LAST
3630 UPDATE OKC_ARTICLE_VERSIONS
3631 SET END_DATE = trunc(inf_start_date_tbl(i)-1),
3632 PROGRAM_ID = l_program_id,
3633 REQUEST_ID = l_request_id,
3634 PROGRAM_LOGIN_ID = l_program_login_id,
3635 PROGRAM_APPLICATION_ID = l_program_appl_id,
3636 OBJECT_VERSION_NUMBER = object_version_number + 1,
3637 LAST_UPDATED_BY = l_user_id,
3638 LAST_UPDATE_LOGIN = l_login_id,
3639 LAST_UPDATE_DATE = SYSDATE
3640 WHERE inf_action_tbl(i) = 'V'
3641 AND inf_process_status_tbl(i) in ('S','W')
3642 AND inf_earlier_version_id_tbl(i) <> -99
3643 AND article_version_id = inf_earlier_version_id_tbl(i);
3644 EXCEPTION
3645 WHEN OTHERS THEN
3646 IF (l_debug = 'Y') THEN
3647 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
3648 END IF;
3649 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3650 END;
3651 --
3652 -- End of Insert into OKC_ARTICLE_VERSIONS
3653 --
3654 --
3655
3656 i := 0;
3657 BEGIN
3658 l_context := 'UPDATING CLAUSE TYPE FOR ACTION V AND U';
3659
3660 FORALL i in inf_interface_id_tbl.FIRST ..inf_interface_id_tbl.LAST
3661 UPDATE OKC_ARTICLES_ALL
3662 SET ARTICLE_TYPE = inf_article_type_tbl(i),
3663 PROGRAM_ID = l_program_id,
3664 REQUEST_ID = l_request_id,
3665 PROGRAM_LOGIN_ID = l_program_login_id,
3666 PROGRAM_APPLICATION_ID = l_program_appl_id,
3667 OBJECT_VERSION_NUMBER = object_version_number + 1,
3668 LAST_UPDATED_BY = l_user_id,
3669 LAST_UPDATE_LOGIN = l_login_id,
3670 LAST_UPDATE_DATE = SYSDATE
3671 WHERE inf_action_tbl(i) in ('U', 'V')
3672 AND inf_process_status_tbl(i) in ('S','W')
3673 AND article_id = inf_article_id_tbl(i);
3674 EXCEPTION
3675 WHEN OTHERS THEN
3676 IF (l_debug = 'Y') THEN
3677 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
3678 END IF;
3679 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3680 END;
3681 ---
3682 ---
3683 ---
3684 i := 0;
3685 BEGIN
3686 l_context := 'UPDATING CLAUSE END DATE FOR ACTION D ';
3687
3688 FORALL i in inf_interface_id_tbl.FIRST ..inf_interface_id_tbl.LAST
3689 UPDATE OKC_ARTICLE_VERSIONS
3690 SET END_DATE = trunc(inf_end_date_tbl(i)),
3691 PROGRAM_ID = l_program_id,
3692 REQUEST_ID = l_request_id,
3693 PROGRAM_LOGIN_ID = l_program_login_id,
3694 PROGRAM_APPLICATION_ID = l_program_appl_id,
3695 OBJECT_VERSION_NUMBER = object_version_number + 1,
3696 LAST_UPDATED_BY = l_user_id,
3697 LAST_UPDATE_LOGIN = l_login_id,
3698 LAST_UPDATE_DATE = SYSDATE
3699 WHERE inf_action_tbl(i) in ('D')
3700 AND inf_process_status_tbl(i) in ('S','W')
3701 AND article_version_id = inf_article_version_id_tbl(i);
3702 EXCEPTION
3703 WHEN OTHERS THEN
3704 IF (l_debug = 'Y') THEN
3705 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
3706 END IF;
3707 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3708 END;
3709
3710 ---
3711 ---
3712 ---
3713 i := 0;
3714 BEGIN
3715 l_context := 'UPDATING CLAUSE VERSION';
3716
3717 FORALL i in inf_interface_id_tbl.FIRST ..inf_interface_id_tbl.LAST
3718 UPDATE OKC_ARTICLE_VERSIONS VO SET (
3719 ARTICLE_TEXT,
3720 PROVISION_YN,
3721 INSERT_BY_REFERENCE,
3722 LOCK_TEXT,
3723 GLOBAL_YN,
3724 ARTICLE_STATUS,
3725 START_DATE,
3726 END_DATE,
3727 DISPLAY_NAME,
3728 ARTICLE_DESCRIPTION,
3729 DEFAULT_SECTION,
3730 REFERENCE_SOURCE,
3731 REFERENCE_TEXT,
3732 ORIG_SYSTEM_REFERENCE_CODE,
3733 ORIG_SYSTEM_REFERENCE_ID1,
3734 ORIG_SYSTEM_REFERENCE_ID2,
3735 ADDITIONAL_INSTRUCTIONS,
3736 DATE_PUBLISHED,
3737 PROGRAM_ID,
3738 PROGRAM_LOGIN_ID,
3739 PROGRAM_APPLICATION_ID,
3740 REQUEST_ID,
3741 ATTRIBUTE_CATEGORY,
3742 ATTRIBUTE1,
3743 ATTRIBUTE2,
3744 ATTRIBUTE3,
3745 ATTRIBUTE4,
3746 ATTRIBUTE5,
3747 ATTRIBUTE6,
3748 ATTRIBUTE7,
3749 ATTRIBUTE8,
3750 ATTRIBUTE9,
3751 ATTRIBUTE10,
3752 ATTRIBUTE11,
3753 ATTRIBUTE12,
3754 ATTRIBUTE13,
3755 ATTRIBUTE14,
3756 ATTRIBUTE15,
3757 --Clause Editing
3758 EDITED_IN_WORD,
3759 ARTICLE_TEXT_IN_WORD,
3760 OBJECT_VERSION_NUMBER,
3761 LAST_UPDATED_BY,
3762 LAST_UPDATE_LOGIN,
3763 LAST_UPDATE_DATE) = (
3764 SELECT
3765 g_temp_clob_tbl(i),
3766 inf_provision_yn_tbl(i),
3767 inf_insert_by_reference_tbl(i),
3768 inf_lock_text_tbl(i),
3769 inf_global_yn_tbl(i),
3770 inf_article_status_tbl(i),
3771 trunc(inf_start_date_tbl(i)),
3772 trunc(inf_end_date_tbl(i)),
3773 inf_display_name_tbl(i),
3774 inf_article_description_tbl(i),
3775 inf_default_section_tbl(i),
3776 inf_reference_source_tbl(i),
3777 inf_reference_text_tbl(i),
3778 inf_ver_reference_code_tbl(i),
3779 inf_ver_reference_id1_tbl(i),
3780 inf_ver_reference_id2_tbl(i),
3781 inf_instructions_tbl(i),
3782 inf_date_published_tbl(i),
3783 l_program_id,
3784 l_program_login_id,
3785 l_program_appl_id,
3786 l_request_id,
3787 inf_attribute_category_tbl(i),
3788 inf_attribute1_tbl(i),
3789 inf_attribute2_tbl(i),
3790 inf_attribute3_tbl(i),
3791 inf_attribute4_tbl(i),
3792 inf_attribute5_tbl(i),
3793 inf_attribute6_tbl(i),
3794 inf_attribute7_tbl(i),
3795 inf_attribute8_tbl(i),
3796 inf_attribute9_tbl(i),
3797 inf_attribute10_tbl(i),
3798 inf_attribute11_tbl(i),
3799 inf_attribute12_tbl(i),
3800 inf_attribute13_tbl(i),
3801 inf_attribute14_tbl(i),
3802 inf_attribute15_tbl(i),
3803 --Clause Editing
3804 inf_edited_in_word_tbl(i),
3805 inf_article_text_in_word_tbl(i),
3806 vi.object_version_number+1,
3807 l_user_id,
3808 l_login_id,
3809 sysdate
3810 FROM OKC_ART_INTERFACE_ALL VI
3811 WHERE inf_action_tbl(i) = 'U'
3812 AND nvl(process_status, 'E') in ('E')
3813 AND inf_process_status_tbl(i) in ('S', 'W')
3814 AND VI.interface_id = inf_interface_id_tbl(i))
3815 WHERE vo.article_version_id = inf_article_version_id_tbl(i)
3816 AND inf_process_status_tbl(i) in ('S','W')
3817 AND inf_action_tbl(i) = 'U';
3818
3819 EXCEPTION
3820 WHEN OTHERS THEN
3821 IF (l_debug = 'Y') THEN
3822 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
3823 END IF;
3824 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3825 END;
3826 --
3827 -- End of Update OKC_ARTICLE_VERSIONS
3828 --
3829 --
3830
3831
3832
3833 --
3834 -- Start Auto Adoption
3835 --
3836 --
3837 -- Auto adopt all approved global articles in New/New Version case.
3838
3839 IF G_CURRENT_ORG_ID = G_GLOBAL_ORG_ID THEN
3840 BEGIN
3841 i := 0;
3842 l_context := 'AUTO ADOPTION';
3843 For i IN inf_interface_id_tbl.FIRST ..inf_interface_id_tbl.LAST LOOP
3844 IF nvl(inf_process_status_tbl(i),'E') <> 'E'
3845 and nvl(inf_article_status_tbl(i), '*') = 'APPROVED'
3846 and inf_global_yn_tbl(i) = 'Y' THEN
3847 OKC_ADOPTIONS_GRP.AUTO_ADOPT_ARTICLES
3848 (
3849 p_api_version => l_api_version ,
3850 p_init_msg_list => l_init_msg_list ,
3851 x_return_status => api_return_status ,
3852 x_msg_count => x_msg_count,
3853 x_msg_data => x_msg_data,
3854 p_relationship_yn => 'N',
3855 p_adoption_yn => 'Y',
3856 p_fetchsize => 100,
3857 p_global_article_id => inf_article_id_tbl(i),
3858 p_global_article_version_id => inf_article_version_id_tbl(i)
3859 );
3860
3861 IF (api_return_status = G_RET_STS_UNEXP_ERROR) THEN
3862 -- in order to mark interface_id, we build error_array in the loop
3863 build_error_array(
3864 p_msg_data => x_msg_data,
3865 p_context => l_context,
3866 p_batch_process_id => l_batch_process_id,
3867 p_interface_id => inf_interface_id_tbl(i),
3868 p_article_title => inf_article_title_tbl(i),
3869 p_error_type => G_RET_STS_ERROR,
3870 p_entity => 'CLAUSE'
3871 );
3872 inf_process_status_tbl(i):= G_RET_STS_ERROR;
3873 -- Unexpected Error occurred rollback
3874 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3875 ELSIF (api_return_status = G_RET_STS_ERROR) THEN
3876 -- Set return status as 'E' and move on to next record
3877 -- l_return_status := G_RET_STS_ERROR;
3878 build_error_array(
3879 p_msg_data => x_msg_data,
3880 p_context => l_context,
3881 p_batch_process_id => l_batch_process_id,
3882 p_interface_id => inf_interface_id_tbl(i),
3883 p_article_title => inf_article_title_tbl(i),
3884 p_error_type => G_RET_STS_ERROR,
3885 p_entity => 'CLAUSE'
3886 );
3887 inf_process_status_tbl(i):= G_RET_STS_ERROR;
3888 RAISE FND_API.G_EXC_ERROR;
3889 END IF;
3890 END IF;
3891 END LOOP;
3892
3893
3894 EXCEPTION
3895 WHEN OTHERS THEN
3896 IF (l_debug = 'Y') THEN
3897 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
3898 END IF;
3899 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3900 END;
3901 END IF; ---- If CURRENT_ORG_ID = GLOBAL_ORG_ID
3902
3903 --
3904 -- End of Auto Adoption
3905 --
3906 --
3907
3908 -- Exception for bulk DML block
3909 EXCEPTION
3910 WHEN OTHERS THEN
3911 l_bulk_failed := 'Y'; -- indicating that bulk operation has failed
3912 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
3913 p_msg_name => G_UNEXPECTED_ERROR,
3914 p_token1 => G_SQLCODE_TOKEN,
3915 p_token1_value => sqlcode,
3916 p_token2 => G_SQLERRM_TOKEN,
3917 p_token2_value => sqlerrm);
3918 Okc_API.Set_Message(p_app_name => G_APP_NAME,
3919 p_msg_name => 'OKC_ART_FETCH_FAILED',
3920 p_token1 => 'CONTEXT',
3921 p_token1_value => l_context);
3922
3923 build_error_array(
3924 p_msg_data => null,
3925 p_context => l_context,
3926 p_batch_process_id => l_batch_process_id,
3927 p_interface_id => -99,
3928 p_article_title => NULL,
3929 p_error_type => G_RET_STS_ERROR,
3930 p_entity => 'CLAUSE'
3931 );
3932 l_return_status := G_RET_STS_UNEXP_ERROR;
3933 x_return_status := G_RET_STS_UNEXP_ERROR;
3934
3935 --##count:rollback the count
3936 l_part_rows_failed := l_part_rows_processed;
3937 l_part_rows_warned := 0;
3938
3939 ROLLBACK TO SAVEPOINT bulkdml;
3940 exit; -- exit outermost loop
3941 END;
3942
3943 END IF; --- validate_only = 'N'
3944
3945 ------------------------------------------------------------------------
3946 --------------------- End of Do_DML for Article Library ---------------
3947 -------------------------------------------------------------------------
3948
3949 ------------------------------------------------------------------------
3950 --------------- Start of Do_DML for import related tables ------------
3951 -- Update interface table
3952 -- Insert Errors into Error table
3953 -------------------------------------------------------------------------
3954 -- Update Interface Table
3955 i:=0;
3956 BEGIN
3957 l_context := 'UPDATING CLAUSE INTERFACE TABLE';
3958 FORALL i in inf_interface_id_tbl.FIRST..inf_interface_id_tbl.LAST
3959 UPDATE OKC_ART_INTERFACE_ALL
3960 SET
3961 -- We don't want to update process_status to 'S' or 'W' in validation_mode
3962 -- because it is not going to be picked up in next run if we do so
3963 PROCESS_STATUS = decode(p_validate_only||inf_process_status_tbl(i)||l_bulk_failed,
3964 'NEN','E',
3965 'NSN','S',
3966 'NWN','W',
3967 'NEY','E',
3968 'NSY',NULL,
3969 'NWY',NULL,
3970 'YEY','E',
3971 'YEN','E',
3972 'NFY','E',
3973 'YFY','E',
3974 'NFN','E',
3975 'YFN','E',NULL),
3976 ARTICLE_VERSION_NUMBER = inf_article_version_number_tbl(i),
3977 PROGRAM_ID = l_program_id,
3978 REQUEST_ID = l_request_id,
3979 PROGRAM_LOGIN_ID = l_program_login_id,
3980 PROGRAM_APPLICATION_ID = l_program_appl_id,
3981 OBJECT_VERSION_NUMBER = inf_object_version_number_tbl(i) + 1,
3982 LAST_UPDATED_BY = l_user_id,
3983 LAST_UPDATE_LOGIN = l_login_id,
3984 LAST_UPDATE_DATE = SYSDATE
3985 WHERE
3986 interface_id = inf_interface_id_tbl(i);
3987 EXCEPTION
3988 WHEN OTHERS THEN
3989 IF (l_debug = 'Y') THEN
3990 okc_debug.log('500: Leaving Article_Import because of EXCEPTION: '||sqlerrm, 2);
3991 END IF;
3992 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
3993 p_msg_name => G_UNEXPECTED_ERROR,
3994 p_token1 => G_SQLCODE_TOKEN,
3995 p_token1_value => sqlcode,
3996 p_token2 => G_SQLERRM_TOKEN,
3997 p_token2_value => sqlerrm);
3998 Okc_API.Set_Message(p_app_name => G_APP_NAME,
3999 p_msg_name => 'OKC_ART_INT_UPDATE_FAILED');
4000 build_error_array(
4001 p_msg_data => null,
4002 p_context => l_context,
4003 p_batch_process_id => l_batch_process_id,
4004 p_interface_id => -99,
4005 p_article_title => NULL,
4006 p_error_type => G_RET_STS_ERROR,
4007 p_entity => 'CLAUSE'
4008 );
4009 l_return_status := G_RET_STS_UNEXP_ERROR ;
4010 x_return_status := G_RET_STS_UNEXP_ERROR ;
4011 --##count:rollback the count
4012 l_part_rows_failed := l_part_rows_processed;
4013 l_part_rows_warned := 0;
4014
4015 --RAISE FND_API.G_EXC_ERROR ;
4016 END;
4017 --
4018 -- End of Update OKC_ART_INTERFACE_ALL
4019 --
4020 --
4021 --Insert Errors into Error table for this fetch
4022 insert_error_array(
4023 x_return_status => api_return_status,
4024 x_msg_count => x_msg_count,
4025 x_msg_data => x_msg_data
4026 );
4027
4028
4029 IF (api_return_status = l_insert_errors_error) THEN
4030 NULL;
4031 -- Ignore
4032 -- RAISE l_insert_errors_exception;
4033 END IF;
4034 ------------------------------------------------------------------------
4035 --------------- End of Do_DML for import related tables ------------
4036 -------------------------------------------------------------------------
4037 commit;
4038 -- Now delete cache for next bulk fetch
4039
4040
4041 inf_interface_id_tbl.DELETE;
4042 inf_batch_number_tbl.DELETE;
4043 inf_object_version_number_tbl.DELETE;
4044 inf_article_title_tbl.DELETE;
4045 inf_org_id_tbl.DELETE;
4046 inf_process_status_tbl.DELETE;
4047 inf_action_tbl.DELETE;
4048 inf_article_number_tbl.DELETE;
4049 inf_article_intent_tbl.DELETE;
4050 inf_article_language_tbl.DELETE;
4051 inf_article_type_tbl.DELETE;
4052 inf_article_id_tbl.DELETE;
4053 inf_art_reference_code_tbl.DELETE;
4054 inf_art_reference_id1_tbl.DELETE;
4055 inf_art_reference_id2_tbl.DELETE;
4056 inf_article_version_number_tbl.DELETE;
4057 inf_article_text_tbl.DELETE;
4058 inf_provision_yn_tbl.DELETE;
4059 inf_insert_by_reference_tbl.DELETE;
4060 inf_lock_text_tbl.DELETE;
4061 inf_global_yn_tbl.DELETE;
4062 inf_article_status_tbl.DELETE;
4063 inf_start_date_tbl.DELETE;
4064 inf_end_date_tbl.DELETE;
4065 inf_display_name_tbl.DELETE;
4066 --inf_translated_yn_tbl.DELETE;
4067 inf_article_description_tbl.DELETE;
4068 inf_date_approved_tbl.DELETE;
4069 inf_default_section_tbl.DELETE;
4070 inf_reference_source_tbl.DELETE;
4071 inf_reference_text_tbl.DELETE;
4072 inf_ver_reference_code_tbl.DELETE;
4073 inf_ver_reference_id1_tbl.DELETE;
4074 inf_ver_reference_id2_tbl.DELETE;
4075 inf_instructions_tbl.DELETE;
4076 inf_date_published_tbl.DELETE;
4077 inf_attribute_category_tbl.DELETE;
4078 inf_attribute1_tbl.DELETE;
4079 inf_attribute2_tbl.DELETE;
4080 inf_attribute3_tbl.DELETE;
4081 inf_attribute4_tbl.DELETE;
4082 inf_attribute5_tbl.DELETE;
4083 inf_attribute6_tbl.DELETE;
4084 inf_attribute7_tbl.DELETE;
4085 inf_attribute8_tbl.DELETE;
4086 inf_attribute9_tbl.DELETE;
4087 inf_attribute10_tbl.DELETE;
4088 inf_attribute11_tbl.DELETE;
4089 inf_attribute12_tbl.DELETE;
4090 inf_attribute13_tbl.DELETE;
4091 inf_attribute14_tbl.DELETE;
4092 inf_attribute15_tbl.DELETE;
4093 --Clause Editing
4094 inf_edited_in_word_tbl.DELETE;
4095 inf_article_text_in_word_tbl.DELETE;
4096 inf_article_version_id_tbl.DELETE;
4097 inf_earlier_version_id_tbl.DELETE;
4098 inf_adoption_type_tbl.DELETE;
4099 err_batch_process_id_tbl.DELETE;
4100 err_article_title_tbl.DELETE;
4101 err_interface_id_tbl.DELETE;
4102 err_error_number_tbl.DELETE;
4103 err_object_version_number_tbl.DELETE;
4104 err_error_type_tbl.DELETE;
4105 err_entity_tbl.DELETE;
4106 err_error_description_tbl.DELETE;
4107
4108 EXIT WHEN l_interface_csr%NOTFOUND;
4109 END LOOP;
4110
4111
4112 -----------------------------------------------------------------------
4113 -- End of outermost loop for bulk fetch
4114 -----------------------------------------------------------------------
4115
4116 IF l_interface_csr%ISOPEN THEN
4117 CLOSE l_interface_csr;
4118 END IF;
4119
4120 --
4121 -- Freeing temporary clobs
4122 --
4123 --
4124
4125 j := g_temp_clob_tbl.FIRST;
4126 LOOP
4127 DBMS_LOB.FREETEMPORARY(g_temp_clob_tbl(j));
4128 EXIT WHEN (j = g_temp_clob_tbl.LAST);
4129 j := g_temp_clob_tbl.NEXT(j);
4130 END LOOP;
4131 g_temp_clob_tbl.DELETE;
4132
4133 --
4134 -- Freeing temporary clobs
4135 --
4136 --
4137
4138 --##count:add up last processed counts
4139 l_tot_rows_processed := l_tot_rows_processed + l_part_rows_processed;
4140 l_tot_rows_failed := l_tot_rows_failed + l_part_rows_failed;
4141 l_tot_rows_warned := l_tot_rows_warned + l_part_rows_warned;
4142
4143 BEGIN
4144 --If there are successful records and validate mode is off
4145
4146 IF p_validate_only = 'N'
4147 AND (l_tot_rows_processed - l_tot_rows_failed) > 0 THEN
4148 okc_artwf_pvt.start_wf_after_import( p_req_id => l_request_id,
4149 p_batch_number => p_batch_number,
4150 p_org_id => G_CURRENT_ORG_ID);
4151 END IF;
4152
4153 EXCEPTION
4154
4155 WHEN OTHERS THEN
4156 IF (l_debug = 'Y') THEN
4157 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION in workflow: '||sqlerrm, 2);
4158 END IF;
4159 Okc_API.Set_Message(p_app_name => G_APP_NAME,
4160 p_msg_name => 'OKC_ART_IMP_WF_FAILED');
4161
4162 build_error_array(
4163 p_msg_data => null,
4164 p_context => l_context,
4165 p_batch_process_id => l_batch_process_id,
4166 p_interface_id => -99,
4167 p_article_title => NULL,
4168 p_error_type => G_RET_STS_ERROR,
4169 p_entity => 'CLAUSE'
4170 );
4171
4172 l_return_status := G_RET_STS_UNEXP_ERROR ;
4173 x_return_status := G_RET_STS_UNEXP_ERROR ;
4174 --RAISE FND_API.G_EXC_ERROR ;
4175 END;
4176 /*********
4177 --Update Batch Process Table as a last step
4178 UPDATE OKC_ART_INT_BATPROCS_ALL
4179 SET
4180 TOTAL_ROWS_PROCESSED = l_tot_rows_processed,
4181 TOTAL_ROWS_FAILED = l_tot_rows_failed,
4182 TOTAL_ROWS_WARNED = l_tot_rows_warned,
4183 END_DATE = SYSDATE,
4184 PROGRAM_ID = l_program_id,
4185 REQUEST_ID = l_request_id,
4186 PROGRAM_LOGIN_ID = l_program_login_id,
4187 PROGRAM_APPLICATION_ID = l_program_appl_id,
4188 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
4189 LAST_UPDATED_BY = l_user_id,
4190 LAST_UPDATE_LOGIN = l_login_id,
4191 LAST_UPDATE_DATE = SYSDATE
4192 WHERE
4193 BATCH_PROCESS_ID = l_batch_process_id
4194 AND ENTITY = 'Clause';
4195 *****************/
4196 p_rows_processed := l_tot_rows_processed;
4197 p_rows_failed := l_tot_rows_failed;
4198 p_rows_warned := l_tot_rows_warned;
4199 IF err_error_number_tbl.COUNT > 0 THEN
4200 insert_error_array(
4201 x_return_status => api_return_status,
4202 x_msg_count => x_msg_count,
4203 x_msg_data => x_msg_data
4204 );
4205 END IF;
4206
4207 -- Print statistic of this run in the log
4208 -- Commented for new XML Based Import - Moved to new_wrap_up in conc_import_articles
4209 --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');
4210 commit; -- Final commit for status update
4211
4212 IF (l_debug = 'Y') THEN
4213 okc_debug.log('200: Leaving articles import', 2);
4214 END IF;
4215 --x_return_status := l_return_status; this may cause to erase error x_return_status
4216
4217 EXCEPTION
4218
4219 WHEN FND_API.G_EXC_ERROR THEN
4220 IF (l_debug = 'Y') THEN
4221 okc_debug.log('300: Leaving Articles_Import: OKC_API.G_EXCEPTION_ERROR Exception', 2);
4222 END IF;
4223 --Insert Errors into Error table if there is any
4224 insert_error_array(
4225 x_return_status => x_return_status,
4226 x_msg_count => x_msg_count,
4227 x_msg_data => x_msg_data
4228 );
4229 commit;
4230 x_return_status := G_RET_STS_ERROR ;
4231
4232 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4233 IF (l_debug = 'Y') THEN
4234 okc_debug.log('400: Leaving Articles_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
4235 END IF;
4236
4237 --Insert Errors into Error table if there is any
4238
4239 insert_error_array(
4240 x_return_status => x_return_status,
4241 x_msg_count => x_msg_count,
4242 x_msg_data => x_msg_data
4243 );
4244 commit;
4245 --
4246 -- Freeing temporary clobs
4247 --
4248 --
4249
4250 IF g_temp_clob_tbl.COUNT > 0 THEN
4251 j := g_temp_clob_tbl.FIRST;
4252 LOOP
4253 DBMS_LOB.FREETEMPORARY(g_temp_clob_tbl(j));
4254 EXIT WHEN (j = g_temp_clob_tbl.LAST);
4255 j := g_temp_clob_tbl.NEXT(j);
4256 END LOOP;
4257 g_temp_clob_tbl.DELETE;
4258 END IF;
4259 --
4260 -- Freeing temporary clobs
4261 --
4262 --
4263
4264 IF l_interface_csr%ISOPEN THEN
4265 CLOSE l_interface_csr;
4266 END IF;
4267 IF get_max_article_version_csr%ISOPEN THEN
4268 CLOSE get_max_article_version_csr;
4269 END IF;
4270 IF get_article_info_csr%ISOPEN THEN
4271 CLOSE get_article_info_csr;
4272 END IF;
4273 IF validate_article_type_csr%ISOPEN THEN
4274 CLOSE validate_article_type_csr;
4275 END IF;
4276
4277 x_return_status := G_RET_STS_UNEXP_ERROR ;
4278 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
4279 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
4280 END IF;
4281 get_print_msgs_stack(p_msg_data => x_msg_data);
4282
4283 WHEN l_insert_errors_exception THEN
4284 --
4285 -- In this exception handling, we don't insert error array again
4286 -- because error happend in the module
4287 --
4288 IF (l_debug = 'Y') THEN
4289 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION in insert_error_array: '||sqlerrm, 2);
4290 END IF;
4291 --
4292 -- Freeing temporary clobs
4293 --
4294 --
4295
4296 IF g_temp_clob_tbl.COUNT > 0 THEN
4297 j := g_temp_clob_tbl.FIRST;
4298 LOOP
4299 DBMS_LOB.FREETEMPORARY(g_temp_clob_tbl(j));
4300 EXIT WHEN (j = g_temp_clob_tbl.LAST);
4301 j := g_temp_clob_tbl.NEXT(j);
4302 END LOOP;
4303 g_temp_clob_tbl.DELETE;
4304 END IF;
4305
4306 --
4307 -- Freeing temporary clobs
4308 --
4309 --
4310
4311 IF l_interface_csr%ISOPEN THEN
4312 CLOSE l_interface_csr;
4313 END IF;
4314
4315 IF get_max_article_version_csr%ISOPEN THEN
4316 CLOSE get_max_article_version_csr;
4317 END IF;
4318
4319 IF get_article_info_csr%ISOPEN THEN
4320 CLOSE get_article_info_csr;
4321 END IF;
4322
4323 IF validate_article_type_csr%ISOPEN THEN
4324 CLOSE validate_article_type_csr;
4325 END IF;
4326
4327
4328 --x_return_status := G_RET_STS_UNEXP_ERROR ;
4329 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
4330 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
4331 END IF;
4332
4333 get_print_msgs_stack(p_msg_data => x_msg_data);
4334 commit;
4335
4336 WHEN OTHERS THEN
4337 IF (l_debug = 'Y') THEN
4338 okc_debug.log('500: Leaving Articles_Import because of EXCEPTION: '||sqlerrm, 2);
4339 END IF;
4340 --Insert Errors into Error table if there is any
4341 insert_error_array(
4342 x_return_status => x_return_status,
4343 x_msg_count => x_msg_count,
4344 x_msg_data => x_msg_data
4345 );
4346 commit;
4347 --
4348 -- Freeing temporary clobs
4349 --
4350 --
4351 IF g_temp_clob_tbl.COUNT > 0 THEN
4352 j := g_temp_clob_tbl.FIRST;
4353 LOOP
4354 DBMS_LOB.FREETEMPORARY(g_temp_clob_tbl(j));
4355 EXIT WHEN (j = g_temp_clob_tbl.LAST);
4356 j := g_temp_clob_tbl.NEXT(j);
4357 END LOOP;
4358 g_temp_clob_tbl.DELETE;
4359 END IF;
4360 --
4361 -- Freeing temporary clobs
4362 --
4363 --
4364
4365 IF l_interface_csr%ISOPEN THEN
4366 CLOSE l_interface_csr;
4367 END IF;
4368 IF get_max_article_version_csr%ISOPEN THEN
4369 CLOSE get_max_article_version_csr;
4370 END IF;
4371 IF get_article_info_csr%ISOPEN THEN
4372 CLOSE get_article_info_csr;
4373 END IF;
4374 IF validate_article_type_csr%ISOPEN THEN
4375 CLOSE validate_article_type_csr;
4376 END IF;
4377
4378 x_return_status := G_RET_STS_UNEXP_ERROR ;
4379 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
4380 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
4381 END IF;
4382 get_print_msgs_stack(p_msg_data => x_msg_data);
4383
4384 END import_articles;
4385
4386 PROCEDURE import_variables(
4387 x_return_status OUT NOCOPY VARCHAR2,
4388 x_msg_count OUT NOCOPY NUMBER,
4389 x_msg_data OUT NOCOPY VARCHAR2,
4390
4391 p_batch_procs_id IN NUMBER,
4392 p_batch_number IN VARCHAR2,
4393 p_validate_only IN VARCHAR2 := 'Y',
4394 p_fetchsize IN NUMBER := 100
4395 ) IS
4396 l_api_version CONSTANT NUMBER := 1;
4397 l_api_name CONSTANT VARCHAR2(30) := 'import_variables';
4398 l_sts_warning CONSTANT VARCHAR2(1) := 'W';
4399 l_row_notfound BOOLEAN := FALSE;
4400 l_user_id NUMBER;
4401 l_login_id NUMBER;
4402 l_insert_errors_exception EXCEPTION;
4403 l_insert_errors_error CONSTANT VARCHAR2(1) := 'X';
4404
4405 CURSOR l_var_interface_csr ( cp_batch_number IN VARCHAR2) IS
4406 SELECT
4407 VARINT.INTERFACE_ID ,
4408 VARINT.BATCH_NUMBER ,
4409 VARINT.OBJECT_VERSION_NUMBER ,
4410 RTRIM(VARINT.VARIABLE_CODE) VARIABLE_CODE ,
4411 VARINT.VARIABLE_NAME ,
4412 VARINT.PROCESS_STATUS ,
4413 VARINT.ACTION ,
4414 VARINT.LANGUAGE ,
4415 VARINT.DESCRIPTION,
4416 VARINT.VARIABLE_TYPE,
4417 VARINT.VARIABLE_INTENT,
4418 VARINT.CONTRACT_EXPERT_YN,
4419 VARINT.XPRT_VALUE_SET_NAME,
4420 VARINT.DISABLED_YN,
4421 VARINT.EXTERNAL_YN,
4422 VARINT.VARIABLE_DATATYPE,
4423 VARINT.APPLICATION_ID,
4424 VARINT.VALUE_SET_NAME,
4425 VARINT.VARIABLE_DEFAULT_VALUE,
4426 VARINT.ORIG_SYSTEM_REFERENCE_CODE,
4427 VARINT.ORIG_SYSTEM_REFERENCE_ID1,
4428 VARINT.ORIG_SYSTEM_REFERENCE_ID2,
4429 VARINT.DATE_PUBLISHED,
4430 VARINT.ATTRIBUTE_CATEGORY,
4431 VARINT.ATTRIBUTE1 ,
4432 VARINT.ATTRIBUTE2 ,
4433 VARINT.ATTRIBUTE3 ,
4434 VARINT.ATTRIBUTE4 ,
4435 VARINT.ATTRIBUTE5 ,
4436 VARINT.ATTRIBUTE6 ,
4437 VARINT.ATTRIBUTE7 ,
4438 VARINT.ATTRIBUTE8 ,
4439 VARINT.ATTRIBUTE9 ,
4440 VARINT.ATTRIBUTE10 ,
4441 VARINT.ATTRIBUTE11 ,
4442 VARINT.ATTRIBUTE12 ,
4443 VARINT.ATTRIBUTE13 ,
4444 VARINT.ATTRIBUTE14 ,
4445 VARINT.ATTRIBUTE15 ,
4446 VAR.VARIABLE_CODE EXISTING_CODE,
4447 VAR.DATE_PUBLISHED EXISTING_DPUBLISHED,
4448 VARTL.LANGUAGE EXISTING_LANGUAGE
4449 FROM OKC_VARIABLES_INTERFACE VARINT, OKC_BUS_VARIABLES_B VAR,
4450 OKC_BUS_VARIABLES_TL VARTL
4451 WHERE nvl(PROCESS_STATUS,'*') NOT IN ('W', 'S')
4452 AND BATCH_NUMBER = cp_batch_number
4453 AND RTRIM(VARINT.VARIABLE_CODE) = VAR.VARIABLE_CODE(+)
4454 AND RTRIM(VARINT.VARIABLE_CODE) = VARTL.VARIABLE_CODE(+)
4455 AND VARINT.LANGUAGE = VARTL.LANGUAGE(+)
4456 ORDER BY RTRIM(VARINT.VARIABLE_CODE) ASC;
4457
4458 -- Cursor to check that variable code is unique in the system
4459
4460 CURSOR l_code_exist_csr (cp_var_code IN VARCHAR2) IS
4461 SELECT '1' FROM OKC_BUS_VARIABLES_B
4462 WHERE variable_code = cp_var_code;
4463
4464 -- Cursor to check that variable name and intent is unique in the system
4465
4466 CURSOR get_var_unq_csr (cp_var_name IN VARCHAR2,
4467 cp_var_intent IN VARCHAR2) IS
4468 SELECT
4469 '1'
4470 FROM OKC_BUS_VARIABLES_B B,OKC_BUS_VARIABLES_TL TL
4471 WHERE B.VARIABLE_CODE = TL.VARIABLE_CODE AND
4472 B.VARIABLE_INTENT = cp_var_intent AND
4473 TL.VARIABLE_NAME = cp_var_name;
4474
4475 -- Cursor to check that variable code is not duplicate in the system
4476
4477 CURSOR get_var_info_csr (cp_var_code IN VARCHAR2 ) IS
4478 SELECT
4479 '1'
4480 FROM OKC_BUS_VARIABLES_B B,OKC_BUS_VARIABLES_TL TL
4481 WHERE B.VARIABLE_CODE = TL.VARIABLE_CODE AND
4482 B.VARIABLE_CODE = cp_var_code;
4483
4484 -- Cursor to derive value set id from value set name
4485
4486 CURSOR get_valset_id_csr (cp_valset_name IN VARCHAR2 ) IS
4487 SELECT
4488 FLX.FLEX_VALUE_SET_ID ,
4489 DECODE(FORMAT_TYPE,'C','V','X','D',FORMAT_TYPE) FORMAT_TYPE
4490 FROM FND_FLEX_VALUE_SETS FLX
4491 WHERE FLX.FLEX_VALUE_SET_NAME = cp_valset_name;
4492
4493
4494 -- Cursor to check valueset exists in the valueset interface Table
4495 CURSOR valset_exists_csr (cp_valset_name IN VARCHAR2,
4496 cp_batch_number IN VARCHAR2) IS
4497 SELECT '1'
4498 FROM OKC_VALUESETS_INTERFACE
4499 WHERE flex_value_set_name = cp_valset_name
4500 AND batch_number = cp_batch_number
4501 AND nvl(process_status,'X') not in ('E');
4502
4503 -- Cursor to verify language is installed
4504 CURSOR check_lang_csr(lang_code IN VARCHAR2) IS
4505 SELECT '1'
4506 FROM FND_LANGUAGES
4507 WHERE INSTALLED_FLAG IN ('I','B')
4508 AND language_code = lang_code;
4509
4510 -- Variable Interface Rows
4511
4512 TYPE l_vinf_interface_id IS TABLE OF OKC_VARIABLES_INTERFACE.INTERFACE_ID%TYPE INDEX BY BINARY_INTEGER ;
4513 TYPE l_vinf_batch_number IS TABLE OF OKC_VARIABLES_INTERFACE.BATCH_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
4514 TYPE l_vinf_object_version_number IS TABLE OF OKC_VARIABLES_INTERFACE.OBJECT_VERSION_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
4515 TYPE l_vinf_variable_code IS TABLE OF OKC_VARIABLES_INTERFACE.VARIABLE_CODE%TYPE INDEX BY BINARY_INTEGER ;
4516 TYPE l_vinf_variable_name IS TABLE OF OKC_VARIABLES_INTERFACE.VARIABLE_NAME%TYPE INDEX BY BINARY_INTEGER ;
4517 TYPE l_vinf_process_status IS TABLE OF OKC_VARIABLES_INTERFACE.PROCESS_STATUS%TYPE INDEX BY BINARY_INTEGER ;
4518 TYPE l_vinf_action IS TABLE OF OKC_VARIABLES_INTERFACE.ACTION%TYPE INDEX BY BINARY_INTEGER ;
4519 TYPE l_vinf_language IS TABLE OF OKC_VARIABLES_INTERFACE.LANGUAGE%TYPE INDEX BY BINARY_INTEGER ;
4520 TYPE l_vinf_description IS TABLE OF OKC_VARIABLES_INTERFACE.DESCRIPTION%TYPE INDEX BY BINARY_INTEGER ;
4521 TYPE l_vinf_variable_type IS TABLE OF OKC_VARIABLES_INTERFACE.VARIABLE_TYPE%TYPE INDEX BY BINARY_INTEGER ;
4522 TYPE l_vinf_variable_intent IS TABLE OF OKC_VARIABLES_INTERFACE.VARIABLE_INTENT%TYPE INDEX BY BINARY_INTEGER ;
4523 TYPE l_vinf_contract_expert_yn IS TABLE OF OKC_VARIABLES_INTERFACE.CONTRACT_EXPERT_YN%TYPE INDEX BY BINARY_INTEGER ;
4524 TYPE l_vinf_xprt_value_set_name IS TABLE OF OKC_VARIABLES_INTERFACE.XPRT_VALUE_SET_NAME%TYPE INDEX BY BINARY_INTEGER ;
4525 TYPE l_vinf_disabled_yn IS TABLE OF OKC_VARIABLES_INTERFACE.DISABLED_YN%TYPE INDEX BY BINARY_INTEGER ;
4526 TYPE l_vinf_external_yn IS TABLE OF OKC_VARIABLES_INTERFACE.EXTERNAL_YN%TYPE INDEX BY BINARY_INTEGER ;
4527 TYPE l_vinf_variable_datatype IS TABLE OF OKC_VARIABLES_INTERFACE.VARIABLE_DATATYPE%TYPE INDEX BY BINARY_INTEGER ;
4528 TYPE l_vinf_application_id IS TABLE OF OKC_VARIABLES_INTERFACE.APPLICATION_ID%TYPE INDEX BY BINARY_INTEGER ;
4529 TYPE l_vinf_value_set_name IS TABLE OF OKC_VARIABLES_INTERFACE.VALUE_SET_NAME%TYPE INDEX BY BINARY_INTEGER ;
4530 TYPE l_vinf_var_default_value IS TABLE OF OKC_VARIABLES_INTERFACE.VARIABLE_DEFAULT_VALUE%TYPE INDEX BY BINARY_INTEGER ;
4531 TYPE l_vinf_system_reference_code IS TABLE OF OKC_VARIABLES_INTERFACE.ORIG_SYSTEM_REFERENCE_CODE%TYPE INDEX BY BINARY_INTEGER ;
4532 TYPE l_vinf_system_reference_id1 IS TABLE OF OKC_VARIABLES_INTERFACE.ORIG_SYSTEM_REFERENCE_ID1%TYPE INDEX BY BINARY_INTEGER ;
4533 TYPE l_vinf_system_reference_id2 IS TABLE OF OKC_VARIABLES_INTERFACE.ORIG_SYSTEM_REFERENCE_ID2%TYPE INDEX BY BINARY_INTEGER ;
4534 TYPE l_vinf_date_published IS TABLE OF OKC_VARIABLES_INTERFACE.DATE_PUBLISHED%TYPE INDEX BY BINARY_INTEGER ;
4535 TYPE l_vinf_attribute_category IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE_CATEGORY%TYPE INDEX BY BINARY_INTEGER ;
4536 TYPE l_vinf_attribute1 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE1%TYPE INDEX BY BINARY_INTEGER ;
4537 TYPE l_vinf_attribute2 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE2%TYPE INDEX BY BINARY_INTEGER ;
4538 TYPE l_vinf_attribute3 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE3%TYPE INDEX BY BINARY_INTEGER ;
4539 TYPE l_vinf_attribute4 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE4%TYPE INDEX BY BINARY_INTEGER ;
4540 TYPE l_vinf_attribute5 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE5%TYPE INDEX BY BINARY_INTEGER ;
4541 TYPE l_vinf_attribute6 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE6%TYPE INDEX BY BINARY_INTEGER ;
4542 TYPE l_vinf_attribute7 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE7%TYPE INDEX BY BINARY_INTEGER ;
4543 TYPE l_vinf_attribute8 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE8%TYPE INDEX BY BINARY_INTEGER ;
4544 TYPE l_vinf_attribute9 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE9%TYPE INDEX BY BINARY_INTEGER ;
4545 TYPE l_vinf_attribute10 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE10%TYPE INDEX BY BINARY_INTEGER ;
4546 TYPE l_vinf_attribute11 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE11%TYPE INDEX BY BINARY_INTEGER ;
4547 TYPE l_vinf_attribute12 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE12%TYPE INDEX BY BINARY_INTEGER ;
4548 TYPE l_vinf_attribute13 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE13%TYPE INDEX BY BINARY_INTEGER ;
4549 TYPE l_vinf_attribute14 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE14%TYPE INDEX BY BINARY_INTEGER ;
4550 TYPE l_vinf_attribute15 IS TABLE OF OKC_VARIABLES_INTERFACE.ATTRIBUTE15%TYPE INDEX BY BINARY_INTEGER ;
4551
4552
4553 TYPE l_vinf_existing_code IS TABLE OF OKC_BUS_VARIABLES_B.VARIABLE_CODE%TYPE INDEX BY BINARY_INTEGER ;
4554 TYPE l_vinf_existing_dpublished IS TABLE OF OKC_BUS_VARIABLES_B.DATE_PUBLISHED%TYPE INDEX BY BINARY_INTEGER ;
4555 TYPE l_vinf_value_set_id IS TABLE OF OKC_BUS_VARIABLES_B.VALUE_SET_ID%TYPE INDEX BY BINARY_INTEGER ;
4556 TYPE l_vinf_existing_language IS TABLE OF OKC_BUS_VARIABLES_TL.LANGUAGE%TYPE INDEX BY BINARY_INTEGER ;
4557
4558
4559 l_return_status VARCHAR2(1);
4560 l_error_index NUMBER := 1;
4561 l_batch_process_id NUMBER := 1;
4562 l_context VARCHAR2(50) := NULL;
4563 l_init_msg_list VARCHAR2(200) := okc_api.g_true;
4564 l_tot_rows_processed NUMBER := 0;
4565 l_tot_rows_failed NUMBER := 0;
4566 l_tot_rows_warned NUMBER := 0;
4567 l_part_rows_processed NUMBER := 0;
4568 l_part_rows_failed NUMBER := 0;
4569 l_part_rows_warned NUMBER := 0;
4570 l_bulk_failed VARCHAR2(1) := 'Y';
4571
4572 -- Variables for variables interface
4573 vinf_interface_id_tbl l_vinf_interface_id ;
4574 vinf_batch_number_tbl l_vinf_batch_number ;
4575 vinf_object_version_number_tbl l_vinf_object_version_number ;
4576 vinf_variable_code_tbl l_vinf_variable_code ;
4577 vinf_variable_name_tbl l_vinf_variable_name ;
4578 vinf_process_status_tbl l_vinf_process_status ;
4579 vinf_action_tbl l_vinf_action ;
4580 vinf_language_tbl l_vinf_language ;
4581 vinf_description_tbl l_vinf_description ;
4582 vinf_variable_type_tbl l_vinf_variable_type ;
4583 vinf_variable_intent_tbl l_vinf_variable_intent ;
4584 vinf_contract_expert_yn_tbl l_vinf_contract_expert_yn ;
4585 vinf_xprt_value_set_name_tbl l_vinf_xprt_value_set_name ;
4586 vinf_disabled_yn_tbl l_vinf_disabled_yn ;
4587 vinf_external_yn_tbl l_vinf_external_yn ;
4588 vinf_variable_datatype_tbl l_vinf_variable_datatype ;
4589 vinf_application_id_tbl l_vinf_application_id ;
4590 vinf_value_set_name_tbl l_vinf_value_set_name ;
4591 vinf_var_default_value_tbl l_vinf_var_default_value ;
4592 vinf_system_reference_code_tbl l_vinf_system_reference_code ;
4593 vinf_system_reference_id1_tbl l_vinf_system_reference_id1 ;
4594 vinf_system_reference_id2_tbl l_vinf_system_reference_id2 ;
4595 vinf_date_published_tbl l_vinf_date_published ;
4596 vinf_attribute_category_tbl l_vinf_attribute_category ;
4597 vinf_attribute1_tbl l_vinf_attribute1 ;
4598 vinf_attribute2_tbl l_vinf_attribute2 ;
4599 vinf_attribute3_tbl l_vinf_attribute3 ;
4600 vinf_attribute4_tbl l_vinf_attribute4 ;
4601 vinf_attribute5_tbl l_vinf_attribute5 ;
4602 vinf_attribute6_tbl l_vinf_attribute6 ;
4603 vinf_attribute7_tbl l_vinf_attribute7 ;
4604 vinf_attribute8_tbl l_vinf_attribute8 ;
4605 vinf_attribute9_tbl l_vinf_attribute9 ;
4606 vinf_attribute10_tbl l_vinf_attribute10 ;
4607 vinf_attribute11_tbl l_vinf_attribute11 ;
4608 vinf_attribute12_tbl l_vinf_attribute12 ;
4609 vinf_attribute13_tbl l_vinf_attribute13 ;
4610 vinf_attribute14_tbl l_vinf_attribute14 ;
4611 vinf_attribute15_tbl l_vinf_attribute15 ;
4612
4613
4614 vinf_existing_code_tbl l_vinf_existing_code ;
4615 vinf_existing_dpublished_tbl l_vinf_existing_dpublished ;
4616 vinf_value_set_id_tbl l_vinf_value_set_id ;
4617 vinf_existing_language_tbl l_vinf_existing_language ;
4618
4619 I NUMBER := 0;
4620 j NUMBER := 0;
4621 k NUMBER := 0;
4622 x NUMBER := 0;
4623 l_program_id OKC_VARIABLES_INTERFACE.PROGRAM_ID%TYPE;
4624 l_program_login_id OKC_VARIABLES_INTERFACE.PROGRAM_LOGIN_ID%TYPE;
4625 l_program_appl_id OKC_VARIABLES_INTERFACE.PROGRAM_APPLICATION_ID%TYPE;
4626 l_request_id OKC_VARIABLES_INTERFACE.REQUEST_ID%TYPE;
4627 l_dummy_unq VARCHAR2(1) := '?';
4628 l_dummy VARCHAR2(1) := '?';
4629 l_vs_id VARCHAR2(1) := NULL;
4630 l_language varchar2(1) := '?';
4631 l_value_set_id FND_FLEX_VALUE_SETS.FLEX_VALUE_SET_ID%TYPE;
4632 l_variable_datatype OKC_BUS_VARIABLES_B.VARIABLE_DATATYPE%TYPE;
4633
4634 BEGIN
4635 IF (l_debug = 'Y') THEN
4636 okc_debug.log('100: Entered variables_import', 2);
4637 END IF;
4638
4639 ------------------------------------------------------------------------
4640 -- Variable Initialization
4641 -------------------------------------------------------------------------
4642
4643 -- Standard Start of API savepoint
4644 FND_MSG_PUB.initialize;
4645 -- Initialize API return status to success
4646 x_return_status := FND_API.G_RET_STS_SUCCESS;
4647 l_return_status := G_RET_STS_SUCCESS;
4648 -- Cache user_id, login_id and org_id
4649 l_user_id := Fnd_Global.user_id;
4650 l_login_id := Fnd_Global.login_id;
4651
4652 IF FND_GLOBAL.CONC_PROGRAM_ID = -1 THEN
4653 l_program_id := NULL;
4654 ELSE
4655 l_program_id := FND_GLOBAL.CONC_PROGRAM_ID;
4656 END IF;
4657
4658 IF FND_GLOBAL.CONC_LOGIN_ID = -1 THEN
4659 l_program_login_id := NULL;
4660 ELSE
4661 l_program_login_id := FND_GLOBAL.CONC_LOGIN_ID;
4662 END IF;
4663
4664 IF FND_GLOBAL.PROG_APPL_ID = -1 THEN
4665 l_program_appl_id := NULL;
4666 ELSE
4667 l_program_appl_id := FND_GLOBAL.PROG_APPL_ID;
4668 END IF;
4669
4670 IF FND_GLOBAL.CONC_REQUEST_ID = -1 THEN
4671 l_request_id := NULL;
4672 ELSE
4673 l_request_id := FND_GLOBAL.CONC_REQUEST_ID;
4674 END IF;
4675
4676 l_batch_process_id := p_batch_procs_id;
4677 -------------------------------------------------------------------------
4678 --------------- the outermost loop of this procedure --------------------
4679 -- Bulk fetch all interface rows based on the fetchsize passedby the user
4680 -------------------------------------------------------------------------
4681
4682 l_context :='BULK FETCH VARIABLE INTERFACE ROW';
4683 OPEN l_var_interface_csr ( p_batch_number );
4684 LOOP
4685 BEGIN
4686 FETCH l_var_interface_csr BULK COLLECT INTO
4687 vinf_interface_id_tbl ,
4688 vinf_batch_number_tbl ,
4689 vinf_object_version_number_tbl ,
4690 vinf_variable_code_tbl ,
4691 vinf_variable_name_tbl ,
4692 vinf_process_status_tbl ,
4693 vinf_action_tbl ,
4694 vinf_language_tbl ,
4695 vinf_description_tbl ,
4696 vinf_variable_type_tbl ,
4697 vinf_variable_intent_tbl ,
4698 vinf_contract_expert_yn_tbl ,
4699 vinf_xprt_value_set_name_tbl ,
4700 vinf_disabled_yn_tbl ,
4701 vinf_external_yn_tbl ,
4702 vinf_variable_datatype_tbl ,
4703 vinf_application_id_tbl ,
4704 vinf_value_set_name_tbl ,
4705 vinf_var_default_value_tbl ,
4706 vinf_system_reference_code_tbl ,
4707 vinf_system_reference_id1_tbl ,
4708 vinf_system_reference_id2_tbl ,
4709 vinf_date_published_tbl ,
4710 vinf_attribute_category_tbl ,
4711 vinf_attribute1_tbl ,
4712 vinf_attribute2_tbl ,
4713 vinf_attribute3_tbl ,
4714 vinf_attribute4_tbl ,
4715 vinf_attribute5_tbl ,
4716 vinf_attribute6_tbl ,
4717 vinf_attribute7_tbl ,
4718 vinf_attribute8_tbl ,
4719 vinf_attribute9_tbl ,
4720 vinf_attribute10_tbl ,
4721 vinf_attribute11_tbl ,
4722 vinf_attribute12_tbl ,
4723 vinf_attribute13_tbl ,
4724 vinf_attribute14_tbl ,
4725 vinf_attribute15_tbl ,
4726 vinf_existing_code_tbl ,
4727 vinf_existing_dpublished_tbl ,
4728 vinf_existing_language_tbl LIMIT p_fetchsize;
4729 EXIT WHEN vinf_interface_id_tbl.COUNT = 0 ;
4730
4731 ------------------------------------------------------------------------
4732 -- Variable initialization
4733 -------------------------------------------------------------------------
4734 --For each fetch, variable variable table index should be initialized
4735 j := 1;
4736 --##count:initialization
4737 l_tot_rows_processed := l_tot_rows_processed+l_part_rows_processed;
4738 l_tot_rows_failed := l_tot_rows_failed+l_part_rows_failed;
4739 l_tot_rows_warned := l_tot_rows_warned+l_part_rows_warned;
4740 l_part_rows_processed := 0;
4741 l_part_rows_failed := 0;
4742 l_part_rows_warned := 0;
4743 l_bulk_failed := 'N';
4744 ---------------------------------------------------------------------------
4745 --------------------- Inner Loop thru fetched rows for---------------------
4746 -- validation, parse and validate article text, create a variable list
4747 -- prepare rows for DML if validate_only is 'N'
4748 /*** Processing Rule to set process_status
4749 Because we want to collect as much info as possible, we need to
4750 maintain process status while keeping the process moving.
4751 So, we'll set l_return_status as validation goes on and
4752 at the end we will set inf_process_status_tbl(i) with l_return_status
4753 for final result. However, we will get out of this process if there
4754 is a significant error such as 'U'.
4755 The return status examined
4756 -api_return_status : return status for api call
4757 -l_return_status : validation result of each row
4758 -x_return_status : final result status for concurrent program request
4759 Rule to set return status
4760 If api_return_status for api call is
4761 * 'S' then continue
4762 * 'W' and l_return_status not 'E' or 'U' then set l_return_status = 'W'
4763 and build_error_array then continue
4764 * 'E' and it is significant then set l_return_status = 'E' and raise
4765 Exception
4766 * 'E' and it is minor then set l_return_status = 'E' and continue. Raise
4767 'E' at the end of validation
4768 * 'U' then set l_return_status = 'U' and raise 'U' exception
4769 * At the end, if it goes thru with no Exception,
4770 Check if l_return_status is 'E' then raise Exception
4771 Otherwise (meaning l_return_status is 'S' or 'W'),
4772 vinf_process_status_tbl(i) = l_return_status
4773 * In the exception, we will set
4774 vinf_process_status_tbl(i) = l_return_status and build_error_array
4775 ***/
4776 -------------------------------------------------------------------------
4777
4778 FOR i in vinf_interface_id_tbl.FIRST ..vinf_interface_id_tbl.LAST LOOP
4779 BEGIN
4780 -- Increment total processed rows
4781 --##Count
4782 l_part_rows_processed := l_part_rows_processed+1;
4783 -- Initialization for each iteration
4784 l_row_notfound := FALSE;
4785 l_return_status := G_RET_STS_SUCCESS;
4786
4787 -- following variables are not fetched from interface table
4788 -- thus initialize it here
4789 vinf_value_set_id_tbl(i) := NULL;
4790 vinf_variable_datatype_tbl(i) := NULL;
4791
4792 l_context := 'VARIABLE VALIDATING';
4793
4794 -- To find duplicate variable code in the batch
4795 IF i>1 THEN
4796 x := i-1;
4797 IF ((RTRIM(vinf_variable_code_tbl(i)) = RTRIM(vinf_variable_code_tbl(x)))
4798 --THEN
4799 AND (vinf_language_tbl(i)) = (vinf_language_tbl(x))) THEN
4800 Okc_Api.Set_Message(G_APP_NAME,
4801 'OKC_VAR_DUP_TITLE_ORG',
4802 'VAR_CODE',
4803 vinf_variable_code_tbl(i),
4804 'LANG',
4805 vinf_language_tbl(i));
4806 l_return_status := G_RET_STS_ERROR;
4807 RAISE FND_API.G_EXC_ERROR;
4808 END IF;
4809 END IF;
4810 -- Logic to decide what to do in case of Action='S'
4811 -- If there is no existing variable in system then it is 'N' otherwise 'U'
4812
4813 IF vinf_action_tbl(i) = 'S' THEN
4814 IF vinf_existing_code_tbl(i) IS NULL THEN
4815 vinf_action_tbl(i) := 'N';
4816 ELSE
4817 vinf_action_tbl(i) := 'U';
4818 END IF;
4819 END IF;
4820
4821
4822 IF vinf_action_tbl(i) = 'N' THEN
4823
4824 --TRIM trailing space because
4825 vinf_variable_code_tbl(i) := RTRIM(vinf_variable_code_tbl(i));
4826
4827 ELSIF vinf_action_tbl(i) in ('U','D') THEN
4828
4829 IF vinf_existing_code_tbl(i) is NULL THEN
4830 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4831 p_msg_name => 'OKC_VAR_CODE_NOT_FOUND',
4832 p_token1 => 'VARIABLE_CODE',
4833 p_token1_value => vinf_variable_code_tbl(i));
4834 l_return_status := G_RET_STS_ERROR;
4835 RAISE FND_API.G_EXC_ERROR ;
4836 END IF;
4837
4838 ELSE
4839
4840 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4841 p_msg_name => 'OKC_VAR_INV_IMP_ACTION');
4842 l_return_status := G_RET_STS_ERROR;
4843 RAISE FND_API.G_EXC_ERROR ;
4844 END IF;
4845
4846 -----------------------------------------------------------
4847 -- Common validation or attribute settting
4848 -- regardless of status and import action
4849 -- this validation is not included in validate api
4850 -----------------------------------------------------------
4851 -- Get Value set id and Datatype from Value set name provided by the user
4852 OPEN get_valset_id_csr(vinf_value_set_name_tbl(i));
4853 FETCH get_valset_id_csr into l_value_set_id,l_variable_datatype;
4854 CLOSE get_valset_id_csr;
4855 IF l_value_set_id is null THEN
4856 IF p_validate_only = 'Y' THEN
4857 OPEN valset_exists_csr (vinf_value_set_name_tbl(i),
4858 vinf_batch_number_tbl(i));
4859 FETCH valset_exists_csr into l_vs_id;
4860 CLOSE valset_exists_csr;
4861 IF l_vs_id is null THEN
4862 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4863 p_msg_name => 'OKC_ART_VAL_SET_NOT_FOUND');
4864 l_return_status := G_RET_STS_ERROR;
4865 ELSE
4866 -- Reset Local Variables
4867 l_vs_id := NULL;
4868
4869 END IF;
4870 ELSE
4871 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4872 p_msg_name => 'OKC_ART_VAL_SET_NOT_FOUND');
4873 l_return_status := G_RET_STS_ERROR;
4874 END IF;
4875
4876 ELSE
4877 vinf_value_set_id_tbl(i) := l_value_set_id;
4878 vinf_variable_datatype_tbl(i) := l_variable_datatype;
4879 -- Reset Local Variables
4880 l_value_set_id := NULL;
4881 l_variable_datatype := NULL;
4882 END IF;
4883
4884
4885 -- Checking Date Published Validation
4886 IF vinf_existing_dpublished_tbl(i) >= vinf_date_published_tbl(i) THEN
4887 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4888 p_msg_name => 'OKC_INVALID_DATE_PUBLISHED');
4889 l_return_status := G_RET_STS_ERROR;
4890 END IF;
4891
4892 -- Checking Variable Flags
4893 IF nvl(vinf_disabled_yn_tbl(i), '*') not in ('Y','N') THEN
4894 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4895 p_msg_name => 'OKC_INVALID_DISABLED_FLAG');
4896 l_return_status := G_RET_STS_ERROR;
4897 END IF;
4898
4899 IF nvl(vinf_external_yn_tbl(i), '*') not in ('Y','N') THEN
4900 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4901 p_msg_name => 'OKC_INVALID_EXTERNAL_FLAG');
4902 l_return_status := G_RET_STS_ERROR;
4903 END IF;
4904
4905 IF nvl(vinf_contract_expert_yn_tbl(i), '*') not in ('Y','N') THEN
4906 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4907 p_msg_name => 'OKC_INVALID_CONTRACT_EXPERT_FLAG');
4908 l_return_status := G_RET_STS_ERROR;
4909 END IF;
4910
4911 IF nvl(vinf_variable_intent_tbl(i), '*') not in ('B','S') THEN
4912 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4913 p_msg_name => 'OKC_INVALID_INTENT_FLAG');
4914 l_return_status := G_RET_STS_ERROR;
4915 END IF;
4916
4917 IF nvl(vinf_variable_type_tbl(i), '*') <> 'U' THEN
4918 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4919 p_msg_name => 'OKC_INVALID_VARIABLE_TYPE');
4920 l_return_status := G_RET_STS_ERROR;
4921 END IF;
4922
4923 -- Checking Variable Type and Value set id
4924 IF nvl(vinf_variable_type_tbl(i), '*') = 'U' THEN
4925 IF vinf_value_set_name_tbl(i) is null THEN
4926 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4927 p_msg_name => 'OKC_VS_NOT_DEFINED');
4928 l_return_status := G_RET_STS_ERROR;
4929 END IF;
4930 END IF;
4931
4932
4933 IF nvl(vinf_contract_expert_yn_tbl(i), '*') not in ('Y','N') THEN
4934 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4935 p_msg_name => 'OKC_INVALID_CONTRACT_EXPERT_FLAG');
4936 l_return_status := G_RET_STS_ERROR;
4937 END IF;
4938
4939 -- Validate Contract Expert related data
4940
4941 IF ((vinf_xprt_value_set_name_tbl(i) is not null OR
4942 vinf_contract_expert_yn_tbl(i) = 'Y' ) AND
4943 vinf_variable_type_tbl(i) <> 'S')
4944 THEN
4945 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4946 p_msg_name => 'OKC_ART_VAR_INV_XPRT_DATA');
4947 l_return_status := G_RET_STS_ERROR;
4948 END IF;
4949
4950 IF ((vinf_xprt_value_set_name_tbl(i) is not null OR
4951 vinf_contract_expert_yn_tbl(i) = 'Y' ) AND
4952 vinf_variable_type_tbl(i) <> 'S')
4953 THEN
4954 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4955 p_msg_name => 'OKC_ART_VAR_INV_XPRT_DATA');
4956 l_return_status := G_RET_STS_ERROR;
4957 END IF;
4958
4959 IF ((vinf_variable_datatype_tbl(i) = 'D') AND
4960 ((vinf_contract_expert_yn_tbl(i) = 'Y' ) OR
4961 (vinf_xprt_value_set_name_tbl(i) <> 'S')))
4962 THEN
4963 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4964 p_msg_name => 'OKC_ART_VAR_INV_XPRT_DATA');
4965 l_return_status := G_RET_STS_ERROR;
4966 END IF;
4967
4968 IF ((vinf_variable_datatype_tbl(i) = 'V') AND
4969 (vinf_contract_expert_yn_tbl(i) = 'Y' ) AND
4970 (vinf_xprt_value_set_name_tbl(i) is null) )
4971 THEN
4972 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4973 p_msg_name => 'OKC_ART_VAR_INV_XPRT_DATA');
4974 l_return_status := G_RET_STS_ERROR;
4975 END IF;
4976
4977 IF ((vinf_contract_expert_yn_tbl(i) = 'N') AND
4978 (vinf_xprt_value_set_name_tbl(i) is not null) )
4979 THEN
4980 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4981 p_msg_name => 'OKC_ART_VAR_INV_XPRT_DATA');
4982 l_return_status := G_RET_STS_ERROR;
4983 END IF;
4984 -- Check for Valid External Flag
4985 IF ((vinf_variable_intent_tbl(i) = 'S') AND
4986 (vinf_external_yn_tbl(i) = 'Y') )
4987 THEN
4988 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
4989 p_msg_name => 'OKC_ART_VAR_INVALID_EXTERNALYN',
4990 p_token1 => 'VAR_NAME',
4991 p_token1_value => vinf_variable_name_tbl(i));
4992 l_return_status := G_RET_STS_ERROR;
4993 END IF;
4994
4995 -- Validate "Language" is installed or not
4996 OPEN check_lang_csr(vinf_language_tbl(i));
4997 FETCH check_lang_csr into l_language;
4998 CLOSE check_lang_csr;
4999 --IF check_lang_csr%NOTFOUND THEN
5000 IF l_language <> '1' THEN
5001 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
5002 p_msg_name => 'OKC_LANG_NOT_INSTALLED',
5003 p_token1 => 'LANGUAGE',
5004 p_token1_value => vinf_language_tbl(i));
5005 l_return_status := G_RET_STS_ERROR;
5006 ELSE
5007 l_language := '?';
5008 END IF;
5009
5010
5011 -- Validate attrs of the interface row
5012 IF vinf_action_tbl(i) = 'N' THEN
5013 -- Checking uniqueness of variable name and intent
5014 OPEN get_var_unq_csr(vinf_variable_name_tbl(i),
5015 vinf_variable_intent_tbl(i));
5016 FETCH get_var_unq_csr into l_dummy_unq;
5017 CLOSE get_var_unq_csr;
5018 IF l_dummy_unq = '1' THEN
5019 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
5020 p_msg_name => 'OKC_ART_VAR_NAME_NOT_UNIQUE');
5021 l_return_status := G_RET_STS_ERROR;
5022 END IF;
5023
5024 -- Checking variable code is unique in the system
5025 OPEN get_var_info_csr(vinf_variable_code_tbl(i));
5026 FETCH get_var_info_csr into l_dummy;
5027 CLOSE get_var_info_csr;
5028 IF l_dummy = '1' THEN
5029 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
5030 p_msg_name => 'OKC_ART_VAR_CODE_NOT_UNIQUE');
5031 l_return_status := G_RET_STS_ERROR;
5032 END IF;
5033
5034 ELSIF vinf_action_tbl(i) = 'U' THEN
5035 NULL;
5036 END IF;
5037
5038 ------------------------------------------------------------------------
5039 -- Now that we have validated and data is clean we can fetch sequences and ids
5040 -- for new variables for DML and also set the process status to Success
5041 -------------------------------------------------------------------------
5042
5043 -- Summarize report for this row
5044 -- Status 'F' is for internal use meaning parsing failure marked in
5045 -- java concurrent program
5046 IF (l_return_status = G_RET_STS_SUCCESS) THEN
5047 IF (nvl(vinf_process_status_tbl(i), 'E') = 'E') THEN
5048 vinf_process_status_tbl(i) := G_RET_STS_SUCCESS;
5049 ELSIF ( vinf_process_status_tbl(i) = 'F') THEN
5050 -- ##count parser failure as error
5051 --l_tot_rows_failed := l_tot_rows_failed+1;
5052 l_part_rows_failed := l_part_rows_failed+1;
5053 vinf_process_status_tbl(i) := G_RET_STS_ERROR;
5054 END IF;
5055 ELSIF (l_return_status = l_sts_warning) THEN
5056 IF (nvl(vinf_process_status_tbl(i),'E') = 'E') THEN
5057 vinf_process_status_tbl(i) := l_sts_warning;
5058 --##count
5059 --l_tot_rows_warned := l_tot_rows_warned+1;
5060 l_part_rows_warned := l_part_rows_warned+1;
5061 ELSIF (vinf_process_status_tbl(i) = 'F') THEN
5062 -- ##count parser failure as error
5063 --l_tot_rows_failed := l_tot_rows_failed+1;
5064 l_part_rows_failed := l_part_rows_failed+1;
5065 vinf_process_status_tbl(i) := G_RET_STS_ERROR;
5066 END IF;
5067 ELSIF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
5068 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5069 ELSIF (l_return_status = G_RET_STS_ERROR) THEN
5070 RAISE FND_API.G_EXC_ERROR;
5071 END IF;
5072
5073 -------------------------
5074 -------------------------
5075 -- Exception Block for each iteration in Loop
5076 -- validation and unexpected errors
5077 -- In case of unexpected error, escape the loop
5078 -------------------------
5079 -------------------------
5080
5081
5082 EXCEPTION
5083 WHEN FND_API.G_EXC_ERROR THEN
5084 IF (l_debug = 'Y') THEN
5085 okc_debug.log('300: In Variables_Import: OKC_API.G_EXCEPTION_ERROR Exception', 2);
5086 END IF;
5087 --l_return_status := G_RET_STS_ERROR ;
5088 build_error_array(
5089 p_msg_data => x_msg_data,
5090 p_context => l_context,
5091 p_batch_process_id => l_batch_process_id,
5092 p_interface_id => vinf_interface_id_tbl(i),
5093 p_article_title => vinf_variable_code_tbl(i),
5094 p_error_type => G_RET_STS_ERROR,
5095 p_entity => 'VARIABLE'
5096 );
5097 vinf_process_status_tbl(i) := G_RET_STS_ERROR;
5098 --##count
5099 --l_tot_rows_failed := l_tot_rows_failed+1;
5100 l_part_rows_failed := l_part_rows_failed+1;
5101 -- Continue to next row
5102
5103 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5104 IF (l_debug = 'Y') THEN
5105 okc_debug.log('400: Leaving Variables_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
5106 END IF;
5107
5108 IF l_var_interface_csr%ISOPEN THEN
5109 CLOSE l_var_interface_csr;
5110 END IF;
5111
5112 --Set_Message
5113 l_return_status := G_RET_STS_UNEXP_ERROR ;
5114 x_return_status := G_RET_STS_UNEXP_ERROR ;
5115
5116 build_error_array(
5117 p_msg_data => x_msg_data,
5118 p_context => l_context,
5119 p_batch_process_id => l_batch_process_id,
5120 p_interface_id => vinf_interface_id_tbl(i),
5121 p_article_title => vinf_variable_code_tbl(i),
5122 p_error_type => G_RET_STS_UNEXP_ERROR,
5123 p_entity => 'VARIABLE'
5124 );
5125 vinf_process_status_tbl(i) := G_RET_STS_ERROR;
5126 --##count
5127 --l_tot_rows_failed := l_tot_rows_failed+1;
5128 l_part_rows_failed := l_part_rows_failed+1;
5129 exit; -- exit the current fetch
5130
5131 WHEN OTHERS THEN
5132 IF (l_debug = 'Y') THEN
5133 okc_debug.log('500: Leaving Variables_Import because of EXCEPTION: '||sqlerrm, 2);
5134 END IF;
5135
5136 IF l_var_interface_csr%ISOPEN THEN
5137 CLOSE l_var_interface_csr;
5138 END IF;
5139
5140 l_return_status := G_RET_STS_UNEXP_ERROR ;
5141 x_return_status := G_RET_STS_UNEXP_ERROR ;
5142
5143 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
5144 p_msg_name => G_UNEXPECTED_ERROR,
5145 p_token1 => G_SQLCODE_TOKEN,
5146 p_token1_value => sqlcode,
5147 p_token2 => G_SQLERRM_TOKEN,
5148 p_token2_value => sqlerrm);
5149
5150 build_error_array(
5151 p_msg_data => G_UNEXPECTED_ERROR,
5152 p_context => l_context,
5153 p_batch_process_id => l_batch_process_id,
5154 p_interface_id => vinf_interface_id_tbl(i),
5155 p_article_title => vinf_variable_code_tbl(i),
5156 p_error_type => G_RET_STS_ERROR,
5157 p_entity => 'VARIABLE'
5158 );
5159 vinf_process_status_tbl(i) := G_RET_STS_ERROR;
5160 --##count
5161 --l_tot_rows_failed := l_tot_rows_failed+1;
5162 l_part_rows_failed := l_part_rows_failed+1;
5163 exit; -- exit the current fetch
5164 END;
5165 -------------------------
5166 -------------------------
5167 -- Exception Block for each iteration in Loop ends
5168 -------------------------
5169 -------------------------
5170
5171
5172 END LOOP; -- end of FOR i in inf_interface_id_tbl.FIRST ..
5173 ------------------------------------------------------------------------
5174 -------------- End of Inner Loop thru fetched row for---------------------
5175 -- validation,
5176 -------------------------------------------------------------------------
5177 -- In order to propagate Unexpected error raise it if it is 'U'
5178 IF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
5179 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
5180 END IF;
5181
5182 -------------------------
5183 -------------------------
5184 -- Exception Block for Inner Loop starts
5185 -- Handles unexpected errors as last step
5186 -------------------------
5187 -------------------------
5188 EXCEPTION
5189 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5190 IF (l_debug = 'Y') THEN
5191 okc_debug.log('400: Leaving Variables_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
5192 END IF;
5193
5194 IF l_var_interface_csr%ISOPEN THEN
5195 CLOSE l_var_interface_csr;
5196 END IF;
5197 l_return_status := G_RET_STS_UNEXP_ERROR ;
5198 x_return_status := G_RET_STS_UNEXP_ERROR ;
5199 exit; -- exit outermost loop
5200
5201 WHEN OTHERS THEN
5202 IF (l_debug = 'Y') THEN
5203 okc_debug.log('500: Leaving Variables_Import because of EXCEPTION: '||sqlerrm, 2);
5204 END IF;
5205
5206 IF l_var_interface_csr%ISOPEN THEN
5207 CLOSE l_var_interface_csr;
5208 END IF;
5209 l_return_status := G_RET_STS_UNEXP_ERROR ;
5210 x_return_status := G_RET_STS_UNEXP_ERROR ;
5211 exit; -- exit outermost loop
5212 END;
5213
5214 -------------------------
5215 -------------------------
5216 -- Exception Block for Each Iteration of outermost Loop ends
5217 -------------------------
5218 -------------------------
5219
5220 ------------------------------------------------------------------------
5221 --------------------- Start Do_DML for Variables ---------------
5222 -- Insert or Update Variable
5223 -------------------------------------------------------------------------
5224 -- initialize l_return_status to track status of DML execution
5225 l_return_status := G_RET_STS_SUCCESS;
5226
5227
5228 IF p_validate_only = 'N' THEN
5229 BEGIN
5230 SAVEPOINT bulkdml;
5231
5232 i := 0;
5233 -- Bulk insert New Valid Records
5234 BEGIN
5235 l_context := 'INSERTING NEW VARIABLE INTO B TABLE';
5236
5237 FORALL i in vinf_interface_id_tbl.FIRST ..vinf_interface_id_tbl.LAST
5238 INSERT INTO OKC_BUS_VARIABLES_B(
5239 VARIABLE_CODE,
5240 OBJECT_VERSION_NUMBER,
5241 VARIABLE_TYPE,
5242 EXTERNAL_YN,
5243 VARIABLE_INTENT,
5244 CONTRACT_EXPERT_YN,
5245 DISABLED_YN,
5246 VARIABLE_DATATYPE,
5247 APPLICATION_ID,
5248 VALUE_SET_ID,
5249 VARIABLE_DEFAULT_VALUE,
5250 XPRT_VALUE_SET_NAME,
5251 DATE_PUBLISHED,
5252 ORIG_SYSTEM_REFERENCE_CODE,
5253 ORIG_SYSTEM_REFERENCE_ID1,
5254 ORIG_SYSTEM_REFERENCE_ID2,
5255 -- PROGRAM_ID,
5256 -- PROGRAM_LOGIN_ID,
5257 -- PROGRAM_APPLICATION_ID,
5258 -- REQUEST_ID,
5259 ATTRIBUTE_CATEGORY,
5260 ATTRIBUTE1,
5261 ATTRIBUTE2,
5262 ATTRIBUTE3,
5263 ATTRIBUTE4,
5264 ATTRIBUTE5,
5265 ATTRIBUTE6,
5266 ATTRIBUTE7,
5267 ATTRIBUTE8,
5268 ATTRIBUTE9,
5269 ATTRIBUTE10,
5270 ATTRIBUTE11,
5271 ATTRIBUTE12,
5272 ATTRIBUTE13,
5273 ATTRIBUTE14,
5274 ATTRIBUTE15,
5275 CREATED_BY,
5276 CREATION_DATE,
5277 LAST_UPDATED_BY,
5278 LAST_UPDATE_LOGIN,
5279 LAST_UPDATE_DATE,
5280 VARIABLE_SOURCE) --Added for Bug 10227193
5281 SELECT
5282 vinf_variable_code_tbl(i),
5283 1.0,
5284 vinf_variable_type_tbl(i),
5285 vinf_external_yn_tbl(i),
5286 vinf_variable_intent_tbl(i),
5287 vinf_contract_expert_yn_tbl(i),
5288 vinf_disabled_yn_tbl(i),
5289 vinf_variable_datatype_tbl(i),
5290 vinf_application_id_tbl(i),
5291 vinf_value_set_id_tbl(i),
5292 vinf_var_default_value_tbl(i),
5293 vinf_xprt_value_set_name_tbl(i),
5294 vinf_date_published_tbl(i),
5295 vinf_system_reference_code_tbl(i),
5296 vinf_system_reference_id1_tbl(i),
5297 vinf_system_reference_id2_tbl(i),
5298 -- l_program_id,
5299 -- l_program_login_id,
5300 -- l_program_appl_id,
5301 -- l_request_id,
5302 vinf_attribute_category_tbl(i),
5303 vinf_attribute1_tbl(i),
5304 vinf_attribute2_tbl(i),
5305 vinf_attribute3_tbl(i),
5306 vinf_attribute4_tbl(i),
5307 vinf_attribute5_tbl(i),
5308 vinf_attribute6_tbl(i),
5309 vinf_attribute7_tbl(i),
5310 vinf_attribute8_tbl(i),
5311 vinf_attribute9_tbl(i),
5312 vinf_attribute10_tbl(i),
5313 vinf_attribute11_tbl(i),
5314 vinf_attribute12_tbl(i),
5315 vinf_attribute13_tbl(i),
5316 vinf_attribute14_tbl(i),
5317 vinf_attribute15_tbl(i),
5318 l_user_id,
5319 sysdate,
5320 l_user_id,
5321 l_login_id,
5322 sysdate,
5323 'M' --Added for Bug 10227193
5324 FROM DUAL
5325 WHERE vinf_action_tbl(i) = 'N' and
5326 vinf_process_status_tbl(i) in ('S', 'W') and
5327 vinf_language_tbl(i) = USERENV('LANG');
5328
5329 -- Using a " select from dual" aproach as above prevents creation of
5330 -- additional PL/SQL tables for bulk insert of
5331 -- variables if we were to use a FORALL INSERT INTO .... VALUES .... approach.
5332 -- We cannot use FORALL INSERT INTO .... VALUES ....using
5333 -- the existing inf*tbl since the error rows need to be
5334 -- filtered out.
5335
5336 EXCEPTION
5337 WHEN OTHERS THEN
5338 IF (l_debug = 'Y') THEN
5339 okc_debug.log('500: Leaving Variables_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
5340 END IF;
5341 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
5342 END;
5343
5344 --
5345 -- End of Insert into OKC_BUS_VARIABLES_B
5346 --
5347 --
5348
5349 i := 0;
5350 BEGIN
5351 l_context := 'INSERTING VARIABLE INTO TL TABLE';
5352
5353 FORALL i in vinf_interface_id_tbl.FIRST ..vinf_interface_id_tbl.LAST
5354 INSERT INTO OKC_BUS_VARIABLES_TL(
5355 VARIABLE_CODE,
5356 VARIABLE_NAME,
5357 LANGUAGE,
5358 SOURCE_LANG,
5359 DESCRIPTION,
5360 CREATED_BY,
5361 CREATION_DATE,
5362 LAST_UPDATED_BY,
5363 LAST_UPDATE_LOGIN,
5364 LAST_UPDATE_DATE)
5365 SELECT
5366 vinf_variable_code_tbl(i),
5367 vinf_variable_name_tbl(i),
5368 vinf_language_tbl(i),
5369 userenv('LANG'),
5370 vinf_description_tbl(i),
5371 l_user_id,
5372 sysdate,
5373 l_user_id,
5374 l_login_id,
5375 sysdate
5376 FROM OKC_BUS_VARIABLES_B
5377 WHERE vinf_action_tbl(i) IN ('N')
5378 AND vinf_process_status_tbl(i) in ('S', 'W')
5379 AND variable_code = vinf_variable_code_tbl(i);
5380
5381 EXCEPTION
5382 WHEN OTHERS THEN
5383 IF (l_debug = 'Y') THEN
5384 okc_debug.log('500: Leaving Variables_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
5385 END IF;
5386 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
5387 END;
5388
5389 --
5390 -- End of Insert into OKC_BUS_VARIABLES_TL
5391 --
5392 --
5393
5394 i := 0;
5395 BEGIN
5396 l_context := 'UPDATING DATE_PUBLISHED FOR ACTION U';
5397
5398 FORALL i in vinf_interface_id_tbl.FIRST ..vinf_interface_id_tbl.LAST
5399 UPDATE OKC_BUS_VARIABLES_B
5400 SET DATE_PUBLISHED = vinf_date_published_tbl(i),
5401 LAST_UPDATED_BY = l_user_id,
5402 LAST_UPDATE_LOGIN = l_login_id,
5403 LAST_UPDATE_DATE = SYSDATE
5404 WHERE vinf_action_tbl(i) = ('U')
5405 AND vinf_process_status_tbl(i) in ('S','W')
5406 AND variable_code = vinf_variable_code_tbl(i)
5407 AND vinf_existing_language_tbl(i) IS NOT NULL;
5408 EXCEPTION
5409 WHEN OTHERS THEN
5410 IF (l_debug = 'Y') THEN
5411 okc_debug.log('500: Leaving Variables_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
5412 END IF;
5413 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
5414 END;
5415
5416 --
5417 -- End of Update OKC_BUS_VARIABLES_B
5418 --
5419 --
5420 i := 0;
5421 BEGIN
5422 l_context := 'UPDATING DESCRIPTION FOR ACTION U';
5423
5424 FORALL i in vinf_interface_id_tbl.FIRST ..vinf_interface_id_tbl.LAST
5425 UPDATE OKC_BUS_VARIABLES_TL
5426 SET DESCRIPTION = vinf_description_tbl(i),
5427 --PROGRAM_ID = l_program_id,
5428 --REQUEST_ID = l_request_id,
5429 --PROGRAM_LOGIN_ID = l_program_login_id,
5430 --PROGRAM_APPLICATION_ID = l_program_appl_id,
5431 LAST_UPDATED_BY = l_user_id,
5432 LAST_UPDATE_LOGIN = l_login_id,
5433 LAST_UPDATE_DATE = SYSDATE
5434 WHERE vinf_action_tbl(i) = ('U')
5435 AND vinf_process_status_tbl(i) in ('S','W')
5436 AND variable_code = vinf_variable_code_tbl(i)
5437 AND vinf_existing_language_tbl(i) IS NOT NULL;
5438 EXCEPTION
5439 WHEN OTHERS THEN
5440 IF (l_debug = 'Y') THEN
5441 okc_debug.log('500: Leaving Variables_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
5442 END IF;
5443 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
5444 END;
5445
5446 --
5447 -- End of Update OKC_BUS_VARIABLES_TL
5448 --
5449 --
5450
5451 i := 0;
5452 BEGIN
5453 l_context := 'INSERTING VARIABLE INTO TL TABLE FOR ACTION U';
5454
5455 FORALL i in vinf_interface_id_tbl.FIRST ..vinf_interface_id_tbl.LAST
5456 INSERT INTO OKC_BUS_VARIABLES_TL(
5457 VARIABLE_CODE,
5458 VARIABLE_NAME,
5459 LANGUAGE,
5460 SOURCE_LANG,
5461 DESCRIPTION,
5462 CREATED_BY,
5463 CREATION_DATE,
5464 LAST_UPDATED_BY,
5465 LAST_UPDATE_LOGIN,
5466 LAST_UPDATE_DATE)
5467 SELECT
5468 vinf_variable_code_tbl(i),
5469 vinf_variable_name_tbl(i),
5470 vinf_language_tbl(i),
5471 userenv('LANG'),
5472 vinf_description_tbl(i),
5473 l_user_id,
5474 sysdate,
5475 l_user_id,
5476 l_login_id,
5477 sysdate
5478 FROM OKC_BUS_VARIABLES_B
5479 WHERE vinf_action_tbl(i) = ('U')
5480 AND vinf_process_status_tbl(i) in ('S', 'W')
5481 AND variable_code = vinf_variable_code_tbl(i)
5482 AND vinf_existing_language_tbl(i) IS NULL;
5483
5484 EXCEPTION
5485 WHEN OTHERS THEN
5486 IF (l_debug = 'Y') THEN
5487 okc_debug.log('500: Leaving Variables_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
5488 END IF;
5489 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
5490 END;
5491
5492 --
5493 -- End of Insert into OKC_BUS_VARIABLES_TL for Action U
5494 --
5495 --
5496
5497 i := 0;
5498 BEGIN
5499 l_context := 'DISABLING VARIABLE FOR ACTION D';
5500
5501 FORALL i in vinf_interface_id_tbl.FIRST ..vinf_interface_id_tbl.LAST
5502 UPDATE OKC_BUS_VARIABLES_B
5503 SET DISABLED_YN = vinf_disabled_yn_tbl(i),
5504 --PROGRAM_ID = l_program_id,
5505 --REQUEST_ID = l_request_id,
5506 --PROGRAM_LOGIN_ID = l_program_login_id,
5507 --PROGRAM_APPLICATION_ID = l_program_appl_id,
5508 LAST_UPDATED_BY = l_user_id,
5509 LAST_UPDATE_LOGIN = l_login_id,
5510 LAST_UPDATE_DATE = SYSDATE
5511 WHERE vinf_action_tbl(i) = ('D')
5512 AND vinf_process_status_tbl(i) in ('S','W')
5513 AND variable_code = vinf_variable_code_tbl(i);
5514 EXCEPTION
5515 WHEN OTHERS THEN
5516 IF (l_debug = 'Y') THEN
5517 okc_debug.log('500: Leaving Variables_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
5518 END IF;
5519 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
5520 END;
5521
5522 --
5523 -- End of Update OKC_BUS_VARIABLES_TL for Disable
5524 --
5525 --
5526
5527
5528 -- Exception for bulk DML block
5529 EXCEPTION
5530 WHEN OTHERS THEN
5531 l_bulk_failed := 'Y'; -- indicating that bulk operation has failed
5532 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
5533 p_msg_name => G_UNEXPECTED_ERROR,
5534 p_token1 => G_SQLCODE_TOKEN,
5535 p_token1_value => sqlcode,
5536 p_token2 => G_SQLERRM_TOKEN,
5537 p_token2_value => sqlerrm);
5538 Okc_API.Set_Message(p_app_name => G_APP_NAME,
5539 p_msg_name => 'OKC_ART_FETCH_FAILED',
5540 p_token1 => 'CONTEXT',
5541 p_token1_value => l_context);
5542
5543 build_error_array(
5544 p_msg_data => null,
5545 p_context => l_context,
5546 p_batch_process_id => l_batch_process_id,
5547 p_interface_id => -99,
5548 p_article_title => NULL,
5549 p_error_type => G_RET_STS_ERROR,
5550 p_entity => 'VARIABLE'
5551 );
5552 l_return_status := G_RET_STS_UNEXP_ERROR;
5553 x_return_status := G_RET_STS_UNEXP_ERROR;
5554
5555 --##count:rollback the count
5556 l_part_rows_failed := l_part_rows_processed;
5557 l_part_rows_warned := 0;
5558
5559 ROLLBACK TO SAVEPOINT bulkdml;
5560 exit; -- exit outermost loop
5561 END;
5562
5563 END IF; --- validate_only = 'N'
5564
5565 ------------------------------------------------------------------------
5566 --------------------- End of Do_DML for Variables ---------------
5567 -------------------------------------------------------------------------
5568
5569 ------------------------------------------------------------------------
5570 --------------- Start of Do_DML for import related tables ------------
5571 -- Update interface table
5572 -- Insert Errors into Error table
5573 -------------------------------------------------------------------------
5574 -- Update Interface Table
5575 i:=0;
5576 BEGIN
5577 l_context := 'UPDATING VARIABLES INTERFACE TABLE';
5578 FORALL i in vinf_interface_id_tbl.FIRST..vinf_interface_id_tbl.LAST
5579 UPDATE OKC_VARIABLES_INTERFACE
5580 SET
5581 -- We don't want to update process_status to 'S' or 'W' in validation_mode
5582 -- because it is not going to be picked up in next run if we do so
5583 PROCESS_STATUS = decode(p_validate_only||vinf_process_status_tbl(i)||l_bulk_failed,
5584 'NEN','E',
5585 'NSN','S',
5586 'NWN','W',
5587 'NEY','E',
5588 'NSY',NULL,
5589 'NWY',NULL,
5590 'YEY','E',
5591 'YEN','E',
5592 'NFY','E',
5593 'YFY','E',
5594 'NFN','E',
5595 'YFN','E',NULL),
5596 PROGRAM_ID = l_program_id,
5597 REQUEST_ID = l_request_id,
5598 PROGRAM_LOGIN_ID = l_program_login_id,
5599 PROGRAM_APPLICATION_ID = l_program_appl_id,
5600 OBJECT_VERSION_NUMBER = vinf_object_version_number_tbl(i) + 1,
5601 LAST_UPDATED_BY = l_user_id,
5602 LAST_UPDATE_LOGIN = l_login_id,
5603 LAST_UPDATE_DATE = SYSDATE
5604 WHERE
5605 interface_id = vinf_interface_id_tbl(i);
5606 EXCEPTION
5607 WHEN OTHERS THEN
5608 IF (l_debug = 'Y') THEN
5609 okc_debug.log('500: Leaving Variables_Import because of EXCEPTION: '||sqlerrm, 2);
5610 END IF;
5611 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
5612 p_msg_name => G_UNEXPECTED_ERROR,
5613 p_token1 => G_SQLCODE_TOKEN,
5614 p_token1_value => sqlcode,
5615 p_token2 => G_SQLERRM_TOKEN,
5616 p_token2_value => sqlerrm);
5617 Okc_API.Set_Message(p_app_name => G_APP_NAME,
5618 p_msg_name => 'OKC_VAR_INT_UPDATE_FAILED');
5619 build_error_array(
5620 p_msg_data => null,
5621 p_context => l_context,
5622 p_batch_process_id => l_batch_process_id,
5623 p_interface_id => -99,
5624 p_article_title => NULL,
5625 p_error_type => G_RET_STS_ERROR,
5626 p_entity => 'VARIABLE'
5627 );
5628
5629 l_return_status := G_RET_STS_UNEXP_ERROR ;
5630 x_return_status := G_RET_STS_UNEXP_ERROR ;
5631 --##count:rollback the count
5632 l_part_rows_failed := l_part_rows_processed;
5633 l_part_rows_warned := 0;
5634
5635 --RAISE FND_API.G_EXC_ERROR ;
5636 END;
5637 --
5638 -- End of Update OKC_VARIABLES_INTERFACE
5639 --
5640 --
5641
5642 --
5643 --Insert Errors into Error table for this fetch
5644 --
5645
5646 insert_error_array(
5647 x_return_status => x_return_status,
5648 x_msg_count => x_msg_count,
5649 x_msg_data => x_msg_data
5650 );
5651
5652
5653 IF (x_return_status = l_insert_errors_error) THEN
5654 NULL;
5655 -- Ignore
5656 -- RAISE l_insert_errors_exception;
5657 END IF;
5658
5659 ------------------------------------------------------------------------
5660 --------------- End of Do_DML for import related tables ------------
5661 -------------------------------------------------------------------------
5662 commit;
5663
5664 -- Now delete cache for next bulk fetch
5665
5666 vinf_interface_id_tbl.DELETE;
5667 vinf_batch_number_tbl.DELETE;
5668 vinf_object_version_number_tbl.DELETE;
5669 vinf_variable_code_tbl.DELETE;
5670 vinf_variable_name_tbl.DELETE;
5671 vinf_process_status_tbl.DELETE;
5672 vinf_action_tbl.DELETE;
5673 vinf_language_tbl.DELETE;
5674 vinf_description_tbl.DELETE;
5675 vinf_variable_type_tbl.DELETE;
5676 vinf_variable_intent_tbl.DELETE;
5677 vinf_contract_expert_yn_tbl.DELETE;
5678 vinf_xprt_value_set_name_tbl.DELETE;
5679 vinf_disabled_yn_tbl.DELETE;
5680 vinf_external_yn_tbl.DELETE;
5681 vinf_variable_datatype_tbl.DELETE;
5682 vinf_application_id_tbl.DELETE;
5683 vinf_value_set_name_tbl.DELETE;
5684 vinf_var_default_value_tbl.DELETE;
5685 vinf_system_reference_code_tbl.DELETE;
5686 vinf_system_reference_id1_tbl.DELETE;
5687 vinf_system_reference_id2_tbl.DELETE;
5688 vinf_date_published_tbl.DELETE;
5689 vinf_attribute_category_tbl.DELETE;
5690 vinf_attribute1_tbl.DELETE;
5691 vinf_attribute2_tbl.DELETE;
5692 vinf_attribute3_tbl.DELETE;
5693 vinf_attribute4_tbl.DELETE;
5694 vinf_attribute5_tbl.DELETE;
5695 vinf_attribute6_tbl.DELETE;
5696 vinf_attribute7_tbl.DELETE;
5697 vinf_attribute8_tbl.DELETE;
5698 vinf_attribute9_tbl.DELETE;
5699 vinf_attribute10_tbl.DELETE;
5700 vinf_attribute11_tbl.DELETE;
5701 vinf_attribute12_tbl.DELETE;
5702 vinf_attribute13_tbl.DELETE;
5703 vinf_attribute14_tbl.DELETE;
5704 vinf_attribute15_tbl.DELETE;
5705
5706 vinf_value_set_id_tbl.DELETE;
5707 vinf_existing_code_tbl.DELETE;
5708 vinf_existing_dpublished_tbl.DELETE;
5709 vinf_existing_language_tbl.DELETE;
5710
5711 err_batch_process_id_tbl.DELETE;
5712 err_article_title_tbl.DELETE;
5713 err_interface_id_tbl.DELETE;
5714 err_error_number_tbl.DELETE;
5715 err_object_version_number_tbl.DELETE;
5716 err_error_type_tbl.DELETE;
5717 err_entity_tbl.DELETE;
5718 err_error_description_tbl.DELETE;
5719
5720 EXIT WHEN l_var_interface_csr%NOTFOUND;
5721 END LOOP;
5722
5723
5724 -----------------------------------------------------------------------
5725 -- End of outermost loop for bulk fetch
5726 -----------------------------------------------------------------------
5727
5728 IF l_var_interface_csr%ISOPEN THEN
5729 CLOSE l_var_interface_csr;
5730 END IF;
5731
5732 -- Insert records into OKC_BUS_VARIABLES_TL for missing languages
5733 IF p_validate_only = 'N' THEN
5734 BEGIN
5735 SAVEPOINT bulklanginsert;
5736 IF (l_debug = 'Y') THEN
5737 okc_debug.log('1000: Entering Insert Missing Lang Records', 2);
5738 END IF;
5739
5740 INSERT INTO OKC_BUS_VARIABLES_TL (
5741 VARIABLE_CODE,
5742 VARIABLE_NAME,
5743 DESCRIPTION,
5744 CREATED_BY,
5745 CREATION_DATE,
5746 LAST_UPDATE_DATE,
5747 LAST_UPDATED_BY,
5748 LAST_UPDATE_LOGIN,
5749 LANGUAGE,
5750 SOURCE_LANG
5751 )
5752 SELECT
5753 VART.VARIABLE_CODE,
5754 VART.VARIABLE_NAME,
5755 VART.DESCRIPTION,
5756 l_user_id,
5757 sysdate,
5758 sysdate,
5759 l_user_id,
5760 l_login_id,
5761 LANG.LANGUAGE_CODE,
5762 VART.SOURCE_LANG
5763 FROM OKC_BUS_VARIABLES_TL VART,
5764 FND_LANGUAGES LANG,
5765 OKC_VARIABLES_INTERFACE VARI
5766 WHERE LANG.INSTALLED_FLAG IN ('I', 'B')
5767 AND VART.VARIABLE_CODE = RTRIM(VARI.VARIABLE_CODE)
5768 AND NVL(VARI.PROCESS_STATUS,'*') = 'S'
5769 AND VARI.BATCH_NUMBER = p_batch_number
5770 AND VARI.ACTION <> 'D'
5771 AND NOT EXISTS
5772 (SELECT NULL
5773 FROM OKC_BUS_VARIABLES_TL VART1
5774 WHERE VART1.VARIABLE_CODE = VART.VARIABLE_CODE
5775 AND VART1.LANGUAGE = LANG.LANGUAGE_CODE)
5776 AND VART.ROWID = (SELECT MIN(VART2.ROWID)
5777 FROM OKC_BUS_VARIABLES_TL VART2
5778 WHERE VART2.VARIABLE_CODE = VART.VARIABLE_CODE)
5779 AND VARI.ROWID = (SELECT MIN(VARI1.ROWID)
5780 FROM OKC_VARIABLES_INTERFACE VARI1
5781 WHERE RTRIM(VARI1.VARIABLE_CODE) = RTRIM(VARI.VARIABLE_CODE)
5782 AND VARI1.ACTION <> 'D'
5783 AND VARI1.BATCH_NUMBER = VARI.BATCH_NUMBER
5784 AND NVL(VARI1.PROCESS_STATUS,'*') = 'S');
5785 COMMIT;
5786
5787 IF (l_debug = 'Y') THEN
5788 okc_debug.log('1100: Leaving Insert Missing Lang Records', 2);
5789 END IF;
5790
5791 EXCEPTION
5792 WHEN OTHERS THEN
5793 IF (l_debug = 'Y') THEN
5794 okc_debug.log('1200: Leaving Missing langauge Insert because of EXCEPTION: '||l_context||sqlerrm, 2);
5795 END IF;
5796 ROLLBACK TO SAVEPOINT bulklanginsert;
5797 END;
5798
5799 END IF; --p_validate_only = 'N' THEN
5800
5801 --##count:add up last processed counts
5802 l_tot_rows_processed := l_tot_rows_processed + l_part_rows_processed;
5803 l_tot_rows_failed := l_tot_rows_failed + l_part_rows_failed;
5804 l_tot_rows_warned := l_tot_rows_warned + l_part_rows_warned;
5805
5806 --Update Batch Process Table as a last step
5807 UPDATE OKC_ART_INT_BATPROCS_ALL
5808 SET
5809 TOTAL_ROWS_PROCESSED = l_tot_rows_processed,
5810 TOTAL_ROWS_FAILED = l_tot_rows_failed,
5811 TOTAL_ROWS_WARNED = l_tot_rows_warned,
5812 END_DATE = SYSDATE,
5813 PROGRAM_ID = l_program_id,
5814 REQUEST_ID = l_request_id,
5815 PROGRAM_LOGIN_ID = l_program_login_id,
5816 PROGRAM_APPLICATION_ID = l_program_appl_id,
5817 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
5818 LAST_UPDATED_BY = l_user_id,
5819 LAST_UPDATE_LOGIN = l_login_id,
5820 LAST_UPDATE_DATE = SYSDATE
5821 WHERE
5822 BATCH_PROCESS_ID = l_batch_process_id
5823 AND ENTITY = 'Variable';
5824
5825 IF err_error_number_tbl.COUNT > 0 THEN
5826 insert_error_array(
5827 x_return_status => x_return_status,
5828 x_msg_count => x_msg_count,
5829 x_msg_data => x_msg_data
5830 );
5831 END IF;
5832
5833 -- Print statistic of this run in the log
5834 -- Commented for new XML Based Import - Moved to new_wrap_up in conc_import_articles
5835 --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');
5836 commit; -- Final commit for status update
5837
5838 IF (l_debug = 'Y') THEN
5839 okc_debug.log('2000: Leaving variables import', 2);
5840 END IF;
5841 --x_return_status := l_return_status; this may cause to erase error x_return_status
5842
5843 EXCEPTION
5844
5845 WHEN FND_API.G_EXC_ERROR THEN
5846 IF (l_debug = 'Y') THEN
5847 okc_debug.log('3000: Leaving Variables_Import: OKC_API.G_EXCEPTION_ERROR Exception', 2);
5848 END IF;
5849 --Insert Errors into Error table if there is any
5850 insert_error_array(
5851 x_return_status => x_return_status,
5852 x_msg_count => x_msg_count,
5853 x_msg_data => x_msg_data
5854 );
5855 x_return_status := G_RET_STS_ERROR ;
5856
5857 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5858 IF (l_debug = 'Y') THEN
5859 okc_debug.log('4000: Leaving Variables_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
5860 END IF;
5861 --Insert Errors into Error table if there is any
5862
5863 insert_error_array(
5864 x_return_status => x_return_status,
5865 x_msg_count => x_msg_count,
5866 x_msg_data => x_msg_data
5867 );
5868 commit;
5869
5870 IF l_var_interface_csr%ISOPEN THEN
5871 CLOSE l_var_interface_csr;
5872 END IF;
5873
5874 x_return_status := G_RET_STS_UNEXP_ERROR ;
5875 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
5876 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
5877 END IF;
5878 get_print_msgs_stack(p_msg_data => x_msg_data);
5879
5880 WHEN l_insert_errors_exception THEN
5881 --
5882 -- In this exception handling, we don't insert error array again
5883 -- because error happend in the module
5884 --
5885 IF (l_debug = 'Y') THEN
5886 okc_debug.log('5000: Leaving Variables_Import because of EXCEPTION in insert_error_array: '||sqlerrm, 2);
5887 END IF;
5888
5889 IF l_var_interface_csr%ISOPEN THEN
5890 CLOSE l_var_interface_csr;
5891 END IF;
5892
5893
5894 --x_return_status := G_RET_STS_UNEXP_ERROR ;
5895 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
5896 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
5897 END IF;
5898 get_print_msgs_stack(p_msg_data => x_msg_data);
5899 commit;
5900
5901 WHEN OTHERS THEN
5902 IF (l_debug = 'Y') THEN
5903 okc_debug.log('5000: Leaving Variables_Import because of EXCEPTION: '||sqlerrm, 2);
5904 END IF;
5905 --Insert Errors into Error table if there is any
5906 insert_error_array(
5907 x_return_status => x_return_status,
5908 x_msg_count => x_msg_count,
5909 x_msg_data => x_msg_data
5910 );
5911 commit;
5912 --
5913 IF l_var_interface_csr%ISOPEN THEN
5914 CLOSE l_var_interface_csr;
5915 END IF;
5916
5917 x_return_status := G_RET_STS_UNEXP_ERROR ;
5918 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
5919 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
5920 END IF;
5921 get_print_msgs_stack(p_msg_data => x_msg_data);
5922 END import_variables;
5923
5924 PROCEDURE import_relationships(
5925 x_return_status OUT NOCOPY VARCHAR2,
5926 x_msg_count OUT NOCOPY NUMBER,
5927 x_msg_data OUT NOCOPY VARCHAR2,
5928
5929 p_batch_procs_id IN NUMBER,
5930 p_batch_number IN VARCHAR2,
5931 p_validate_only IN VARCHAR2 := 'Y',
5932 p_fetchsize IN NUMBER := 100,
5933 p_rows_processed OUT NOCOPY NUMBER,
5934 p_rows_failed OUT NOCOPY NUMBER,
5935 p_rows_warned OUT NOCOPY NUMBER
5936 ) IS
5937 l_api_version CONSTANT NUMBER := 1;
5938 l_api_name CONSTANT VARCHAR2(30) := 'import_relationships';
5939 l_sts_warning CONSTANT VARCHAR2(1) := 'W';
5940 l_row_notfound BOOLEAN := FALSE;
5941 l_user_id NUMBER;
5942 l_login_id NUMBER;
5943 l_insert_errors_exception EXCEPTION;
5944 l_insert_errors_error CONSTANT VARCHAR2(1) := 'X';
5945
5946 CURSOR l_rel_interface_csr ( cp_local_org_id IN NUMBER,
5947 cp_batch_number IN VARCHAR2) IS
5948 SELECT
5949 RELINT.INTERFACE_ID ,
5950 RELINT.BATCH_NUMBER ,
5951 RELINT.OBJECT_VERSION_NUMBER ,
5952 RELINT.SOURCE_ARTICLE_TITLE ,
5953 RELINT.TARGET_ARTICLE_TITLE ,
5954 RELINT.ORG_ID,
5955 RELINT.RELATIONSHIP_TYPE ,
5956 RELINT.PROCESS_STATUS ,
5957 RELINT.ACTION ,
5958 RELS.ARTICLE_INTENT SOURCE_INTENT,
5959 RELS.ARTICLE_ID SOURCE_ARTICLE_ID ,
5960 RELT.ARTICLE_INTENT TARGET_INTENT,
5961 RELT.ARTICLE_ID TARGET_ARTICLE_ID
5962 FROM OKC_ART_RELS_INTERFACE RELINT,
5963 OKC_ARTICLES_ALL RELS, OKC_ARTICLES_ALL RELT
5964 WHERE nvl(PROCESS_STATUS,'*') NOT IN ('W', 'S')
5965 AND BATCH_NUMBER = cp_batch_number
5966 AND RELINT.ORG_ID = cp_local_org_id
5967 AND RELINT.SOURCE_ARTICLE_TITLE = RELS.ARTICLE_TITLE(+)
5968 AND RELINT.ORG_ID = RELS.ORG_ID(+)
5969 AND RELINT.TARGET_ARTICLE_TITLE = RELT.ARTICLE_TITLE(+)
5970 AND RELINT.ORG_ID = RELT.ORG_ID(+)
5971 ORDER BY RELINT.SOURCE_ARTICLE_TITLE,RELINT.TARGET_ARTICLE_TITLE ASC;
5972
5973 CURSOR l_rel_exist_csr (cp_src_article_id IN NUMBER,
5974 cp_tar_article_id IN NUMBER,
5975 cp_org_id IN NUMBER,
5976 cp_rel_type IN VARCHAR2) IS
5977 SELECT '1' FROM OKC_ARTICLE_RELATNS_ALL
5978 WHERE source_article_id = cp_src_article_id
5979 AND target_article_id = cp_tar_article_id
5980 AND org_id = cp_org_id
5981 AND relationship_type = cp_rel_type;
5982
5983 CURSOR l_org_valid_csr (cp_org_id IN NUMBER) IS
5984 SELECT '1'
5985 FROM HR_ORGANIZATION_INFORMATION_V orgi, HR_ORGANIZATION_UNITS_V orgu
5986 WHERE orgi.org_information_context = 'OKC_TERMS_LIBRARY_DETAILS'
5987 AND orgi.organization_id = orgu.organization_id
5988 AND orgi.organization_id = cp_org_id;
5989
5990 CURSOR l_provision_csr (cp_article_id IN NUMBER) IS
5991 SELECT provision_yn FROM OKC_ARTICLE_VERSIONS
5992 WHERE article_id = cp_article_id
5993 AND article_version_number = 1;
5994
5995 -- Cursor to check clause in the clause interface Table
5996 CURSOR clause_exists_csr (cp_article_title IN VARCHAR2,
5997 cp_org_id IN NUMBER,
5998 cp_batch_number IN VARCHAR2) IS
5999 SELECT '1'
6000 FROM OKC_ART_INTERFACE_ALL
6001 WHERE article_title = cp_article_title
6002 AND org_id = cp_org_id
6003 AND batch_number = cp_batch_number
6004 AND nvl(process_status,'X') not in ('E');
6005
6006
6007 -- Relationships Interface Rows
6008
6009 TYPE l_rinf_interface_id IS TABLE OF OKC_ART_RELS_INTERFACE.INTERFACE_ID%TYPE INDEX BY BINARY_INTEGER ;
6010 TYPE l_rinf_batch_number IS TABLE OF OKC_ART_RELS_INTERFACE.BATCH_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
6011 TYPE l_rinf_object_version_number IS TABLE OF OKC_ART_RELS_INTERFACE.OBJECT_VERSION_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
6012 TYPE l_rinf_source_article_title IS TABLE OF OKC_ART_RELS_INTERFACE.SOURCE_ARTICLE_TITLE%TYPE INDEX BY BINARY_INTEGER ;
6013 TYPE l_rinf_target_article_title IS TABLE OF OKC_ART_RELS_INTERFACE.TARGET_ARTICLE_TITLE%TYPE INDEX BY BINARY_INTEGER ;
6014 TYPE l_rinf_org_id IS TABLE OF OKC_ART_RELS_INTERFACE.ORG_ID%TYPE INDEX BY BINARY_INTEGER ;
6015 TYPE l_rinf_relationship_type IS TABLE OF OKC_ART_RELS_INTERFACE.RELATIONSHIP_TYPE%TYPE INDEX BY BINARY_INTEGER ;
6016 TYPE l_rinf_process_status IS TABLE OF OKC_ART_RELS_INTERFACE.PROCESS_STATUS%TYPE INDEX BY BINARY_INTEGER ;
6017 TYPE l_rinf_action IS TABLE OF OKC_ART_RELS_INTERFACE.ACTION%TYPE INDEX BY BINARY_INTEGER ;
6018
6019 TYPE l_rinf_source_article_id IS TABLE OF OKC_ARTICLES_ALL.ARTICLE_ID%TYPE INDEX BY BINARY_INTEGER ;
6020 TYPE l_rinf_source_intent IS TABLE OF OKC_ARTICLES_ALL.ARTICLE_INTENT%TYPE INDEX BY BINARY_INTEGER ;
6021 TYPE l_rinf_target_article_id IS TABLE OF OKC_ARTICLES_ALL.ARTICLE_ID%TYPE INDEX BY BINARY_INTEGER ;
6022 TYPE l_rinf_target_intent IS TABLE OF OKC_ARTICLES_ALL.ARTICLE_INTENT%TYPE INDEX BY BINARY_INTEGER ;
6023
6024
6025 l_return_status VARCHAR2(1);
6026 l_error_index NUMBER := 1;
6027 l_batch_process_id NUMBER := 1;
6028 l_context VARCHAR2(50) := NULL;
6029 l_init_msg_list VARCHAR2(200) := okc_api.g_true;
6030 l_tot_rows_processed NUMBER := 0;
6031 l_tot_rows_failed NUMBER := 0;
6032 l_tot_rows_warned NUMBER := 0;
6033 l_part_rows_processed NUMBER := 0;
6034 l_part_rows_failed NUMBER := 0;
6035 l_part_rows_warned NUMBER := 0;
6036 l_bulk_failed VARCHAR2(1) := 'Y';
6037
6038 -- Variables for relationships interface
6039 rinf_interface_id_tbl l_rinf_interface_id ;
6040 rinf_batch_number_tbl l_rinf_batch_number ;
6041 rinf_object_version_number_tbl l_rinf_object_version_number ;
6042 rinf_source_article_title_tbl l_rinf_source_article_title ;
6043 rinf_target_article_title_tbl l_rinf_target_article_title ;
6044 rinf_org_id_tbl l_rinf_org_id ;
6045 rinf_relationship_type_tbl l_rinf_relationship_type ;
6046 rinf_process_status_tbl l_rinf_process_status ;
6047 rinf_action_tbl l_rinf_action ;
6048
6049 rinf_source_article_id_tbl l_rinf_source_article_id ;
6050 rinf_source_intent_tbl l_rinf_source_intent ;
6051 rinf_target_article_id_tbl l_rinf_target_article_id ;
6052 rinf_target_intent_tbl l_rinf_target_intent ;
6053
6054 I NUMBER := 0;
6055 j NUMBER := 0;
6056 k NUMBER := 0;
6057 x NUMBER := 0;
6058 l_program_id OKC_ART_RELS_INTERFACE.PROGRAM_ID%TYPE;
6059 l_program_login_id OKC_ART_RELS_INTERFACE.PROGRAM_LOGIN_ID%TYPE;
6060 l_program_appl_id OKC_ART_RELS_INTERFACE.PROGRAM_APPLICATION_ID%TYPE;
6061 l_request_id OKC_ART_RELS_INTERFACE.REQUEST_ID%TYPE;
6062 l_dummy VARCHAR2(1) := '2';
6063 l_dummy1 VARCHAR2(1) := '3';
6064 l_clause VARCHAR2(1) := NULL;
6065 l_tmp_return_status VARCHAR2(1) := G_RET_STS_SUCCESS;
6066
6067 l_source_provision VARCHAR2(1);
6068 l_target_provision VARCHAR2(1);
6069
6070 BEGIN
6071 IF (l_debug = 'Y') THEN
6072 okc_debug.log('100: Entered relationships_import', 2);
6073 END IF;
6074
6075 ------------------------------------------------------------------------
6076 -- Variable Initialization
6077 -------------------------------------------------------------------------
6078
6079
6080 -- Standard Start of API savepoint
6081 FND_MSG_PUB.initialize;
6082 -- Initialize API return status to success
6083 x_return_status := FND_API.G_RET_STS_SUCCESS;
6084 l_return_status := G_RET_STS_SUCCESS;
6085 -- Cache user_id, login_id and org_id
6086 l_user_id := Fnd_Global.user_id;
6087 l_login_id := Fnd_Global.login_id;
6088 -- MOAC
6089 G_CURRENT_ORG_ID := mo_global.get_current_org_id();
6090 /*
6091 OPEN cur_org_csr;
6092 FETCH cur_org_csr INTO G_CURRENT_ORG_ID;
6093 CLOSE cur_org_csr;
6094 */
6095
6096 -- MOAC
6097 IF G_CURRENT_ORG_ID IS NULL THEN
6098 OKC_API.SET_MESSAGE(G_APP_NAME,'OKC_ART_NULL_ORG_ID');
6099 RAISE FND_API.G_EXC_ERROR ;
6100 END IF;
6101
6102 IF FND_GLOBAL.CONC_PROGRAM_ID = -1 THEN
6103 l_program_id := NULL;
6104 ELSE
6105 l_program_id := FND_GLOBAL.CONC_PROGRAM_ID;
6106 END IF;
6107
6108 IF FND_GLOBAL.CONC_LOGIN_ID = -1 THEN
6109 l_program_login_id := NULL;
6110 ELSE
6111 l_program_login_id := FND_GLOBAL.CONC_LOGIN_ID;
6112 END IF;
6113
6114 IF FND_GLOBAL.PROG_APPL_ID = -1 THEN
6115 l_program_appl_id := NULL;
6116 ELSE
6117 l_program_appl_id := FND_GLOBAL.PROG_APPL_ID;
6118 END IF;
6119
6120 IF FND_GLOBAL.CONC_REQUEST_ID = -1 THEN
6121 l_request_id := NULL;
6122 ELSE
6123 l_request_id := FND_GLOBAL.CONC_REQUEST_ID;
6124 END IF;
6125
6126 l_batch_process_id := p_batch_procs_id;
6127 -------------------------------------------------------------------------
6128 --------------- the outermost loop of this procedure --------------------
6129 -- Bulk fetch all interface rows based on the fetchsize passedby the user
6130 -------------------------------------------------------------------------
6131 l_context :='BULK FETCH RELATIONSHIP INTERFACE ROW';
6132 OPEN l_rel_interface_csr ( G_CURRENT_ORG_ID,p_batch_number );
6133 LOOP
6134 BEGIN
6135 FETCH l_rel_interface_csr BULK COLLECT INTO
6136 rinf_interface_id_tbl ,
6137 rinf_batch_number_tbl ,
6138 rinf_object_version_number_tbl ,
6139 rinf_source_article_title_tbl ,
6140 rinf_target_article_title_tbl ,
6141 rinf_org_id_tbl ,
6142 rinf_relationship_type_tbl ,
6143 rinf_process_status_tbl ,
6144 rinf_action_tbl ,
6145 rinf_source_intent_tbl ,
6146 rinf_source_article_id_tbl ,
6147 rinf_target_intent_tbl ,
6148 rinf_target_article_id_tbl LIMIT p_fetchsize;
6149 EXIT WHEN rinf_interface_id_tbl.COUNT = 0 ;
6150
6151 ------------------------------------------------------------------------
6152 -- Variable initialization
6153 -------------------------------------------------------------------------
6154 --For each fetch, relationship variable table index should be initialized
6155 j := 1;
6156 --##count:initialization
6157 l_tot_rows_processed := l_tot_rows_processed+l_part_rows_processed;
6158 l_tot_rows_failed := l_tot_rows_failed+l_part_rows_failed;
6159 l_tot_rows_warned := l_tot_rows_warned+l_part_rows_warned;
6160 l_part_rows_processed := 0;
6161 l_part_rows_failed := 0;
6162 l_part_rows_warned := 0;
6163 l_bulk_failed := 'N';
6164 ---------------------------------------------------------------------------
6165 --------------------- Inner Loop thru fetched rows for---------------------
6166 -- validation, parse and validate article text, create a variable list
6167 -- prepare rows for DML if validate_only is 'N'
6168 /*** Processing Rule to set process_status
6169 Because we want to collect as much info as possible, we need to
6170 maintain process status while keeping the process moving.
6171 So, we'll set l_return_status as validation goes on and
6172 at the end we will set inf_process_status_tbl(i) with l_return_status
6173 for final result. However, we will get out of this process if there
6174 is a significant error such as 'U'.
6175 The return status examined
6176 -api_return_status : return status for api call
6177 -l_return_status : validation result of each row
6178 -x_return_status : final result status for concurrent program request
6179 Rule to set return status
6180 If api_return_status for api call is
6181 * 'S' then continue
6182 * 'W' and l_return_status not 'E' or 'U' then set l_return_status = 'W'
6183 and build_error_array then continue
6184 * 'E' and it is significant then set l_return_status = 'E' and raise
6185 Exception
6186 * 'E' and it is minor then set l_return_status = 'E' and continue. Raise
6187 'E' at the end of validation
6188 * 'U' then set l_return_status = 'U' and raise 'U' exception
6189 * At the end, if it goes thru with no Exception,
6190 Check if l_return_status is 'E' then raise Exception
6191 Otherwise (meaning l_return_status is 'S' or 'W'),
6192 rinf_process_status_tbl(i) = l_return_status
6193 * In the exception, we will set
6194 rinf_process_status_tbl(i) = l_return_status and build_error_array
6195 ***/
6196 -------------------------------------------------------------------------
6197
6198 FOR i in rinf_interface_id_tbl.FIRST ..rinf_interface_id_tbl.LAST LOOP
6199 BEGIN
6200 -- Increment total processed rows
6201 --##Count
6202 l_part_rows_processed := l_part_rows_processed+1;
6203 -- Initialization for each iteration
6204 l_row_notfound := FALSE;
6205 l_return_status := G_RET_STS_SUCCESS;
6206
6207 l_context := 'RELATIONSHIP VALIDATING';
6208
6209 -- To find duplicate relationship in the batch
6210 IF i>1 THEN
6211 x := i-1;
6212 IF (RTRIM(rinf_source_article_title_tbl(i)) = RTRIM(rinf_source_article_title_tbl(x))) AND
6213 (RTRIM(rinf_target_article_title_tbl(i)) = RTRIM(rinf_target_article_title_tbl(x)))
6214 THEN
6215 Okc_Api.Set_Message(G_APP_NAME,
6216 'OKC_REL_DUP_TITLE_ORG',
6217 'CLAUSE1',
6218 rinf_source_article_title_tbl(i),
6219 'CLAUSE2',
6220 rinf_target_article_title_tbl(i));
6221 l_return_status := G_RET_STS_ERROR;
6222 RAISE FND_API.G_EXC_ERROR;
6223 END IF;
6224 END IF;
6225 -- Logic to decide what to do in case of Action='S'
6226
6227 IF rinf_action_tbl(i) = 'S' THEN
6228 rinf_action_tbl(i) := 'N';
6229 END IF;
6230
6231
6232 IF rinf_action_tbl(i) = 'N' THEN
6233
6234 --TRIM trailing space because
6235 rinf_source_article_title_tbl(i) := RTRIM(rinf_source_article_title_tbl(i));
6236 rinf_target_article_title_tbl(i) := RTRIM(rinf_target_article_title_tbl(i));
6237
6238
6239 IF rinf_source_article_id_tbl(i) is NULL THEN
6240 IF p_validate_only = 'Y' THEN
6241 OPEN clause_exists_csr (rinf_source_article_title_tbl(i),
6242 rinf_org_id_tbl(i),
6243 rinf_batch_number_tbl(i));
6244 FETCH clause_exists_csr into l_clause;
6245 CLOSE clause_exists_csr;
6246 IF l_clause is null THEN
6247 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6248 p_msg_name => 'OKC_SOURCE_ART_NOT_FOUND',
6249 p_token1 => 'ARTICLE_TITLE',
6250 p_token1_value => rinf_source_article_title_tbl(i));
6251 l_return_status := G_RET_STS_ERROR;
6252 RAISE FND_API.G_EXC_ERROR ;
6253 ELSE
6254 -- Reset Local Variables
6255 l_clause := NULL;
6256 END IF;
6257 ELSE
6258 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6259 p_msg_name => 'OKC_SOURCE_ART_NOT_FOUND',
6260 p_token1 => 'ARTICLE_TITLE',
6261 p_token1_value => rinf_source_article_title_tbl(i));
6262 l_return_status := G_RET_STS_ERROR;
6263 RAISE FND_API.G_EXC_ERROR ;
6264 END IF;
6265 END IF;
6266
6267 IF rinf_target_article_id_tbl(i) is NULL THEN
6268 IF p_validate_only = 'Y' THEN
6269 OPEN clause_exists_csr (rinf_target_article_title_tbl(i),
6270 rinf_org_id_tbl(i),
6271 rinf_batch_number_tbl(i));
6272 FETCH clause_exists_csr into l_clause;
6273 CLOSE clause_exists_csr;
6274 IF l_clause is null THEN
6275 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6276 p_msg_name => 'OKC_TARGET_ART_NOT_FOUND',
6277 p_token1 => 'ARTICLE_TITLE',
6278 p_token1_value => rinf_target_article_title_tbl(i));
6279 l_return_status := G_RET_STS_ERROR;
6280 RAISE FND_API.G_EXC_ERROR ;
6281 ELSE
6282 -- Reset Local Variables
6283 l_clause := NULL;
6284 END IF;
6285 ELSE
6286 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6287 p_msg_name => 'OKC_TARGET_ART_NOT_FOUND',
6288 p_token1 => 'ARTICLE_TITLE',
6289 p_token1_value => rinf_target_article_title_tbl(i));
6290 l_return_status := G_RET_STS_ERROR;
6291 RAISE FND_API.G_EXC_ERROR ;
6292 END IF;
6293 END IF;
6294
6295
6296
6297 /* IF rinf_source_article_id_tbl(i) is NULL THEN
6298 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6299 p_msg_name => 'OKC_SOURCE_ART_NOT_FOUND',
6300 p_token1 => 'ARTICLE_TITLE',
6301 p_token1_value => rinf_source_article_title_tbl(i));
6302 l_return_status := G_RET_STS_ERROR;
6303 RAISE FND_API.G_EXC_ERROR ;
6304 END IF;
6305
6306 IF rinf_target_article_id_tbl(i) is NULL THEN
6307 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6308 p_msg_name => 'OKC_TARGET_ART_NOT_FOUND',
6309 p_token1 => 'ARTICLE_TITLE',
6310 p_token1_value => rinf_target_article_title_tbl(i));
6311 l_return_status := G_RET_STS_ERROR;
6312 RAISE FND_API.G_EXC_ERROR ;
6313 END IF;
6314 */
6315 ELSIF rinf_action_tbl(i) = 'D' THEN
6316
6317 -- Check Relationship already exists or not
6318 OPEN l_rel_exist_csr(rinf_source_article_id_tbl(i),
6319 rinf_target_article_id_tbl(i),
6320 rinf_org_id_tbl(i),
6321 rinf_relationship_type_tbl(i));
6322 FETCH l_rel_exist_csr into l_dummy;
6323 CLOSE l_rel_exist_csr;
6324 IF l_dummy <> '1' THEN
6325 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6326 p_msg_name => 'OKC_ART_REL_NOT_EXIST',
6327 p_token1 => 'ARTICLE1',
6328 p_token1_value => rinf_source_article_title_tbl(i),
6329 p_token2 => 'ARTICLE2',
6330 p_token2_value => rinf_target_article_title_tbl(i)
6331 );
6332 -- Reset local variable
6333 l_dummy := NULL;
6334 l_return_status := G_RET_STS_ERROR;
6335 RAISE FND_API.G_EXC_ERROR ;
6336
6337 END IF;
6338 ELSE
6339
6340 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6341 p_msg_name => 'OKC_REL_INV_IMP_ACTION');
6342 l_return_status := G_RET_STS_ERROR;
6343 RAISE FND_API.G_EXC_ERROR ;
6344 END IF;
6345
6346 -----------------------------------------------------------
6347 -- Common validation or attribute settting
6348 -- regardless of status and import action
6349 -- this validation is not included in validate api
6350 -----------------------------------------------------------
6351 IF rinf_action_tbl(i) = 'N' THEN
6352
6353 -- Check Source Article and Target Article should not be same
6354
6355 IF rinf_target_article_id_tbl(i) = rinf_source_article_id_tbl(i) THEN
6356 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6357 p_msg_name => 'OKC_IMP_SAME_ART_RELTNSHP',
6358 p_token1 => 'ARTICLE1',
6359 p_token1_value => rinf_source_article_title_tbl(i));
6360 l_return_status := G_RET_STS_ERROR;
6361 END IF;
6362
6363 -- Check Org id is valid org and EIT is defined for this org
6364 OPEN l_org_valid_csr(rinf_org_id_tbl(i));
6365 FETCH l_org_valid_csr into l_dummy1;
6366 CLOSE l_org_valid_csr;
6367 IF l_dummy1 <> '1' THEN
6368 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6369 p_msg_name => 'OKC_ART_ORG_INVALID');
6370 l_return_status := G_RET_STS_ERROR;
6371 END IF;
6372
6373
6374 -- Check Relationship already exists or not
6375 OPEN l_rel_exist_csr(rinf_source_article_id_tbl(i),
6376 rinf_target_article_id_tbl(i),
6377 rinf_org_id_tbl(i),
6378 rinf_relationship_type_tbl(i));
6379 FETCH l_rel_exist_csr into l_dummy;
6380 CLOSE l_rel_exist_csr;
6381 IF l_dummy = '1' THEN
6382 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6383 p_msg_name => 'OKC_ART_REL_EXIST',
6384 p_token1 => 'ARTICLE1',
6385 p_token1_value => rinf_source_article_title_tbl(i),
6386 p_token2 => 'ARTICLE2',
6387 p_token2_value => rinf_target_article_title_tbl(i));
6388 l_return_status := G_RET_STS_ERROR;
6389 -- Reset local variable
6390 l_dummy := NULL;
6391 END IF;
6392
6393 -- Checking Relationship types
6394 /*
6395 IF nvl(rinf_relationship_type_tbl(i), '*') not in ('ALTERNATE','INCOMPATIBLE') THEN
6396 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6397 p_msg_name => 'OKC_INVALID_RELTYPE');
6398 l_return_status := G_RET_STS_ERROR;
6399 END IF;
6400 */
6401 IF rinf_relationship_type_tbl(i) IS NOT NULL THEN
6402 l_tmp_return_status := okc_util.check_lookup_code('OKC_ARTICLE_RELATIONSHIP_TYPE',rinf_relationship_type_tbl(i));
6403 IF (l_tmp_return_status <> G_RET_STS_SUCCESS) THEN
6404 Okc_Api.Set_Message(G_APP_NAME, G_INVALID_VALUE, G_COL_NAME_TOKEN, 'RELATIONSHIP_TYPE');
6405 l_return_status := G_RET_STS_ERROR;
6406 END IF;
6407 END IF;
6408
6409 -- Soruce Article and Target Article should have same intent
6410 IF rinf_target_intent_tbl(i) <> rinf_source_intent_tbl(i) THEN
6411 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6412 p_msg_name => 'OKC_ART_NOT_SAME_INTENT',
6413 p_token1 => 'ARTICLE1',
6414 p_token1_value => rinf_source_article_title_tbl(i),
6415 p_token2 => 'ARTICLE2',
6416 p_token2_value => rinf_target_article_title_tbl(i));
6417 l_return_status := G_RET_STS_ERROR;
6418 END IF;
6419 -- Soruce Article and Target Article should have same provision flag
6420 FOR source in l_provision_csr(rinf_source_article_id_tbl(i))
6421 LOOP
6422 l_source_provision := source.provision_yn;
6423 END LOOP;
6424 FOR target in l_provision_csr(rinf_target_article_id_tbl(i))
6425 LOOP
6426 l_target_provision := target.provision_yn;
6427 END LOOP;
6428 IF l_source_provision <> l_target_provision THEN
6429 okc_Api.Set_Message(p_app_name => G_APP_NAME,
6430 p_msg_name => 'OKC_ART_IMP_PROVISION_RELATION',
6431 p_token1 => 'ARTICLE1',
6432 p_token1_value => rinf_source_article_title_tbl(i),
6433 p_token2 => 'ARTICLE2',
6434 p_token2_value => rinf_target_article_title_tbl(i));
6435 l_return_status := G_RET_STS_ERROR;
6436 END IF;
6437
6438 END IF;
6439 ------------------------------------------------------------------------
6440 -- Now that we have validated and data is clean we can fetch sequences and ids
6441 -- for new relationships for DML and also set the process status to Success
6442 -------------------------------------------------------------------------
6443
6444 -- Summarize report for this row
6445 -- Status 'F' is for internal use meaning parsing failure marked in
6446 -- java concurrent program
6447 IF (l_return_status = G_RET_STS_SUCCESS) THEN
6448 IF (nvl(rinf_process_status_tbl(i), 'E') = 'E') THEN
6449 rinf_process_status_tbl(i) := G_RET_STS_SUCCESS;
6450 ELSIF ( rinf_process_status_tbl(i) = 'F') THEN
6451 -- ##count parser failure as error
6452 --l_tot_rows_failed := l_tot_rows_failed+1;
6453 l_part_rows_failed := l_part_rows_failed+1;
6454 rinf_process_status_tbl(i) := G_RET_STS_ERROR;
6455 END IF;
6456 ELSIF (l_return_status = l_sts_warning) THEN
6457 IF (nvl(rinf_process_status_tbl(i),'E') = 'E') THEN
6458 rinf_process_status_tbl(i) := l_sts_warning;
6459 --##count
6460 --l_tot_rows_warned := l_tot_rows_warned+1;
6461 l_part_rows_warned := l_part_rows_warned+1;
6462 ELSIF (rinf_process_status_tbl(i) = 'F') THEN
6463 -- ##count parser failure as error
6464 --l_tot_rows_failed := l_tot_rows_failed+1;
6465 l_part_rows_failed := l_part_rows_failed+1;
6466 rinf_process_status_tbl(i) := G_RET_STS_ERROR;
6467 END IF;
6468 ELSIF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
6469 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6470 ELSIF (l_return_status = G_RET_STS_ERROR) THEN
6471 RAISE FND_API.G_EXC_ERROR;
6472 END IF;
6473
6474 -------------------------
6475 -------------------------
6476 -- Exception Block for each iteration in Loop
6477 -- validation and unexpected errors
6478 -- In case of unexpected error, escape the loop
6479 -------------------------
6480 -------------------------
6481
6482
6483 EXCEPTION
6484 WHEN FND_API.G_EXC_ERROR THEN
6485 IF (l_debug = 'Y') THEN
6486 okc_debug.log('300: In Relationships_Import: OKC_API.G_EXCEPTION_ERROR Exception', 2);
6487 END IF;
6488 --l_return_status := G_RET_STS_ERROR ;
6489 build_error_array(
6490 p_msg_data => x_msg_data,
6491 p_context => l_context,
6492 p_batch_process_id => l_batch_process_id,
6493 p_interface_id => rinf_interface_id_tbl(i),
6494 p_article_title => rinf_source_article_title_tbl(i),
6495 p_error_type => G_RET_STS_ERROR,
6496 p_entity => 'RELATIONSHIP'
6497 );
6498 rinf_process_status_tbl(i) := G_RET_STS_ERROR;
6499 --##count
6500 --l_tot_rows_failed := l_tot_rows_failed+1;
6501 l_part_rows_failed := l_part_rows_failed+1;
6502 -- Continue to next row
6503
6504 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6505 IF (l_debug = 'Y') THEN
6506 okc_debug.log('400: Leaving Relationships_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
6507 END IF;
6508
6509 IF l_rel_interface_csr%ISOPEN THEN
6510 CLOSE l_rel_interface_csr;
6511 END IF;
6512
6513 --Set_Message
6514 l_return_status := G_RET_STS_UNEXP_ERROR ;
6515 x_return_status := G_RET_STS_UNEXP_ERROR ;
6516
6517 build_error_array(
6518 p_msg_data => x_msg_data,
6519 p_context => l_context,
6520 p_batch_process_id => l_batch_process_id,
6521 p_interface_id => rinf_interface_id_tbl(i),
6522 p_article_title => rinf_source_article_title_tbl(i),
6523 p_error_type => G_RET_STS_UNEXP_ERROR,
6524 p_entity => 'RELATIONSHIP'
6525 );
6526 rinf_process_status_tbl(i) := G_RET_STS_ERROR;
6527 --##count
6528 --l_tot_rows_failed := l_tot_rows_failed+1;
6529 l_part_rows_failed := l_part_rows_failed+1;
6530 exit; -- exit the current fetch
6531
6532 WHEN OTHERS THEN
6533 IF (l_debug = 'Y') THEN
6534 okc_debug.log('500: Leaving Relationships_Import because of EXCEPTION: '||sqlerrm, 2);
6535 END IF;
6536
6537 IF l_rel_interface_csr%ISOPEN THEN
6538 CLOSE l_rel_interface_csr;
6539 END IF;
6540
6541 l_return_status := G_RET_STS_UNEXP_ERROR ;
6542 x_return_status := G_RET_STS_UNEXP_ERROR ;
6543
6544 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6545 p_msg_name => G_UNEXPECTED_ERROR,
6546 p_token1 => G_SQLCODE_TOKEN,
6547 p_token1_value => sqlcode,
6548 p_token2 => G_SQLERRM_TOKEN,
6549 p_token2_value => sqlerrm);
6550
6551 build_error_array(
6552 p_msg_data => G_UNEXPECTED_ERROR,
6553 p_context => l_context,
6554 p_batch_process_id => l_batch_process_id,
6555 p_interface_id => rinf_interface_id_tbl(i),
6556 p_article_title => rinf_source_article_title_tbl(i),
6557 p_error_type => G_RET_STS_ERROR,
6558 p_entity => 'RELATIONSHIP'
6559 );
6560 rinf_process_status_tbl(i) := G_RET_STS_ERROR;
6561 --##count
6562 --l_tot_rows_failed := l_tot_rows_failed+1;
6563 l_part_rows_failed := l_part_rows_failed+1;
6564 exit; -- exit the current fetch
6565 END;
6566 -------------------------
6567 -------------------------
6568 -- Exception Block for each iteration in Loop ends
6569 -------------------------
6570 -------------------------
6571
6572
6573 END LOOP; -- end of FOR i in inf_interface_id_tbl.FIRST ..
6574 ------------------------------------------------------------------------
6575 -------------- End of Inner Loop thru fetched row for---------------------
6576 -- validation
6577 -------------------------------------------------------------------------
6578 -- In order to propagate Unexpected error raise it if it is 'U'
6579 IF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
6580 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
6581 END IF;
6582
6583 -------------------------
6584 -------------------------
6585 -- Exception Block for Inner Loop starts
6586 -- Handles unexpected errors as last step
6587 -------------------------
6588 -------------------------
6589 EXCEPTION
6590 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6591 IF (l_debug = 'Y') THEN
6592 okc_debug.log('400: Leaving Relationships_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
6593 END IF;
6594
6595 IF l_rel_interface_csr%ISOPEN THEN
6596 CLOSE l_rel_interface_csr;
6597 END IF;
6598 l_return_status := G_RET_STS_UNEXP_ERROR ;
6599 x_return_status := G_RET_STS_UNEXP_ERROR ;
6600 exit; -- exit outermost loop
6601
6602 WHEN OTHERS THEN
6603 IF (l_debug = 'Y') THEN
6604 okc_debug.log('500: Leaving Relationships_Import because of EXCEPTION: '||sqlerrm, 2);
6605 END IF;
6606
6607 IF l_rel_interface_csr%ISOPEN THEN
6608 CLOSE l_rel_interface_csr;
6609 END IF;
6610 l_return_status := G_RET_STS_UNEXP_ERROR ;
6611 x_return_status := G_RET_STS_UNEXP_ERROR ;
6612 exit; -- exit outermost loop
6613 END;
6614
6615 -------------------------
6616 -------------------------
6617 -- Exception Block for Each Iteration of outermost Loop ends
6618 -------------------------
6619 -------------------------
6620
6621 ------------------------------------------------------------------------
6622 --------------------- Start Do_DML for Relationships ---------------
6623 -- Insert or Update Relationships
6624 -------------------------------------------------------------------------
6625 -- initialize l_return_status to track status of DML execution
6626 l_return_status := G_RET_STS_SUCCESS;
6627
6628
6629 IF p_validate_only = 'N' THEN
6630 BEGIN
6631 SAVEPOINT bulkdml;
6632
6633 i := 0;
6634 -- Bulk insert New Valid Records
6635 BEGIN
6636 l_context := 'INSERTING FIRST NEW RELATIONSHIP INTO TABLE';
6637
6638 FORALL i in rinf_interface_id_tbl.FIRST ..rinf_interface_id_tbl.LAST
6639 INSERT INTO OKC_ARTICLE_RELATNS_ALL(
6640 SOURCE_ARTICLE_ID,
6641 TARGET_ARTICLE_ID,
6642 ORG_ID,
6643 RELATIONSHIP_TYPE,
6644 OBJECT_VERSION_NUMBER,
6645 CREATED_BY,
6646 CREATION_DATE,
6647 LAST_UPDATED_BY,
6648 LAST_UPDATE_LOGIN,
6649 LAST_UPDATE_DATE)
6650 SELECT
6651 rinf_source_article_id_tbl(i),
6652 rinf_target_article_id_tbl(i),
6653 rinf_org_id_tbl(i),
6654 rinf_relationship_type_tbl(i),
6655 1.0,
6656 l_user_id,
6657 sysdate,
6658 l_user_id,
6659 l_login_id,
6660 sysdate
6661 FROM DUAL
6662 WHERE rinf_action_tbl(i) = 'N' and
6663 rinf_process_status_tbl(i) in ('S', 'W') ;
6664
6665
6666 FORALL i in rinf_interface_id_tbl.FIRST ..rinf_interface_id_tbl.LAST
6667 INSERT INTO OKC_ARTICLE_RELATNS_ALL(
6668 TARGET_ARTICLE_ID,
6669 SOURCE_ARTICLE_ID,
6670 ORG_ID,
6671 RELATIONSHIP_TYPE,
6672 OBJECT_VERSION_NUMBER,
6673 CREATED_BY,
6674 CREATION_DATE,
6675 LAST_UPDATED_BY,
6676 LAST_UPDATE_LOGIN,
6677 LAST_UPDATE_DATE)
6678 SELECT
6679 rinf_source_article_id_tbl(i),
6680 rinf_target_article_id_tbl(i),
6681 rinf_org_id_tbl(i),
6682 rinf_relationship_type_tbl(i),
6683 1.0,
6684 l_user_id,
6685 sysdate,
6686 l_user_id,
6687 l_login_id,
6688 sysdate
6689 FROM DUAL
6690 WHERE rinf_action_tbl(i) = 'N' and
6691 rinf_process_status_tbl(i) in ('S', 'W') ;
6692 EXCEPTION
6693 WHEN OTHERS THEN
6694 IF (l_debug = 'Y') THEN
6695 okc_debug.log('500: Leaving Relationships_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
6696 END IF;
6697 END;
6698
6699 --
6700 -- End of Insert into OKC_ARTICLE_RELATNS_ALL
6701 --
6702 --
6703
6704
6705 i := 0;
6706 -- Bulk delete Valid Records
6707 BEGIN
6708 l_context := 'DELETE RELATIONSHIP FROM TABLE';
6709
6710 FORALL i in rinf_interface_id_tbl.FIRST ..rinf_interface_id_tbl.LAST
6711 DELETE FROM OKC_ARTICLE_RELATNS_ALL
6712 WHERE
6713 SOURCE_ARTICLE_ID = rinf_source_article_id_tbl(i) AND
6714 TARGET_ARTICLE_ID = rinf_target_article_id_tbl(i) AND
6715 ORG_ID = rinf_org_id_tbl(i) AND
6716 RELATIONSHIP_TYPE = rinf_relationship_type_tbl(i) AND
6717 rinf_action_tbl(i) = 'D' AND
6718 rinf_process_status_tbl(i) in ('S', 'W') ;
6719
6720
6721 FORALL i in rinf_interface_id_tbl.FIRST ..rinf_interface_id_tbl.LAST
6722 DELETE FROM OKC_ARTICLE_RELATNS_ALL
6723 WHERE
6724 TARGET_ARTICLE_ID = rinf_source_article_id_tbl(i) AND
6725 SOURCE_ARTICLE_ID = rinf_target_article_id_tbl(i) AND
6726 ORG_ID = rinf_org_id_tbl(i) AND
6727 RELATIONSHIP_TYPE = rinf_relationship_type_tbl(i) AND
6728 rinf_action_tbl(i) = 'D' AND
6729 rinf_process_status_tbl(i) in ('S', 'W') ;
6730
6731 EXCEPTION
6732 WHEN OTHERS THEN
6733 IF (l_debug = 'Y') THEN
6734 okc_debug.log('500: Leaving Relationships_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
6735 END IF;
6736 END;
6737
6738 --
6739 -- End of Delete from OKC_ARTICLE_RELATNS_ALL
6740 --
6741 --
6742
6743
6744
6745 -- Exception for bulk DML block
6746 EXCEPTION
6747 WHEN OTHERS THEN
6748 l_bulk_failed := 'Y'; -- indicating that bulk operation has failed
6749 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6750 p_msg_name => G_UNEXPECTED_ERROR,
6751 p_token1 => G_SQLCODE_TOKEN,
6752 p_token1_value => sqlcode,
6753 p_token2 => G_SQLERRM_TOKEN,
6754 p_token2_value => sqlerrm);
6755 Okc_API.Set_Message(p_app_name => G_APP_NAME,
6756 p_msg_name => 'OKC_ART_FETCH_FAILED',
6757 p_token1 => 'CONTEXT',
6758 p_token1_value => l_context);
6759
6760 build_error_array(
6761 p_msg_data => null,
6762 p_context => l_context,
6763 p_batch_process_id => l_batch_process_id,
6764 p_interface_id => -99,
6765 p_article_title => NULL,
6766 p_error_type => G_RET_STS_ERROR,
6767 p_entity => 'RELATIONSHIP'
6768 );
6769 l_return_status := G_RET_STS_UNEXP_ERROR;
6770 x_return_status := G_RET_STS_UNEXP_ERROR;
6771
6772 --##count:rollback the count
6773 l_part_rows_failed := l_part_rows_processed;
6774 l_part_rows_warned := 0;
6775
6776 ROLLBACK TO SAVEPOINT bulkdml;
6777 exit; -- exit outermost loop
6778 END;
6779
6780 END IF; --- validate_only = 'N'
6781
6782 ------------------------------------------------------------------------
6783 --------------------- End of Do_DML for Relationships ---------------
6784 -------------------------------------------------------------------------
6785
6786 ------------------------------------------------------------------------
6787 --------------- Start of Do_DML for import related tables ------------
6788 -- Update interface table
6789 -- Insert Errors into Error table
6790 -------------------------------------------------------------------------
6791 -- Update Interface Table
6792 i:=0;
6793 BEGIN
6794 l_context := 'UPDATING RELATIONSHIPS INTERFACE TABLE';
6795 FORALL i in rinf_interface_id_tbl.FIRST..rinf_interface_id_tbl.LAST
6796 UPDATE OKC_ART_RELS_INTERFACE
6797 SET
6798 -- We don't want to update process_status to 'S' or 'W' in validation_mode
6799 -- because it is not going to be picked up in next run if we do so
6800 PROCESS_STATUS = decode(p_validate_only||rinf_process_status_tbl(i)||l_bulk_failed,
6801 'NEN','E',
6802 'NSN','S',
6803 'NWN','W',
6804 'NEY','E',
6805 'NSY',NULL,
6806 'NWY',NULL,
6807 'YEY','E',
6808 'YEN','E',
6809 'NFY','E',
6810 'YFY','E',
6811 'NFN','E',
6812 'YFN','E',NULL),
6813 PROGRAM_ID = l_program_id,
6814 REQUEST_ID = l_request_id,
6815 PROGRAM_LOGIN_ID = l_program_login_id,
6816 PROGRAM_APPLICATION_ID = l_program_appl_id,
6817 OBJECT_VERSION_NUMBER = rinf_object_version_number_tbl(i) + 1,
6818 LAST_UPDATED_BY = l_user_id,
6819 LAST_UPDATE_LOGIN = l_login_id,
6820 LAST_UPDATE_DATE = SYSDATE
6821 WHERE
6822 interface_id = rinf_interface_id_tbl(i);
6823 EXCEPTION
6824 WHEN OTHERS THEN
6825 IF (l_debug = 'Y') THEN
6826 okc_debug.log('500: Leaving Relationships_Import because of EXCEPTION: '||sqlerrm, 2);
6827 END IF;
6828 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6829 p_msg_name => G_UNEXPECTED_ERROR,
6830 p_token1 => G_SQLCODE_TOKEN,
6831 p_token1_value => sqlcode,
6832 p_token2 => G_SQLERRM_TOKEN,
6833 p_token2_value => sqlerrm);
6834 Okc_API.Set_Message(p_app_name => G_APP_NAME,
6835 p_msg_name => 'OKC_REL_INT_UPDATE_FAILED');
6836 build_error_array(
6837 p_msg_data => null,
6838 p_context => l_context,
6839 p_batch_process_id => l_batch_process_id,
6840 p_interface_id => -99,
6841 p_article_title => NULL,
6842 p_error_type => G_RET_STS_ERROR,
6843 p_entity => 'RELATIONSHIP'
6844 );
6845
6846 l_return_status := G_RET_STS_UNEXP_ERROR ;
6847 x_return_status := G_RET_STS_UNEXP_ERROR ;
6848 --##count:rollback the count
6849 l_part_rows_failed := l_part_rows_processed;
6850 l_part_rows_warned := 0;
6851
6852 --RAISE FND_API.G_EXC_ERROR ;
6853 END;
6854 --
6855 -- End of Update OKC_RELATIONSHIPS_INTERFACE
6856 --
6857 --
6858
6859 --
6860 --Insert Errors into Error table for this fetch
6861 --
6862 insert_error_array(
6863 x_return_status => x_return_status,
6864 x_msg_count => x_msg_count,
6865 x_msg_data => x_msg_data
6866 );
6867
6868
6869 IF (x_return_status = l_insert_errors_error) THEN
6870 NULL;
6871 -- Ignore
6872 -- RAISE l_insert_errors_exception;
6873 END IF;
6874
6875 ------------------------------------------------------------------------
6876 --------------- End of Do_DML for import related tables ------------
6877 -------------------------------------------------------------------------
6878 commit;
6879
6880 -- Now delete cache for next bulk fetch
6881
6882 rinf_interface_id_tbl.DELETE;
6883 rinf_batch_number_tbl.DELETE;
6884 rinf_object_version_number_tbl.DELETE;
6885 rinf_source_article_title_tbl.DELETE;
6886 rinf_target_article_title_tbl.DELETE;
6887 rinf_org_id_tbl.DELETE;
6888 rinf_relationship_type_tbl.DELETE;
6889 rinf_process_status_tbl.DELETE;
6890 rinf_action_tbl.DELETE;
6891 rinf_source_intent_tbl.DELETE;
6892 rinf_source_article_id_tbl.DELETE;
6893 rinf_target_intent_tbl.DELETE;
6894 rinf_target_article_id_tbl.DELETE;
6895
6896 err_batch_process_id_tbl.DELETE;
6897 err_article_title_tbl.DELETE;
6898 err_interface_id_tbl.DELETE;
6899 err_error_number_tbl.DELETE;
6900 err_object_version_number_tbl.DELETE;
6901 err_error_type_tbl.DELETE;
6902 err_entity_tbl.DELETE;
6903 err_error_description_tbl.DELETE;
6904
6905 EXIT WHEN l_rel_interface_csr%NOTFOUND;
6906 END LOOP;
6907
6908
6909 -----------------------------------------------------------------------
6910 -- End of outermost loop for bulk fetch
6911 -----------------------------------------------------------------------
6912
6913 IF l_rel_interface_csr%ISOPEN THEN
6914 CLOSE l_rel_interface_csr;
6915 END IF;
6916
6917
6918 --##count:add up last processed counts
6919 l_tot_rows_processed := l_tot_rows_processed + l_part_rows_processed;
6920 l_tot_rows_failed := l_tot_rows_failed + l_part_rows_failed;
6921 l_tot_rows_warned := l_tot_rows_warned + l_part_rows_warned;
6922 /*****************
6923 --Update Batch Process Table as a last step
6924 UPDATE OKC_ART_INT_BATPROCS_ALL
6925 SET
6926 TOTAL_ROWS_PROCESSED = l_tot_rows_processed,
6927 TOTAL_ROWS_FAILED = l_tot_rows_failed,
6928 TOTAL_ROWS_WARNED = l_tot_rows_warned,
6929 END_DATE = SYSDATE,
6930 PROGRAM_ID = l_program_id,
6931 REQUEST_ID = l_request_id,
6932 PROGRAM_LOGIN_ID = l_program_login_id,
6933 PROGRAM_APPLICATION_ID = l_program_appl_id,
6934 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
6935 LAST_UPDATED_BY = l_user_id,
6936 LAST_UPDATE_LOGIN = l_login_id,
6937 LAST_UPDATE_DATE = SYSDATE
6938 WHERE
6939 BATCH_PROCESS_ID = l_batch_process_id
6940 AND ENTITY = 'Relationship' ;
6941 *********************/
6942
6943 p_rows_processed := l_tot_rows_processed;
6944 p_rows_failed := l_tot_rows_failed;
6945 p_rows_warned := l_tot_rows_warned;
6946
6947 IF err_error_number_tbl.COUNT > 0 THEN
6948 insert_error_array(
6949 x_return_status => x_return_status,
6950 x_msg_count => x_msg_count,
6951 x_msg_data => x_msg_data
6952 );
6953 END IF;
6954
6955 -- Print statistic of this run in the log
6956 -- Commented for new XML Based Import - Moved to new_wrap_up in conc_import_articles
6957 --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');
6958 /*
6959 FND_MSG_PUB.initialize;
6960 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
6961 p_msg_name => 'OKC_ART_IMP_ERR');
6962
6963 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, FND_MSG_PUB.Get(1,p_encoded=>FND_API.G_FALSE));
6964
6965 FND_MSG_PUB.initialize;
6966 */
6967 commit; -- Final commit for status update
6968
6969 IF (l_debug = 'Y') THEN
6970 okc_debug.log('2000: Leaving relationships import', 2);
6971 END IF;
6972 --x_return_status := l_return_status; this may cause to erase error x_return_status
6973
6974 EXCEPTION
6975
6976 WHEN FND_API.G_EXC_ERROR THEN
6977 IF (l_debug = 'Y') THEN
6978 okc_debug.log('3000: Leaving Relationships_Import: OKC_API.G_EXCEPTION_ERROR Exception', 2);
6979 END IF;
6980 --Insert Errors into Error table if there is any
6981 insert_error_array(
6982 x_return_status => x_return_status,
6983 x_msg_count => x_msg_count,
6984 x_msg_data => x_msg_data
6985 );
6986 x_return_status := G_RET_STS_ERROR ;
6987
6988 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6989 IF (l_debug = 'Y') THEN
6990 okc_debug.log('4000: Leaving Relationships_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
6991 END IF;
6992 --Insert Errors into Error table if there is any
6993
6994 insert_error_array(
6995 x_return_status => x_return_status,
6996 x_msg_count => x_msg_count,
6997 x_msg_data => x_msg_data
6998 );
6999 commit;
7000
7001 IF l_rel_interface_csr%ISOPEN THEN
7002 CLOSE l_rel_interface_csr;
7003 END IF;
7004
7005 x_return_status := G_RET_STS_UNEXP_ERROR ;
7006 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
7007 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
7008 END IF;
7009 get_print_msgs_stack(p_msg_data => x_msg_data);
7010
7011 WHEN l_insert_errors_exception THEN
7012 --
7013 -- In this exception handling, we don't insert error array again
7014 -- because error happend in the module
7015 --
7016 IF (l_debug = 'Y') THEN
7017 okc_debug.log('5000: Leaving Relationships_Import because of EXCEPTION in insert_error_array: '||sqlerrm, 2);
7018 END IF;
7019
7020 IF l_rel_interface_csr%ISOPEN THEN
7021 CLOSE l_rel_interface_csr;
7022 END IF;
7023
7024
7025 --x_return_status := G_RET_STS_UNEXP_ERROR ;
7026 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
7027 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
7028 END IF;
7029 get_print_msgs_stack(p_msg_data => x_msg_data);
7030 commit;
7031
7032 WHEN OTHERS THEN
7033 IF (l_debug = 'Y') THEN
7034 okc_debug.log('5000: Leaving Relationships_Import because of EXCEPTION: '||sqlerrm, 2);
7035 END IF;
7036 --Insert Errors into Error table if there is any
7037 insert_error_array(
7038 x_return_status => x_return_status,
7039 x_msg_count => x_msg_count,
7040 x_msg_data => x_msg_data
7041 );
7042 commit;
7043 --
7044 IF l_rel_interface_csr%ISOPEN THEN
7045 CLOSE l_rel_interface_csr;
7046 END IF;
7047
7048 x_return_status := G_RET_STS_UNEXP_ERROR ;
7049 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
7050 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
7051 END IF;
7052 get_print_msgs_stack(p_msg_data => x_msg_data);
7053 END import_relationships;
7054
7055 PROCEDURE import_fnd_flex_value_sets(
7056 x_return_status OUT NOCOPY VARCHAR2,
7057 x_msg_count OUT NOCOPY NUMBER,
7058 x_msg_data OUT NOCOPY VARCHAR2,
7059
7060 p_batch_procs_id IN NUMBER,
7061 p_batch_number IN VARCHAR2,
7062 p_validate_only IN VARCHAR2 := 'Y',
7063 p_fetchsize IN NUMBER := 100
7064 ) IS
7065 l_api_version CONSTANT NUMBER := 1;
7066 l_api_name CONSTANT VARCHAR2(30) := 'import_fnd_flex_value_sets';
7067 l_sts_warning CONSTANT VARCHAR2(1) := 'W';
7068 l_row_notfound BOOLEAN := FALSE;
7069 l_user_id NUMBER;
7070 l_login_id NUMBER;
7071 l_insert_errors_exception EXCEPTION;
7072 l_insert_errors_error CONSTANT VARCHAR2(1) := 'X';
7073
7074 CURSOR l_valset_interface_csr ( cp_batch_number IN VARCHAR2) IS
7075 SELECT
7076 VSINT.INTERFACE_ID ,
7077 VSINT.BATCH_NUMBER ,
7078 VSINT.OBJECT_VERSION_NUMBER ,
7079 VSINT.FLEX_VALUE_SET_NAME ,
7080 VSINT.VALIDATION_TYPE ,
7081 VSINT.PROCESS_STATUS ,
7082 VSINT.ACTION ,
7083 VSINT.FORMAT_TYPE ,
7084 VSINT.MAXIMUM_SIZE ,
7085 VSINT.DESCRIPTION ,
7086 VSINT.MINIMUM_VALUE ,
7087 VSINT.MAXIMUM_VALUE ,
7088 VSINT.NUMBER_PRECISION ,
7089 VSINT.UPPERCASE_ONLY_FLAG ,
7090 VSINT.NUMBER_ONLY_FLAG
7091 FROM OKC_VALUESETS_INTERFACE VSINT
7092 WHERE nvl(PROCESS_STATUS,'*') NOT IN ('W', 'S')
7093 AND BATCH_NUMBER = cp_batch_number
7094 ORDER BY VSINT.FLEX_VALUE_SET_NAME ASC;
7095
7096 -- Flex Valuesets Interface Rows
7097
7098 TYPE l_vsinf_interface_id IS TABLE OF OKC_VALUESETS_INTERFACE.INTERFACE_ID%TYPE INDEX BY BINARY_INTEGER ;
7099 TYPE l_vsinf_batch_number IS TABLE OF OKC_VALUESETS_INTERFACE.BATCH_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
7100 TYPE l_vsinf_obj_ver_number IS TABLE OF OKC_VALUESETS_INTERFACE.OBJECT_VERSION_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
7101 TYPE l_vsinf_flex_value_set_name IS TABLE OF OKC_VALUESETS_INTERFACE.FLEX_VALUE_SET_NAME%TYPE INDEX BY BINARY_INTEGER ;
7102 TYPE l_vsinf_validation_type IS TABLE OF OKC_VALUESETS_INTERFACE.VALIDATION_TYPE%TYPE INDEX BY BINARY_INTEGER ;
7103 TYPE l_vsinf_process_status IS TABLE OF OKC_VALUESETS_INTERFACE.PROCESS_STATUS%TYPE INDEX BY BINARY_INTEGER ;
7104 TYPE l_vsinf_action IS TABLE OF OKC_VALUESETS_INTERFACE.ACTION%TYPE INDEX BY BINARY_INTEGER ;
7105 TYPE l_vsinf_format_type IS TABLE OF OKC_VALUESETS_INTERFACE.FORMAT_TYPE%TYPE INDEX BY BINARY_INTEGER ;
7106 TYPE l_vsinf_maximum_size IS TABLE OF OKC_VALUESETS_INTERFACE.MAXIMUM_SIZE%TYPE INDEX BY BINARY_INTEGER ;
7107 TYPE l_vsinf_description IS TABLE OF OKC_VALUESETS_INTERFACE.DESCRIPTION%TYPE INDEX BY BINARY_INTEGER ;
7108 TYPE l_vsinf_minimum_value IS TABLE OF OKC_VALUESETS_INTERFACE.MINIMUM_VALUE%TYPE INDEX BY BINARY_INTEGER ;
7109 TYPE l_vsinf_maximum_value IS TABLE OF OKC_VALUESETS_INTERFACE.MAXIMUM_VALUE%TYPE INDEX BY BINARY_INTEGER ;
7110 TYPE l_vsinf_number_precision IS TABLE OF OKC_VALUESETS_INTERFACE.NUMBER_PRECISION%TYPE INDEX BY BINARY_INTEGER ;
7111 TYPE l_vsinf_uppercase_only_flag IS TABLE OF OKC_VALUESETS_INTERFACE.UPPERCASE_ONLY_FLAG%TYPE INDEX BY BINARY_INTEGER ;
7112 TYPE l_vsinf_number_only_flag IS TABLE OF OKC_VALUESETS_INTERFACE.NUMBER_ONLY_FLAG%TYPE INDEX BY BINARY_INTEGER ;
7113
7114
7115
7116 l_return_status VARCHAR2(1);
7117 l_error_index NUMBER := 1;
7118 l_batch_process_id NUMBER := 1;
7119 l_context VARCHAR2(50) := NULL;
7120 l_init_msg_list VARCHAR2(200) := okc_api.g_true;
7121 l_tot_rows_processed NUMBER := 0;
7122 l_tot_rows_failed NUMBER := 0;
7123 l_tot_rows_warned NUMBER := 0;
7124 l_part_rows_processed NUMBER := 0;
7125 l_part_rows_failed NUMBER := 0;
7126 l_part_rows_warned NUMBER := 0;
7127 l_bulk_failed VARCHAR2(1) := 'Y';
7128
7129 -- Variables for flex value sets interface
7130 vsinf_interface_id_tbl l_vsinf_interface_id ;
7131 vsinf_batch_number_tbl l_vsinf_batch_number ;
7132 vsinf_obj_ver_number_tbl l_vsinf_obj_ver_number ;
7133 vsinf_flex_value_set_name_tbl l_vsinf_flex_value_set_name ;
7134 vsinf_validation_type_tbl l_vsinf_validation_type ;
7135 vsinf_process_status_tbl l_vsinf_process_status ;
7136 vsinf_action_tbl l_vsinf_action ;
7137 vsinf_format_type_tbl l_vsinf_format_type ;
7138 vsinf_maximum_size_tbl l_vsinf_maximum_size ;
7139 vsinf_description_tbl l_vsinf_description ;
7140 vsinf_minimum_value_tbl l_vsinf_minimum_value ;
7141 vsinf_maximum_value_tbl l_vsinf_maximum_value ;
7142 vsinf_number_precision_tbl l_vsinf_number_precision ;
7143 vsinf_uppercase_only_flag_tbl l_vsinf_uppercase_only_flag ;
7144 vsinf_number_only_flag_tbl l_vsinf_number_only_flag ;
7145
7146
7147 I NUMBER := 0;
7148 j NUMBER := 0;
7149 k NUMBER := 0;
7150 x NUMBER := 0;
7151 l_program_id OKC_VALUESETS_INTERFACE.PROGRAM_ID%TYPE;
7152 l_program_login_id OKC_VALUESETS_INTERFACE.PROGRAM_LOGIN_ID%TYPE;
7153 l_program_appl_id OKC_VALUESETS_INTERFACE.PROGRAM_APPLICATION_ID%TYPE;
7154 l_request_id OKC_VALUESETS_INTERFACE.REQUEST_ID%TYPE;
7155 l_tmp_return_status VARCHAR2(1) := G_RET_STS_SUCCESS;
7156
7157
7158 BEGIN
7159 IF (l_debug = 'Y') THEN
7160 okc_debug.log('100: Entered valueset_import', 2);
7161 END IF;
7162
7163
7164 ------------------------------------------------------------------------
7165 -- Variable Initialization
7166 -------------------------------------------------------------------------
7167
7168 -- Standard Start of API savepoint
7169 FND_MSG_PUB.initialize;
7170 -- Initialize API return status to success
7171 x_return_status := FND_API.G_RET_STS_SUCCESS;
7172 l_return_status := G_RET_STS_SUCCESS;
7173 -- Cache user_id, login_id and org_id
7174 l_user_id := Fnd_Global.user_id;
7175 l_login_id := Fnd_Global.login_id;
7176
7177 IF FND_GLOBAL.CONC_PROGRAM_ID = -1 THEN
7178 l_program_id := NULL;
7179 ELSE
7180 l_program_id := FND_GLOBAL.CONC_PROGRAM_ID;
7181 END IF;
7182
7183 IF FND_GLOBAL.CONC_LOGIN_ID = -1 THEN
7184 l_program_login_id := NULL;
7185 ELSE
7186 l_program_login_id := FND_GLOBAL.CONC_LOGIN_ID;
7187 END IF;
7188
7189 IF FND_GLOBAL.PROG_APPL_ID = -1 THEN
7190 l_program_appl_id := NULL;
7191 ELSE
7192 l_program_appl_id := FND_GLOBAL.PROG_APPL_ID;
7193 END IF;
7194
7195 IF FND_GLOBAL.CONC_REQUEST_ID = -1 THEN
7196 l_request_id := NULL;
7197 ELSE
7198 l_request_id := FND_GLOBAL.CONC_REQUEST_ID;
7199 END IF;
7200
7201
7202 l_batch_process_id := p_batch_procs_id;
7203 -------------------------------------------------------------------------
7204 --------------- the outermost loop of this procedure --------------------
7205 -- Bulk fetch all interface rows based on the fetchsize passedby the user
7206 -------------------------------------------------------------------------
7207
7208 l_context :='BULK FETCH FLEX VALUE SETS INTERFACE ROW';
7209 OPEN l_valset_interface_csr ( p_batch_number );
7210 LOOP
7211 BEGIN
7212 FETCH l_valset_interface_csr BULK COLLECT INTO
7213 vsinf_interface_id_tbl ,
7214 vsinf_batch_number_tbl ,
7215 vsinf_obj_ver_number_tbl ,
7216 vsinf_flex_value_set_name_tbl ,
7217 vsinf_validation_type_tbl ,
7218 vsinf_process_status_tbl ,
7219 vsinf_action_tbl ,
7220 vsinf_format_type_tbl ,
7221 vsinf_maximum_size_tbl ,
7222 vsinf_description_tbl ,
7223 vsinf_minimum_value_tbl ,
7224 vsinf_maximum_value_tbl ,
7225 vsinf_number_precision_tbl ,
7226 vsinf_uppercase_only_flag_tbl ,
7227 vsinf_number_only_flag_tbl LIMIT p_fetchsize;
7228 EXIT WHEN vsinf_interface_id_tbl.COUNT = 0 ;
7229
7230 ------------------------------------------------------------------------
7231 -- Variable initialization
7232 -------------------------------------------------------------------------
7233 --For each fetch, valueset variable table index should be initialized
7234 j := 1;
7235 --##count:initialization
7236 l_tot_rows_processed := l_tot_rows_processed+l_part_rows_processed;
7237 l_tot_rows_failed := l_tot_rows_failed+l_part_rows_failed;
7238 l_tot_rows_warned := l_tot_rows_warned+l_part_rows_warned;
7239 l_part_rows_processed := 0;
7240 l_part_rows_failed := 0;
7241 l_part_rows_warned := 0;
7242 l_bulk_failed := 'N';
7243 ---------------------------------------------------------------------------
7244 --------------------- Inner Loop thru fetched rows for---------------------
7245 -- validation, parse and validate article text, create a variable list
7246 -- prepare rows for DML if validate_only is 'N'
7247 /*** Processing Rule to set process_status
7248 Because we want to collect as much info as possible, we need to
7249 maintain process status while keeping the process moving.
7250 So, we'll set l_return_status as validation goes on and
7251 at the end we will set inf_process_status_tbl(i) with l_return_status
7252 for final result. However, we will get out of this process if there
7253 is a significant error such as 'U'.
7254 The return status examined
7255 -api_return_status : return status for api call
7256 -l_return_status : validation result of each row
7257 -x_return_status : final result status for concurrent program request
7258 Rule to set return status
7259 If api_return_status for api call is
7260 * 'S' then continue
7261 * 'W' and l_return_status not 'E' or 'U' then set l_return_status = 'W'
7262 and build_error_array then continue
7263 * 'E' and it is significant then set l_return_status = 'E' and raise
7264 Exception
7265 * 'E' and it is minor then set l_return_status = 'E' and continue. Raise
7266 'E' at the end of validation
7267 * 'U' then set l_return_status = 'U' and raise 'U' exception
7268 * At the end, if it goes thru with no Exception,
7269 Check if l_return_status is 'E' then raise Exception
7270 Otherwise (meaning l_return_status is 'S' or 'W'),
7271 vsinf_process_status_tbl(i) = l_return_status
7272 * In the exception, we will set
7273 vsinf_process_status_tbl(i) = l_return_status and build_error_array
7274 ***/
7275 -------------------------------------------------------------------------
7276
7277 FOR i in vsinf_interface_id_tbl.FIRST ..vsinf_interface_id_tbl.LAST LOOP
7278 BEGIN
7279 -- Increment total processed rows
7280 --##Count
7281 l_part_rows_processed := l_part_rows_processed+1;
7282 -- Initialization for each iteration
7283 l_row_notfound := FALSE;
7284 l_return_status := G_RET_STS_SUCCESS;
7285
7286 l_context := 'VALUE SETS VALIDATING';
7287
7288 -- To find duplicate value set in the batch
7289 IF i>1 THEN
7290 x := i-1;
7291 IF RTRIM(vsinf_flex_value_set_name_tbl(i)) = RTRIM(vsinf_flex_value_set_name_tbl(x))
7292 THEN
7293 Okc_Api.Set_Message(G_APP_NAME, 'OKC_VALSET_DUP_TITLE','VALUESET',vsinf_flex_value_set_name_tbl(i));
7294 l_return_status := G_RET_STS_ERROR;
7295 RAISE FND_API.G_EXC_ERROR;
7296 END IF;
7297 END IF;
7298 -- Logic to decide what to do in case of Action='S'
7299
7300 IF vsinf_action_tbl(i) = 'S' THEN
7301 vsinf_action_tbl(i) := 'N';
7302 END IF;
7303
7304
7305 IF vsinf_action_tbl(i) = 'N' THEN
7306
7307 --TRIM trailing space because
7308 vsinf_flex_value_set_name_tbl(i) := RTRIM(vsinf_flex_value_set_name_tbl(i));
7309 -- Need to do some defaulting logic
7310 IF vsinf_format_type_tbl(i) = 'N' THEN
7311 vsinf_number_only_flag_tbl(i) := 'Y';
7312 vsinf_uppercase_only_flag_tbl(i) := 'N';
7313 END IF;
7314 IF vsinf_format_type_tbl(i) = 'C' THEN
7315 vsinf_number_only_flag_tbl(i) := 'N';
7316 END IF;
7317 IF vsinf_format_type_tbl(i) in ('X','Y') THEN
7318 vsinf_uppercase_only_flag_tbl(i) := 'Y';
7319 END IF;
7320 IF vsinf_format_type_tbl(i) = 'X' THEN
7321 vsinf_maximum_size_tbl(i) := 11;
7322 END IF;
7323 IF vsinf_format_type_tbl(i) = 'Y' THEN
7324 vsinf_maximum_size_tbl(i) := 20;
7325 END IF;
7326
7327 ELSE
7328
7329 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7330 p_msg_name => 'OKC_VALSET_INV_IMP_ACTION');
7331 l_return_status := G_RET_STS_ERROR;
7332 RAISE FND_API.G_EXC_ERROR ;
7333 END IF;
7334
7335 -----------------------------------------------------------
7336 -- Common validation or attribute settting
7337 -- regardless of status and import action
7338 -- this validation is not included in validate api
7339 -----------------------------------------------------------
7340 -- Check if value set already exists in the System
7341
7342 IF Fnd_Flex_Val_Api.Valueset_Exists(vsinf_flex_value_set_name_tbl(i)) THEN
7343 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7344 p_msg_name => 'OKC_IMP_VALSET_EXIST',
7345 p_token1 => 'VALUESET',
7346 p_token1_value => vsinf_flex_value_set_name_tbl(i)
7347 );
7348 l_return_status := G_RET_STS_ERROR;
7349 --RAISE FND_API.G_EXC_ERROR ;
7350 END IF;
7351
7352 -- Check if format_type is set properly
7353 -- 'N' for Numeric
7354 -- 'C' for Character
7355 -- 'X' for Standard Date in Canonical Format YYYY/MM/DD
7356 -- 'Y' for Standard DateTime in Canonical Format YYYY/MM/DD HH24:MI:SS
7357 -- For Standard Date , Default Max size is 11
7358 -- For Standard DateTime , Default Max size is 12
7359
7360 IF nvl(vsinf_format_type_tbl(i),'*') not in ('N','C','X','Y') THEN
7361 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7362 p_msg_name => 'OKC_INVALID_FORMATTYPE');
7363 l_return_status := G_RET_STS_ERROR;
7364 END IF;
7365
7366 -- Check if Max Value and Min Value is passed then it is as per Format Type
7367 IF vsinf_minimum_value_tbl(i) IS NOT NULL THEN
7368 IF NOT is_value_valid(vsinf_format_type_tbl(i),vsinf_minimum_value_tbl(i)) THEN
7369 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7370 p_msg_name => 'OKC_INVALID_MINIMUM_VALUE');
7371 l_return_status := G_RET_STS_ERROR;
7372
7373 END IF;
7374 END IF;
7375
7376 IF vsinf_maximum_value_tbl(i) IS NOT NULL THEN
7377 IF NOT is_value_valid(vsinf_format_type_tbl(i),vsinf_maximum_value_tbl(i)) THEN
7378 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7379 p_msg_name => 'OKC_INVALID_MAXIMUM_VALUE');
7380 l_return_status := G_RET_STS_ERROR;
7381 END IF;
7382 END IF;
7383 -- Check Maximum Value is always greater than Mimium Value
7384 IF vsinf_minimum_value_tbl(i) IS NOT NULL AND
7385 vsinf_maximum_value_tbl(i) IS NOT NULL
7386 THEN
7387 IF vsinf_format_type_tbl(i) = 'N' THEN
7388 IF to_number(vsinf_minimum_value_tbl(i)) >=
7389 to_number(vsinf_maximum_value_tbl(i)) THEN
7390 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7391 p_msg_name => 'OKC_INVALID_RANGE');
7392 l_return_status := G_RET_STS_ERROR;
7393 END IF;
7394 ELSIF vsinf_format_type_tbl(i) = 'C' THEN
7395 IF vsinf_minimum_value_tbl(i) >= vsinf_maximum_value_tbl(i) THEN
7396 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7397 p_msg_name => 'OKC_INVALID_RANGE');
7398 l_return_status := G_RET_STS_ERROR;
7399 END IF;
7400 ELSIF vsinf_format_type_tbl(i) in ('X','Y') THEN
7401 IF to_date(vsinf_minimum_value_tbl(i),'YYYY/MM/DD HH24:MI:SS') >=
7402 to_date(vsinf_maximum_value_tbl(i),'YYYY/MM/DD HH24:MI:SS') THEN
7403 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7404 p_msg_name => 'OKC_INVALID_RANGE');
7405 l_return_status := G_RET_STS_ERROR;
7406 END IF;
7407
7408 END IF;
7409 END IF;
7410
7411 -- Check if uppercase_only_flag is set properly
7412 IF vsinf_uppercase_only_flag_tbl(i) not in ('Y','N') THEN
7413 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7414 p_msg_name => 'OKC_INVALID_UPPERCASE_FLAG');
7415 l_return_status := G_RET_STS_ERROR;
7416 END IF;
7417
7418 -- Check if number_only_flag is set properly
7419 IF vsinf_number_only_flag_tbl(i) not in ('Y','N') THEN
7420 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7421 p_msg_name => 'OKC_INVALID_NUMBERONLY_FLAG');
7422 l_return_status := G_RET_STS_ERROR;
7423 END IF;
7424
7425 -- Check if format_type and number_only_flag is set properly
7426 IF vsinf_format_type_tbl(i) = 'N' AND
7427 vsinf_number_only_flag_tbl(i) = 'N' THEN
7428 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7429 p_msg_name => 'OKC_INVALID_FORMATTYPE');
7430 l_return_status := G_RET_STS_ERROR;
7431 END IF;
7432
7433 -- Check if format_type and uppercase_only_flag is set properly
7434 IF vsinf_format_type_tbl(i) = 'N' AND
7435 vsinf_uppercase_only_flag_tbl(i) = 'Y' THEN
7436 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7437 p_msg_name => 'OKC_INVALID_FORMATTYPE');
7438 l_return_status := G_RET_STS_ERROR;
7439 END IF;
7440
7441 -- Check if format_type and number_only_flag is set properly
7442 IF vsinf_format_type_tbl(i) = 'C' AND
7443 (vsinf_uppercase_only_flag_tbl(i) = 'Y' AND
7444 vsinf_number_only_flag_tbl(i) = 'Y') THEN
7445 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7446 p_msg_name => 'OKC_INVALID_FORMATTYPE');
7447 l_return_status := G_RET_STS_ERROR;
7448 END IF;
7449
7450 -- Check if format_type and maximum_size is set properly
7451 IF vsinf_format_type_tbl(i) = 'C' AND
7452 vsinf_maximum_size_tbl(i) > 999 THEN
7453 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7454 p_msg_name => 'OKC_INVALID_MAXIMUMSIZE');
7455 l_return_status := G_RET_STS_ERROR;
7456 END IF;
7457
7458 -- Check if format_type and maximum_size is set properly
7459 IF vsinf_format_type_tbl(i) = 'N' AND
7460 vsinf_maximum_size_tbl(i) > 38 THEN
7461 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7462 p_msg_name => 'OKC_INVALID_MAXIMUMSIZE');
7463 l_return_status := G_RET_STS_ERROR;
7464 END IF;
7465
7466 IF ( vsinf_number_precision_tbl(i) IS NOT NULL AND
7467 vsinf_format_type_tbl(i) <> 'N') THEN
7468 vsinf_number_precision_tbl(i) := NULL;
7469 END IF;
7470 /*
7471 -- Check if alphanumeric_allowed_flag is set properly
7472 IF nvl(vsinf_alphanumeric_allowed_flag_tbl(i), '*') not in ('Y','N') THEN
7473 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7474 p_msg_name => 'OKC_INVALID_ALPHANUMERIC_FLAG');
7475 l_return_status := G_RET_STS_ERROR;
7476 END IF;
7477 */
7478 -- Check if Validation Type is 'Independent' or 'None'
7479 IF nvl(vsinf_validation_type_tbl(i), '*') not in ('I','N') THEN
7480 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7481 p_msg_name => 'OKC_INVALID_VALIDATION_TYPE');
7482 l_return_status := G_RET_STS_ERROR;
7483 END IF;
7484
7485 ------------------------------------------------------------------------
7486 -- Now that we have validated and data is clean we can fetch sequences and ids
7487 -- for new relationships for DML and also set the process status to Success
7488 -------------------------------------------------------------------------
7489
7490 -- Summarize report for this row
7491 -- Status 'F' is for internal use meaning parsing failure marked in
7492 -- java concurrent program
7493 IF (l_return_status = G_RET_STS_SUCCESS) THEN
7494 IF (nvl(vsinf_process_status_tbl(i), 'E') = 'E') THEN
7495 vsinf_process_status_tbl(i) := G_RET_STS_SUCCESS;
7496 ELSIF ( vsinf_process_status_tbl(i) = 'F') THEN
7497 -- ##count parser failure as error
7498 --l_tot_rows_failed := l_tot_rows_failed+1;
7499 l_part_rows_failed := l_part_rows_failed+1;
7500 vsinf_process_status_tbl(i) := G_RET_STS_ERROR;
7501 END IF;
7502 ELSIF (l_return_status = l_sts_warning) THEN
7503 IF (nvl(vsinf_process_status_tbl(i),'E') = 'E') THEN
7504 vsinf_process_status_tbl(i) := l_sts_warning;
7505 --##count
7506 --l_tot_rows_warned := l_tot_rows_warned+1;
7507 l_part_rows_warned := l_part_rows_warned+1;
7508 ELSIF (vsinf_process_status_tbl(i) = 'F') THEN
7509 -- ##count parser failure as error
7510 --l_tot_rows_failed := l_tot_rows_failed+1;
7511 l_part_rows_failed := l_part_rows_failed+1;
7512 vsinf_process_status_tbl(i) := G_RET_STS_ERROR;
7513 END IF;
7514 ELSIF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
7515 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7516 ELSIF (l_return_status = G_RET_STS_ERROR) THEN
7517 RAISE FND_API.G_EXC_ERROR;
7518 END IF;
7519
7520 -------------------------
7521 -------------------------
7522 -- Exception Block for each iteration in Loop
7523 -- validation and unexpected errors
7524 -- In case of unexpected error, escape the loop
7525 -------------------------
7526 -------------------------
7527
7528
7529 EXCEPTION
7530 WHEN FND_API.G_EXC_ERROR THEN
7531 IF (l_debug = 'Y') THEN
7532 okc_debug.log('300: In Fnd_flex_value_sets_Import: OKC_API.G_EXCEPTION_ERROR Exception', 2);
7533 END IF;
7534 --l_return_status := G_RET_STS_ERROR ;
7535 build_error_array(
7536 p_msg_data => x_msg_data,
7537 p_context => l_context,
7538 p_batch_process_id => l_batch_process_id,
7539 p_interface_id => vsinf_interface_id_tbl(i),
7540 p_article_title => vsinf_flex_value_set_name_tbl(i),
7541 p_error_type => G_RET_STS_ERROR,
7542 p_entity => 'VALUESET'
7543 );
7544 vsinf_process_status_tbl(i) := G_RET_STS_ERROR;
7545 --##count
7546 --l_tot_rows_failed := l_tot_rows_failed+1;
7547 l_part_rows_failed := l_part_rows_failed+1;
7548 -- Continue to next row
7549
7550 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7551 IF (l_debug = 'Y') THEN
7552 okc_debug.log('400: Leaving Fnd_flex_value_sets_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
7553 END IF;
7554
7555 IF l_valset_interface_csr%ISOPEN THEN
7556 CLOSE l_valset_interface_csr;
7557 END IF;
7558
7559 --Set_Message
7560 l_return_status := G_RET_STS_UNEXP_ERROR ;
7561 x_return_status := G_RET_STS_UNEXP_ERROR ;
7562
7563 build_error_array(
7564 p_msg_data => x_msg_data,
7565 p_context => l_context,
7566 p_batch_process_id => l_batch_process_id,
7567 p_interface_id => vsinf_interface_id_tbl(i),
7568 p_article_title => vsinf_flex_value_set_name_tbl(i),
7569 p_error_type => G_RET_STS_UNEXP_ERROR,
7570 p_entity => 'VALUESET'
7571 );
7572 vsinf_process_status_tbl(i) := G_RET_STS_ERROR;
7573 --##count
7574 --l_tot_rows_failed := l_tot_rows_failed+1;
7575 l_part_rows_failed := l_part_rows_failed+1;
7576 exit; -- exit the current fetch
7577
7578 WHEN OTHERS THEN
7579 IF (l_debug = 'Y') THEN
7580 okc_debug.log('500: Leaving Fnd_flex_value_sets_Import because of EXCEPTION: '||sqlerrm, 2);
7581 END IF;
7582
7583 IF l_valset_interface_csr%ISOPEN THEN
7584 CLOSE l_valset_interface_csr;
7585 END IF;
7586
7587 l_return_status := G_RET_STS_UNEXP_ERROR ;
7588 x_return_status := G_RET_STS_UNEXP_ERROR ;
7589
7590 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7591 p_msg_name => G_UNEXPECTED_ERROR,
7592 p_token1 => G_SQLCODE_TOKEN,
7593 p_token1_value => sqlcode,
7594 p_token2 => G_SQLERRM_TOKEN,
7595 p_token2_value => sqlerrm);
7596
7597 build_error_array(
7598 p_msg_data => G_UNEXPECTED_ERROR,
7599 p_context => l_context,
7600 p_batch_process_id => l_batch_process_id,
7601 p_interface_id => vsinf_interface_id_tbl(i),
7602 p_article_title => vsinf_flex_value_set_name_tbl(i),
7603 p_error_type => G_RET_STS_ERROR,
7604 p_entity => 'VALUESET'
7605 );
7606 vsinf_process_status_tbl(i) := G_RET_STS_ERROR;
7607 --##count
7608 --l_tot_rows_failed := l_tot_rows_failed+1;
7609 l_part_rows_failed := l_part_rows_failed+1;
7610 exit; -- exit the current fetch
7611 END;
7612 -------------------------
7613 -------------------------
7614 -- Exception Block for each iteration in Loop ends
7615 -------------------------
7616 -------------------------
7617
7618
7619 END LOOP; -- end of FOR i in inf_interface_id_tbl.FIRST ..
7620 ------------------------------------------------------------------------
7621 -------------- End of Inner Loop thru fetched row for---------------------
7622 -- validation
7623 -------------------------------------------------------------------------
7624 -- In order to propagate Unexpected error raise it if it is 'U'
7625 IF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
7626 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
7627 END IF;
7628
7629 -------------------------
7630 -------------------------
7631 -- Exception Block for Inner Loop starts
7632 -- Handles unexpected errors as last step
7633 -------------------------
7634 -------------------------
7635 EXCEPTION
7636 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7637 IF (l_debug = 'Y') THEN
7638 okc_debug.log('400: Leaving Fnd_flex_value_sets_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
7639 END IF;
7640
7641 IF l_valset_interface_csr%ISOPEN THEN
7642 CLOSE l_valset_interface_csr;
7643 END IF;
7644 l_return_status := G_RET_STS_UNEXP_ERROR ;
7645 x_return_status := G_RET_STS_UNEXP_ERROR ;
7646 exit; -- exit outermost loop
7647
7648 WHEN OTHERS THEN
7649 IF (l_debug = 'Y') THEN
7650 okc_debug.log('500: Leaving Fnd_flex_value_sets_Import because of EXCEPTION: '||sqlerrm, 2);
7651 END IF;
7652
7653 IF l_valset_interface_csr%ISOPEN THEN
7654 CLOSE l_valset_interface_csr;
7655 END IF;
7656 l_return_status := G_RET_STS_UNEXP_ERROR ;
7657 x_return_status := G_RET_STS_UNEXP_ERROR ;
7658 exit; -- exit outermost loop
7659 END;
7660
7661 -------------------------
7662 -------------------------
7663 -- Exception Block for Each Iteration of outermost Loop ends
7664 -------------------------
7665 -------------------------
7666
7667 ------------------------------------------------------------------------
7668 --------------------- Start Do_DML for Fnd Flex Value Sets ---------------
7669 -- Insert Fnd Flex Value Sets
7670 -------------------------------------------------------------------------
7671 -- initialize l_return_status to track status of DML execution
7672 l_return_status := G_RET_STS_SUCCESS;
7673
7674
7675 IF p_validate_only = 'N' THEN
7676 BEGIN
7677 SAVEPOINT bulkdml;
7678
7679 i := 0;
7680 -- Bulk insert New Valid Records
7681 BEGIN
7682 l_context := 'INSERTING NEW VALUESETS INTO TABLE';
7683 FOR i in vsinf_interface_id_tbl.FIRST ..vsinf_interface_id_tbl.LAST LOOP
7684
7685 IF vsinf_action_tbl(i) = 'N' AND vsinf_process_status_tbl(i) in ('S','W') THEN
7686 IF vsinf_validation_type_tbl(i) = 'N' THEN
7687
7688 -- Set the Session Mode
7689 FND_FLEX_VAL_API.SET_SESSION_MODE('customer_data');
7690
7691 -- Call the API to create value set
7692 FND_FLEX_VAL_API.CREATE_VALUESET_NONE(
7693 VALUE_SET_NAME => vsinf_flex_value_set_name_tbl(i),
7694 DESCRIPTION => vsinf_description_tbl(i),
7695 SECURITY_AVAILABLE => 'N',
7696 ENABLE_LONGLIST => 'N',
7697 FORMAT_TYPE => vsinf_format_type_tbl(i),
7698 MAXIMUM_SIZE => vsinf_maximum_size_tbl(i),
7699 NUMBERS_ONLY => vsinf_number_only_flag_tbl(i),
7700 UPPERCASE_ONLY => vsinf_uppercase_only_flag_tbl(i),
7701 RIGHT_JUSTIFY_ZERO_FILL => 'N',
7702 MIN_VALUE => vsinf_minimum_value_tbl(i),
7703 MAX_VALUE => vsinf_maximum_value_tbl(i),
7704 PRECISION => vsinf_number_precision_tbl(i));
7705
7706 ELSIF vsinf_validation_type_tbl(i) = 'I' THEN
7707
7708 -- Set the Session Mode
7709 FND_FLEX_VAL_API.SET_SESSION_MODE('customer_data');
7710
7711 -- Call the API to create value set
7712 FND_FLEX_VAL_API.CREATE_VALUESET_INDEPENDENT(
7713 VALUE_SET_NAME => vsinf_flex_value_set_name_tbl(i),
7714 DESCRIPTION => vsinf_description_tbl(i),
7715 SECURITY_AVAILABLE => 'N',
7716 ENABLE_LONGLIST => 'N',
7717 FORMAT_TYPE => vsinf_format_type_tbl(i),
7718 MAXIMUM_SIZE => vsinf_maximum_size_tbl(i),
7719 NUMBERS_ONLY => vsinf_number_only_flag_tbl(i),
7720 UPPERCASE_ONLY => vsinf_uppercase_only_flag_tbl(i),
7721 RIGHT_JUSTIFY_ZERO_FILL => 'N',
7722 MIN_VALUE => vsinf_minimum_value_tbl(i),
7723 MAX_VALUE => vsinf_maximum_value_tbl(i),
7724 PRECISION => vsinf_number_precision_tbl(i));
7725
7726 END IF;
7727 END IF;
7728 END LOOP;
7729
7730 EXCEPTION
7731 WHEN OTHERS THEN
7732 IF (l_debug = 'Y') THEN
7733 okc_debug.log('500: Leaving Fnd_flex_value_sets_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
7734 END IF;
7735 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
7736 END;
7737
7738 --
7739 -- End of Insert into FND FLEX VALUE SETS
7740 --
7741 --
7742
7743
7744 -- Exception for bulk DML block
7745 EXCEPTION
7746 WHEN OTHERS THEN
7747 l_bulk_failed := 'Y'; -- indicating that bulk operation has failed
7748 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7749 p_msg_name => G_UNEXPECTED_ERROR,
7750 p_token1 => G_SQLCODE_TOKEN,
7751 p_token1_value => sqlcode,
7752 p_token2 => G_SQLERRM_TOKEN,
7753 p_token2_value => sqlerrm);
7754 Okc_API.Set_Message(p_app_name => G_APP_NAME,
7755 p_msg_name => 'OKC_ART_FETCH_FAILED',
7756 p_token1 => 'CONTEXT',
7757 p_token1_value => l_context);
7758
7759 build_error_array(
7760 p_msg_data => null,
7761 p_context => l_context,
7762 p_batch_process_id => l_batch_process_id,
7763 p_interface_id => -99,
7764 p_article_title => NULL,
7765 p_error_type => G_RET_STS_ERROR,
7766 p_entity => 'VALUESET'
7767 );
7768 l_return_status := G_RET_STS_UNEXP_ERROR;
7769 x_return_status := G_RET_STS_UNEXP_ERROR;
7770
7771 --##count:rollback the count
7772 l_part_rows_failed := l_part_rows_processed;
7773 l_part_rows_warned := 0;
7774
7775 ROLLBACK TO SAVEPOINT bulkdml;
7776 exit; -- exit outermost loop
7777 END;
7778
7779 END IF; --- validate_only = 'N'
7780
7781 ------------------------------------------------------------------------
7782 --------------------- End of Do_DML for Value sets ---------------
7783 -------------------------------------------------------------------------
7784
7785 ------------------------------------------------------------------------
7786 --------------- Start of Do_DML for import related tables ------------
7787 -- Update interface table
7788 -- Insert Errors into Error table
7789 -------------------------------------------------------------------------
7790 -- Update Interface Table
7791 i:=0;
7792 BEGIN
7793 l_context := 'UPDATING VALUE SETS INTERFACE TABLE';
7794 FORALL i in vsinf_interface_id_tbl.FIRST..vsinf_interface_id_tbl.LAST
7795 UPDATE OKC_VALUESETS_INTERFACE
7796 SET
7797 -- We don't want to update process_status to 'S' or 'W' in validation_mode
7798 -- because it is not going to be picked up in next run if we do so
7799 PROCESS_STATUS = decode(p_validate_only||vsinf_process_status_tbl(i)||l_bulk_failed,
7800 'NEN','E',
7801 'NSN','S',
7802 'NWN','W',
7803 'NEY','E',
7804 'NSY',NULL,
7805 'NWY',NULL,
7806 'YEY','E',
7807 'YEN','E',
7808 'NFY','E',
7809 'YFY','E',
7810 'NFN','E',
7811 'YFN','E',NULL),
7812 PROGRAM_ID = l_program_id,
7813 REQUEST_ID = l_request_id,
7814 PROGRAM_LOGIN_ID = l_program_login_id,
7815 PROGRAM_APPLICATION_ID = l_program_appl_id,
7816 OBJECT_VERSION_NUMBER = vsinf_obj_ver_number_tbl(i) + 1,
7817 LAST_UPDATED_BY = l_user_id,
7818 LAST_UPDATE_LOGIN = l_login_id,
7819 LAST_UPDATE_DATE = SYSDATE
7820 WHERE
7821 interface_id = vsinf_interface_id_tbl(i);
7822 EXCEPTION
7823 WHEN OTHERS THEN
7824 IF (l_debug = 'Y') THEN
7825 okc_debug.log('500: Leaving Fnd_flex_value_sets_Import because of EXCEPTION: '||sqlerrm, 2);
7826 END IF;
7827
7828 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
7829 p_msg_name => G_UNEXPECTED_ERROR,
7830 p_token1 => G_SQLCODE_TOKEN,
7831 p_token1_value => sqlcode,
7832 p_token2 => G_SQLERRM_TOKEN,
7833 p_token2_value => sqlerrm);
7834 Okc_API.Set_Message(p_app_name => G_APP_NAME,
7835 p_msg_name => 'OKC_VALSET_INT_UPDATE_FAILED');
7836
7837 build_error_array(
7838 p_msg_data => null,
7839 p_context => l_context,
7840 p_batch_process_id => l_batch_process_id,
7841 p_interface_id => -99,
7842 p_article_title => NULL,
7843 p_error_type => G_RET_STS_ERROR,
7844 p_entity => 'VALUESET'
7845 );
7846
7847 l_return_status := G_RET_STS_UNEXP_ERROR ;
7848 x_return_status := G_RET_STS_UNEXP_ERROR ;
7849 --##count:rollback the count
7850 l_part_rows_failed := l_part_rows_processed;
7851 l_part_rows_warned := 0;
7852
7853 --RAISE FND_API.G_EXC_ERROR ;
7854 END;
7855 --
7856 -- End of Update OKC_VALUESETS_INTERFACE
7857 --
7858 --
7859
7860 --
7861 --Insert Errors into Error table for this fetch
7862 --
7863 insert_error_array(
7864 x_return_status => x_return_status,
7865 x_msg_count => x_msg_count,
7866 x_msg_data => x_msg_data
7867 );
7868
7869
7870 IF (x_return_status = l_insert_errors_error) THEN
7871 NULL;
7872 -- Ignore
7873 -- RAISE l_insert_errors_exception;
7874 END IF;
7875
7876 ------------------------------------------------------------------------
7877 --------------- End of Do_DML for import related tables ------------
7878 -------------------------------------------------------------------------
7879 commit;
7880
7881 -- Now delete cache for next bulk fetch
7882
7883 vsinf_interface_id_tbl.DELETE;
7884 vsinf_batch_number_tbl.DELETE;
7885 vsinf_obj_ver_number_tbl.DELETE;
7886 vsinf_flex_value_set_name_tbl.DELETE;
7887 vsinf_validation_type_tbl.DELETE;
7888 vsinf_process_status_tbl.DELETE;
7889 vsinf_action_tbl.DELETE;
7890 vsinf_format_type_tbl.DELETE;
7891 vsinf_maximum_size_tbl.DELETE;
7892 vsinf_description_tbl.DELETE;
7893 vsinf_minimum_value_tbl.DELETE;
7894 vsinf_maximum_value_tbl.DELETE;
7895 vsinf_number_precision_tbl.DELETE;
7896 vsinf_uppercase_only_flag_tbl.DELETE;
7897 vsinf_number_only_flag_tbl.DELETE;
7898
7899 err_batch_process_id_tbl.DELETE;
7900 err_article_title_tbl.DELETE;
7901 err_interface_id_tbl.DELETE;
7902 err_error_number_tbl.DELETE;
7903 err_object_version_number_tbl.DELETE;
7904 err_error_type_tbl.DELETE;
7905 err_entity_tbl.DELETE;
7906 err_error_description_tbl.DELETE;
7907
7908 EXIT WHEN l_valset_interface_csr%NOTFOUND;
7909 END LOOP;
7910
7911
7912 -----------------------------------------------------------------------
7913 -- End of outermost loop for bulk fetch
7914 -----------------------------------------------------------------------
7915
7916 IF l_valset_interface_csr%ISOPEN THEN
7917 CLOSE l_valset_interface_csr;
7918 END IF;
7919
7920
7921 --##count:add up last processed counts
7922 l_tot_rows_processed := l_tot_rows_processed + l_part_rows_processed;
7923 l_tot_rows_failed := l_tot_rows_failed + l_part_rows_failed;
7924 l_tot_rows_warned := l_tot_rows_warned + l_part_rows_warned;
7925
7926 --Update Batch Process Table as a last step
7927 UPDATE OKC_ART_INT_BATPROCS_ALL
7928 SET
7929 TOTAL_ROWS_PROCESSED = l_tot_rows_processed,
7930 TOTAL_ROWS_FAILED = l_tot_rows_failed,
7931 TOTAL_ROWS_WARNED = l_tot_rows_warned,
7932 END_DATE = SYSDATE,
7933 PROGRAM_ID = l_program_id,
7934 REQUEST_ID = l_request_id,
7935 PROGRAM_LOGIN_ID = l_program_login_id,
7936 PROGRAM_APPLICATION_ID = l_program_appl_id,
7937 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
7938 LAST_UPDATED_BY = l_user_id,
7939 LAST_UPDATE_LOGIN = l_login_id,
7940 LAST_UPDATE_DATE = SYSDATE
7941 WHERE
7942 BATCH_PROCESS_ID = l_batch_process_id
7943 AND ENTITY = 'Valueset';
7944 IF err_error_number_tbl.COUNT > 0 THEN
7945 insert_error_array(
7946 x_return_status => x_return_status,
7947 x_msg_count => x_msg_count,
7948 x_msg_data => x_msg_data
7949 );
7950 END IF;
7951
7952 -- Print statistic of this run in the log
7953 -- Commented for new XML Based Import - Moved to new_wrap_up in conc_import_articles
7954 --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');
7955 commit; -- Final commit for status update
7956
7957 IF (l_debug = 'Y') THEN
7958 okc_debug.log('2000: Leaving Fnd_flex_value_sets import', 2);
7959 END IF;
7960 --x_return_status := l_return_status; this may cause to erase error x_return_status
7961
7962 EXCEPTION
7963
7964 WHEN FND_API.G_EXC_ERROR THEN
7965 IF (l_debug = 'Y') THEN
7966 okc_debug.log('3000: Leaving Fnd_flex_value_sets_Import: OKC_API.G_EXCEPTION_ERROR Exception', 2);
7967 END IF;
7968 --Insert Errors into Error table if there is any
7969 insert_error_array(
7970 x_return_status => x_return_status,
7971 x_msg_count => x_msg_count,
7972 x_msg_data => x_msg_data
7973 );
7974 x_return_status := G_RET_STS_ERROR ;
7975
7976 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7977 IF (l_debug = 'Y') THEN
7978 okc_debug.log('4000: Leaving Fnd_flex_value_sets_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
7979 END IF;
7980 --Insert Errors into Error table if there is any
7981
7982 insert_error_array(
7983 x_return_status => x_return_status,
7984 x_msg_count => x_msg_count,
7985 x_msg_data => x_msg_data
7986 );
7987 commit;
7988
7989 IF l_valset_interface_csr%ISOPEN THEN
7990 CLOSE l_valset_interface_csr;
7991 END IF;
7992
7993 x_return_status := G_RET_STS_UNEXP_ERROR ;
7994 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
7995 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
7996 END IF;
7997 get_print_msgs_stack(p_msg_data => x_msg_data);
7998
7999 WHEN l_insert_errors_exception THEN
8000 --
8001 -- In this exception handling, we don't insert error array again
8002 -- because error happend in the module
8003 --
8004 IF (l_debug = 'Y') THEN
8005 okc_debug.log('5000: Leaving Fnd_flex_value_sets_Import because of EXCEPTION in insert_error_array: '||sqlerrm, 2);
8006 END IF;
8007
8008 IF l_valset_interface_csr%ISOPEN THEN
8009 CLOSE l_valset_interface_csr;
8010 END IF;
8011
8012
8013 --x_return_status := G_RET_STS_UNEXP_ERROR ;
8014 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
8015 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
8016 END IF;
8017 get_print_msgs_stack(p_msg_data => x_msg_data);
8018 commit;
8019
8020 WHEN OTHERS THEN
8021 IF (l_debug = 'Y') THEN
8022 okc_debug.log('5000: Leaving Fnd_flex_value_sets_Import because of EXCEPTION: '||sqlerrm, 2);
8023 END IF;
8024 --Insert Errors into Error table if there is any
8025 insert_error_array(
8026 x_return_status => x_return_status,
8027 x_msg_count => x_msg_count,
8028 x_msg_data => x_msg_data
8029 );
8030 commit;
8031 --
8032 IF l_valset_interface_csr%ISOPEN THEN
8033 CLOSE l_valset_interface_csr;
8034 END IF;
8035
8036 x_return_status := G_RET_STS_UNEXP_ERROR ;
8037 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
8038 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
8039 END IF;
8040 get_print_msgs_stack(p_msg_data => x_msg_data);
8041 END import_fnd_flex_value_sets;
8042
8043 PROCEDURE import_fnd_flex_values(
8044 x_return_status OUT NOCOPY VARCHAR2,
8045 x_msg_count OUT NOCOPY NUMBER,
8046 x_msg_data OUT NOCOPY VARCHAR2,
8047
8048 p_batch_procs_id IN NUMBER,
8049 p_batch_number IN VARCHAR2,
8050 p_validate_only IN VARCHAR2 := 'Y',
8051 p_fetchsize IN NUMBER := 100
8052 ) IS
8053 l_api_version CONSTANT NUMBER := 1;
8054 l_api_name CONSTANT VARCHAR2(30) := 'import_fnd_flex_values';
8055 l_sts_warning CONSTANT VARCHAR2(1) := 'W';
8056 l_row_notfound BOOLEAN := FALSE;
8057 l_user_id NUMBER;
8058 l_login_id NUMBER;
8059 l_insert_errors_exception EXCEPTION;
8060 l_insert_errors_error CONSTANT VARCHAR2(1) := 'X';
8061
8062 CURSOR l_val_interface_csr ( cp_batch_number IN VARCHAR2) IS
8063 SELECT
8064 VINT.INTERFACE_ID ,
8065 VINT.BATCH_NUMBER ,
8066 VINT.OBJECT_VERSION_NUMBER ,
8067 VINT.FLEX_VALUE_SET_NAME ,
8068 VINT.FLEX_VALUE ,
8069 VINT.PROCESS_STATUS ,
8070 VINT.ACTION ,
8071 VINT.ENABLED_FLAG ,
8072 VINT.START_DATE_ACTIVE ,
8073 VINT.END_DATE_ACTIVE ,
8074 VINT.LANGUAGE ,
8075 VINT.DESCRIPTION ,
8076 VINT.FLEX_VALUE_MEANING ,
8077 VS.FLEX_VALUE_SET_ID ,
8078 VS.VALIDATION_TYPE ,
8079 VS.FORMAT_TYPE ,
8080 VS.MAXIMUM_SIZE ,
8081 VS.NUMBER_PRECISION ,
8082 VS.ALPHANUMERIC_ALLOWED_FLAG,
8083 VS.UPPERCASE_ONLY_FLAG ,
8084 VS.NUMERIC_MODE_ENABLED_FLAG,
8085 VS.MINIMUM_VALUE ,
8086 VS.MAXIMUM_VALUE ,
8087 TO_NUMBER(NULL) FLEX_VALUE_ID
8088 FROM OKC_VS_VALUES_INTERFACE VINT,FND_FLEX_VALUE_SETS VS
8089 WHERE VINT.FLEX_VALUE_SET_NAME = VS.FLEX_VALUE_SET_NAME
8090 AND nvl(PROCESS_STATUS,'*') NOT IN ('W', 'S')
8091 AND BATCH_NUMBER = cp_batch_number
8092 UNION ALL
8093 SELECT
8094 VINT.INTERFACE_ID ,
8095 VINT.BATCH_NUMBER ,
8096 VINT.OBJECT_VERSION_NUMBER ,
8097 VINT.FLEX_VALUE_SET_NAME ,
8098 VINT.FLEX_VALUE ,
8099 VINT.PROCESS_STATUS ,
8100 VINT.ACTION ,
8101 VINT.ENABLED_FLAG ,
8102 VINT.START_DATE_ACTIVE ,
8103 VINT.END_DATE_ACTIVE ,
8104 VINT.LANGUAGE ,
8105 VINT.DESCRIPTION ,
8106 VINT.FLEX_VALUE_MEANING ,
8107 TO_NUMBER(NULL) FLEX_VALUE_SET_ID ,
8108 VS.VALIDATION_TYPE ,
8109 VS.FORMAT_TYPE ,
8110 VS.MAXIMUM_SIZE ,
8111 VS.NUMBER_PRECISION ,
8112 TO_CHAR(NULL) ALPHANUMERIC_ALLOWED_FLAG,
8113 VS.UPPERCASE_ONLY_FLAG ,
8114 VS.NUMBER_ONLY_FLAG NUMERIC_MODE_ENABLED_FLAG,
8115 VS.MINIMUM_VALUE ,
8116 VS.MAXIMUM_VALUE ,
8117 TO_NUMBER(NULL) FLEX_VALUE_ID
8118 FROM OKC_VS_VALUES_INTERFACE VINT,OKC_VALUESETS_INTERFACE VS
8119 WHERE VINT.FLEX_VALUE_SET_NAME = VS.FLEX_VALUE_SET_NAME (+)
8120 AND VINT.BATCH_NUMBER = VS.BATCH_NUMBER (+)
8121 AND nvl(VS.PROCESS_STATUS,'*') NOT IN ('E')
8122 AND VINT.BATCH_NUMBER = cp_batch_number
8123 AND NOT EXISTS
8124 ( SELECT 1 FROM FND_FLEX_VALUE_SETS FVS
8125 WHERE FVS.FLEX_VALUE_SET_NAME = VINT.FLEX_VALUE_SET_NAME)
8126 ORDER BY FLEX_VALUE_SET_NAME,FLEX_VALUE ASC;
8127
8128
8129 CURSOR l_val_exist_csr ( l_flex_value IN VARCHAR2, l_flex_value_set_id IN NUMBER ) IS
8130 SELECT
8131 B.FLEX_VALUE_SET_ID ,
8132 B.FLEX_VALUE_ID ,
8133 B.FLEX_VALUE ,
8134 B.START_DATE_ACTIVE ,
8135 B.END_DATE_ACTIVE
8136 FROM FND_FLEX_VALUES B,FND_FLEX_VALUES_TL T
8137 WHERE B.FLEX_VALUE_ID = T.FLEX_VALUE_ID
8138 AND T.LANGUAGE = userenv('LANG')
8139 AND B.FLEX_VALUE = l_flex_value
8140 AND B.FLEX_VALUE_SET_ID = l_flex_value_set_id;
8141
8142 -- Cursor to check valueset in the valueset interface Table
8143 CURSOR valset_exists_csr (cp_vs_name IN VARCHAR2,
8144 cp_batch_number IN VARCHAR2) IS
8145 SELECT '1'
8146 FROM OKC_VALUESETS_INTERFACE
8147 WHERE flex_value_set_name = cp_vs_name
8148 AND batch_number = cp_batch_number
8149 AND nvl(process_status,'X') not in ('E');
8150
8151
8152 -- Flex Values Interface Rows
8153
8154 TYPE l_vinf_interface_id IS TABLE OF OKC_VS_VALUES_INTERFACE.INTERFACE_ID%TYPE INDEX BY BINARY_INTEGER ;
8155 TYPE l_vinf_batch_number IS TABLE OF OKC_VS_VALUES_INTERFACE.BATCH_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
8156 TYPE l_vinf_obj_ver_number IS TABLE OF OKC_VS_VALUES_INTERFACE.OBJECT_VERSION_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
8157 TYPE l_vinf_flex_value_set_name IS TABLE OF OKC_VS_VALUES_INTERFACE.FLEX_VALUE_SET_NAME%TYPE INDEX BY BINARY_INTEGER ;
8158 TYPE l_vinf_flex_value IS TABLE OF OKC_VS_VALUES_INTERFACE.FLEX_VALUE%TYPE INDEX BY BINARY_INTEGER ;
8159 TYPE l_vinf_process_status IS TABLE OF OKC_VS_VALUES_INTERFACE.PROCESS_STATUS%TYPE INDEX BY BINARY_INTEGER ;
8160 TYPE l_vinf_action IS TABLE OF OKC_VS_VALUES_INTERFACE.ACTION%TYPE INDEX BY BINARY_INTEGER ;
8161 TYPE l_vinf_enabled_flag IS TABLE OF OKC_VS_VALUES_INTERFACE.ENABLED_FLAG%TYPE INDEX BY BINARY_INTEGER ;
8162 TYPE l_vinf_start_date_active IS TABLE OF OKC_VS_VALUES_INTERFACE.START_DATE_ACTIVE%TYPE INDEX BY BINARY_INTEGER ;
8163 TYPE l_vinf_end_date_active IS TABLE OF OKC_VS_VALUES_INTERFACE.END_DATE_ACTIVE%TYPE INDEX BY BINARY_INTEGER ;
8164 TYPE l_vinf_language IS TABLE OF OKC_VS_VALUES_INTERFACE.LANGUAGE%TYPE INDEX BY BINARY_INTEGER ;
8165 TYPE l_vinf_description IS TABLE OF OKC_VS_VALUES_INTERFACE.DESCRIPTION%TYPE INDEX BY BINARY_INTEGER ;
8166 TYPE l_vinf_flex_value_meaning IS TABLE OF OKC_VS_VALUES_INTERFACE.FLEX_VALUE_MEANING%TYPE INDEX BY BINARY_INTEGER ;
8167
8168
8169 TYPE l_vinf_flex_value_id IS TABLE OF FND_FLEX_VALUES.flex_value_id%TYPE INDEX BY BINARY_INTEGER ;
8170 TYPE l_vinf_value_set_id IS TABLE OF FND_FLEX_VALUE_SETS.flex_value_set_id%TYPE INDEX BY BINARY_INTEGER ;
8171 TYPE l_vinf_validation_type IS TABLE OF FND_FLEX_VALUE_SETS.VALIDATION_TYPE%TYPE INDEX BY BINARY_INTEGER ;
8172 TYPE l_vinf_format_type IS TABLE OF FND_FLEX_VALUE_SETS.FORMAT_TYPE%TYPE INDEX BY BINARY_INTEGER ;
8173 TYPE l_vinf_maximum_size IS TABLE OF FND_FLEX_VALUE_SETS.MAXIMUM_SIZE%TYPE INDEX BY BINARY_INTEGER ;
8174 TYPE l_vinf_number_precision IS TABLE OF FND_FLEX_VALUE_SETS.NUMBER_PRECISION%TYPE INDEX BY BINARY_INTEGER ;
8175 TYPE l_vinf_alphanum_allowed IS TABLE OF FND_FLEX_VALUE_SETS.ALPHANUMERIC_ALLOWED_FLAG%TYPE INDEX BY BINARY_INTEGER ;
8176 TYPE l_vinf_uppercase_only IS TABLE OF FND_FLEX_VALUE_SETS.UPPERCASE_ONLY_FLAG%TYPE INDEX BY BINARY_INTEGER ;
8177 TYPE l_vinf_num_mode_enabled IS TABLE OF FND_FLEX_VALUE_SETS.NUMERIC_MODE_ENABLED_FLAG%TYPE INDEX BY BINARY_INTEGER ;
8178 TYPE l_vinf_maximum_value IS TABLE OF FND_FLEX_VALUE_SETS.MAXIMUM_VALUE%TYPE INDEX BY BINARY_INTEGER ;
8179 TYPE l_vinf_minimum_value IS TABLE OF FND_FLEX_VALUE_SETS.MINIMUM_VALUE%TYPE INDEX BY BINARY_INTEGER ;
8180
8181
8182 TYPE l_vinf_flex_value_orig IS TABLE OF OKC_VS_VALUES_INTERFACE.FLEX_VALUE%TYPE INDEX BY BINARY_INTEGER ;
8183
8184 l_return_status VARCHAR2(1);
8185 l_error_index NUMBER := 1;
8186 l_batch_process_id NUMBER := 1;
8187 l_context VARCHAR2(50) := NULL;
8188 l_init_msg_list VARCHAR2(200) := okc_api.g_true;
8189 l_tot_rows_processed NUMBER := 0;
8190 l_tot_rows_failed NUMBER := 0;
8191 l_tot_rows_warned NUMBER := 0;
8192 l_part_rows_processed NUMBER := 0;
8193 l_part_rows_failed NUMBER := 0;
8194 l_part_rows_warned NUMBER := 0;
8195 l_bulk_failed VARCHAR2(1) := 'Y';
8196
8197 -- Variables for flex values interface
8198 vinf_interface_id_tbl l_vinf_interface_id ;
8199 vinf_batch_number_tbl l_vinf_batch_number ;
8200 vinf_obj_ver_number_tbl l_vinf_obj_ver_number ;
8201 vinf_flex_value_set_name_tbl l_vinf_flex_value_set_name ;
8202 vinf_flex_value_tbl l_vinf_flex_value ;
8203 vinf_process_status_tbl l_vinf_process_status ;
8204 vinf_action_tbl l_vinf_action ;
8205 vinf_enabled_flag_tbl l_vinf_enabled_flag ;
8206 vinf_start_date_active_tbl l_vinf_start_date_active ;
8207 vinf_end_date_active_tbl l_vinf_end_date_active ;
8208 vinf_language_tbl l_vinf_language ;
8209 vinf_description_tbl l_vinf_description ;
8210 vinf_flex_value_meaning_tbl l_vinf_flex_value_meaning ;
8211
8212 vinf_flex_value_id_tbl l_vinf_flex_value_id ;
8213 vinf_value_set_id_tbl l_vinf_value_set_id ;
8214 vinf_validation_type_tbl l_vinf_validation_type ;
8215 vinf_format_type_tbl l_vinf_format_type ;
8216 vinf_maximum_size_tbl l_vinf_maximum_size ;
8217 vinf_number_precision_tbl l_vinf_number_precision ;
8218 vinf_alphanum_allowed_tbl l_vinf_alphanum_allowed ;
8219 vinf_uppercase_only_tbl l_vinf_uppercase_only ;
8220 vinf_num_mode_enabled_tbl l_vinf_num_mode_enabled ;
8221 vinf_maximum_value_tbl l_vinf_maximum_value ;
8222 vinf_minimum_value_tbl l_vinf_minimum_value ;
8223
8224 --vinf_flex_value_orig_tbl l_vinf_flex_value_orig ;
8225
8226 I NUMBER := 0;
8227 j NUMBER := 0;
8228 k NUMBER := 0;
8229 x NUMBER := 0;
8230 l_program_id OKC_VS_VALUES_INTERFACE.PROGRAM_ID%TYPE;
8231 l_program_login_id OKC_VS_VALUES_INTERFACE.PROGRAM_LOGIN_ID%TYPE;
8232 l_program_appl_id OKC_VS_VALUES_INTERFACE.PROGRAM_APPLICATION_ID%TYPE;
8233 l_request_id OKC_VS_VALUES_INTERFACE.REQUEST_ID%TYPE;
8234 l_rowid ROWID;
8235 api_return_status VARCHAR2(1);
8236 l_tmp_return_status VARCHAR2(1) := G_RET_STS_SUCCESS;
8237 l_display_value VARCHAR2(2000);
8238 l_storage_value VARCHAR2(32000);
8239
8240
8241 l_flex_value_set_id NUMBER;
8242 l_flex_value_id NUMBER;
8243 l_flex_value VARCHAR2(150);
8244 l_start_date DATE;
8245 l_end_date DATE;
8246 l_vs_name VARCHAR2(1) := NULL;
8247
8248
8249 BEGIN
8250 IF (l_debug = 'Y') THEN
8251 okc_debug.log('100: Entered values_import', 2);
8252 END IF;
8253
8254
8255 ------------------------------------------------------------------------
8256 -- Variable Initialization
8257 -------------------------------------------------------------------------
8258
8259 -- Standard Start of API savepoint
8260 FND_MSG_PUB.initialize;
8261 -- Initialize API return status to success
8262 x_return_status := FND_API.G_RET_STS_SUCCESS;
8263 l_return_status := G_RET_STS_SUCCESS;
8264 -- Cache user_id, login_id and org_id
8265 l_user_id := Fnd_Global.user_id;
8266 l_login_id := Fnd_Global.login_id;
8267
8268 IF FND_GLOBAL.CONC_PROGRAM_ID = -1 THEN
8269 l_program_id := NULL;
8270 ELSE
8271 l_program_id := FND_GLOBAL.CONC_PROGRAM_ID;
8272 END IF;
8273
8274 IF FND_GLOBAL.CONC_LOGIN_ID = -1 THEN
8275 l_program_login_id := NULL;
8276 ELSE
8277 l_program_login_id := FND_GLOBAL.CONC_LOGIN_ID;
8278 END IF;
8279
8280 IF FND_GLOBAL.PROG_APPL_ID = -1 THEN
8281 l_program_appl_id := NULL;
8282 ELSE
8283 l_program_appl_id := FND_GLOBAL.PROG_APPL_ID;
8284 END IF;
8285
8286 IF FND_GLOBAL.CONC_REQUEST_ID = -1 THEN
8287 l_request_id := NULL;
8288 ELSE
8289 l_request_id := FND_GLOBAL.CONC_REQUEST_ID;
8290 END IF;
8291
8292
8293 l_batch_process_id := p_batch_procs_id;
8294 -------------------------------------------------------------------------
8295 --------------- the outermost loop of this procedure --------------------
8296 -- Bulk fetch all interface rows based on the fetchsize passedby the user
8297 -------------------------------------------------------------------------
8298
8299 l_context :='BULK FETCH FLEX VALUES INTERFACE ROW';
8300 OPEN l_val_interface_csr ( p_batch_number );
8301 LOOP
8302 BEGIN
8303 FETCH l_val_interface_csr BULK COLLECT INTO
8304 vinf_interface_id_tbl ,
8305 vinf_batch_number_tbl ,
8306 vinf_obj_ver_number_tbl ,
8307 vinf_flex_value_set_name_tbl ,
8308 vinf_flex_value_tbl ,
8309 vinf_process_status_tbl ,
8310 vinf_action_tbl ,
8311 vinf_enabled_flag_tbl ,
8312 vinf_start_date_active_tbl ,
8313 vinf_end_date_active_tbl ,
8314 vinf_language_tbl ,
8315 vinf_description_tbl ,
8316 vinf_flex_value_meaning_tbl ,
8317 vinf_value_set_id_tbl ,
8318 vinf_validation_type_tbl ,
8319 vinf_format_type_tbl ,
8320 vinf_maximum_size_tbl ,
8321 vinf_number_precision_tbl ,
8322 vinf_alphanum_allowed_tbl ,
8323 vinf_uppercase_only_tbl ,
8324 vinf_num_mode_enabled_tbl ,
8325 vinf_maximum_value_tbl ,
8326 vinf_minimum_value_tbl ,
8327 vinf_flex_value_id_tbl LIMIT p_fetchsize;
8328 EXIT WHEN vinf_interface_id_tbl.COUNT = 0 ;
8329
8330 ------------------------------------------------------------------------
8331 -- Variable initialization
8332 -------------------------------------------------------------------------
8333 --For each fetch, value variable table index should be initialized
8334 j := 1;
8335 --##count:initialization
8336 l_tot_rows_processed := l_tot_rows_processed+l_part_rows_processed;
8337 l_tot_rows_failed := l_tot_rows_failed+l_part_rows_failed;
8338 l_tot_rows_warned := l_tot_rows_warned+l_part_rows_warned;
8339 l_part_rows_processed := 0;
8340 l_part_rows_failed := 0;
8341 l_part_rows_warned := 0;
8342 l_bulk_failed := 'N';
8343 ---------------------------------------------------------------------------
8344 --------------------- Inner Loop thru fetched rows for---------------------
8345 -- validation, parse and validate article text, create a variable list
8346 -- prepare rows for DML if validate_only is 'N'
8347 /*** Processing Rule to set process_status
8348 Because we want to collect as much info as possible, we need to
8349 maintain process status while keeping the process moving.
8350 So, we'll set l_return_status as validation goes on and
8351 at the end we will set inf_process_status_tbl(i) with l_return_status
8352 for final result. However, we will get out of this process if there
8353 is a significant error such as 'U'.
8354 The return status examined
8355 -api_return_status : return status for api call
8356 -l_return_status : validation result of each row
8357 -x_return_status : final result status for concurrent program request
8358 Rule to set return status
8359 If api_return_status for api call is
8360 * 'S' then continue
8361 * 'W' and l_return_status not 'E' or 'U' then set l_return_status = 'W'
8362 and build_error_array then continue
8363 * 'E' and it is significant then set l_return_status = 'E' and raise
8364 Exception
8365 * 'E' and it is minor then set l_return_status = 'E' and continue. Raise
8366 'E' at the end of validation
8367 * 'U' then set l_return_status = 'U' and raise 'U' exception
8368 * At the end, if it goes thru with no Exception,
8369 Check if l_return_status is 'E' then raise Exception
8370 Otherwise (meaning l_return_status is 'S' or 'W'),
8371 vinf_process_status_tbl(i) = l_return_status
8372 * In the exception, we will set
8373 vinf_process_status_tbl(i) = l_return_status and build_error_array
8374 ***/
8375 -------------------------------------------------------------------------
8376
8377 FOR i in vinf_interface_id_tbl.FIRST ..vinf_interface_id_tbl.LAST LOOP
8378 BEGIN
8379 -- Increment total processed rows
8380 --##Count
8381 l_part_rows_processed := l_part_rows_processed+1;
8382 -- Initialization for each iteration
8383 l_row_notfound := FALSE;
8384 l_return_status := G_RET_STS_SUCCESS;
8385
8386 l_context := 'VALUES VALIDATING';
8387
8388 -- To find duplicate values in the same valueset in the batch
8389 IF i>1 THEN
8390 x := i-1;
8391 IF RTRIM(vinf_flex_value_set_name_tbl(i)) = RTRIM(vinf_flex_value_set_name_tbl(x)) AND
8392 RTRIM(vinf_flex_value_tbl(i)) = RTRIM(vinf_flex_value_tbl(x))
8393 THEN
8394 Okc_Api.Set_Message(G_APP_NAME,
8395 'OKC_VALSET_VAL_DUP_TITLE',
8396 'VALUE',
8397 vinf_flex_value_tbl(i),
8398 'VALSET',
8399 vinf_flex_value_set_name_tbl(i)
8400 );
8401 l_return_status := G_RET_STS_ERROR;
8402 RAISE FND_API.G_EXC_ERROR;
8403 END IF;
8404 END IF;
8405 -- Logic to decide what to do in case of Action='S'
8406
8407 IF vinf_action_tbl(i) = 'S' THEN
8408 vinf_action_tbl(i) := 'N';
8409 END IF;
8410
8411
8412 IF vinf_action_tbl(i) = 'N' THEN
8413 -- Check if value set already exists in the System
8414 IF NOT Fnd_Flex_Val_Api.Valueset_Exists(vinf_flex_value_set_name_tbl(i)) THEN
8415 IF p_validate_only = 'N' THEN
8416 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8417 p_msg_name => 'OKC_VALSET_NOT_EXISTS',
8418 p_token1 => 'VALUE',
8419 p_token1_value => vinf_flex_value_tbl(i),
8420 p_token2 => 'VALSET',
8421 p_token2_value => vinf_flex_value_set_name_tbl(i)
8422 );
8423 l_return_status := G_RET_STS_ERROR;
8424 RAISE FND_API.G_EXC_ERROR;
8425 ELSE
8426 IF vinf_validation_type_tbl(i) IS NULL AND vinf_format_type_tbl(i) IS NULL THEN
8427 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8428 p_msg_name => 'OKC_VALSET_NOT_EXISTS',
8429 p_token1 => 'VALUE',
8430 p_token1_value => vinf_flex_value_tbl(i),
8431 p_token2 => 'VALSET',
8432 p_token2_value => vinf_flex_value_set_name_tbl(i)
8433 );
8434 l_return_status := G_RET_STS_ERROR;
8435 RAISE FND_API.G_EXC_ERROR;
8436 END IF;
8437 END IF;
8438 END IF;
8439 END IF;
8440
8441 IF vinf_action_tbl(i) = 'N' THEN
8442
8443 --TRIM trailing space because
8444 vinf_flex_value_set_name_tbl(i) := RTRIM(vinf_flex_value_set_name_tbl(i));
8445 vinf_flex_value_tbl(i) := RTRIM(vinf_flex_value_tbl(i));
8446 -- Store original value before converting to display format
8447 --vinf_flex_value_orig_tbl(i) := vinf_flex_value_orig_tbl(i);
8448
8449 -- Need to convert flex value to display format
8450 vinf_flex_value_tbl(i) := Fnd_Flex_Val_Util.to_display_value
8451 (p_value => vinf_flex_value_tbl(i),
8452 p_vset_format => vinf_format_type_tbl(i),
8453 p_vset_name => vinf_flex_value_set_name_tbl(i),
8454 p_max_length => vinf_maximum_size_tbl(i),
8455 p_precision => vinf_number_precision_tbl(i),
8456 p_alpha_allowed => vinf_alphanum_allowed_tbl(i),
8457 p_uppercase_only => vinf_uppercase_only_tbl(i),
8458 p_zero_fill => vinf_num_mode_enabled_tbl(i),
8459 p_min_value => vinf_minimum_value_tbl(i),
8460 p_max_value => vinf_maximum_value_tbl(i));
8461
8462 ELSIF vinf_action_tbl(i) = 'D' THEN
8463 IF vinf_end_date_active_tbl(i) IS NULL THEN
8464 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8465 p_msg_name => 'OKC_NULL_END_DATE');
8466 l_return_status := G_RET_STS_ERROR;
8467 RAISE FND_API.G_EXC_ERROR;
8468 END IF;
8469
8470 -- Check if value exists in the system or not
8471 OPEN l_val_exist_csr(vinf_flex_value_tbl(i),vinf_value_set_id_tbl(i));
8472 FETCH l_val_exist_csr INTO l_flex_value_set_id,
8473 l_flex_value_id,
8474 l_flex_value,
8475 l_start_date,
8476 l_end_date;
8477 IF l_val_exist_csr%NOTFOUND THEN
8478 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8479 p_msg_name => 'OKC_INVALID_VS_VALUE',
8480 p_token1=> 'VALUE',
8481 p_token1_value => vinf_flex_value_tbl(i),
8482 p_token2=> 'VALSET',
8483 p_token2_value => vinf_flex_value_set_name_tbl(i));
8484 l_return_status := G_RET_STS_ERROR;
8485 RAISE FND_API.G_EXC_ERROR;
8486
8487 ELSE
8488
8489 IF l_start_date IS NOT NULL
8490 THEN
8491 IF l_start_date > vinf_end_date_active_tbl(i) THEN
8492 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8493 p_msg_name => 'OKC_INVALID_END_DATE');
8494 l_return_status := G_RET_STS_ERROR;
8495 RAISE FND_API.G_EXC_ERROR;
8496 END IF;
8497 END IF;
8498 END IF;
8499
8500 CLOSE l_val_exist_csr;
8501 ELSE
8502
8503 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8504 p_msg_name => 'OKC_VAL_INV_IMP_ACTION');
8505 l_return_status := G_RET_STS_ERROR;
8506 RAISE FND_API.G_EXC_ERROR ;
8507 END IF;
8508
8509 -----------------------------------------------------------
8510 -- Common validation or attribute settting
8511 -- regardless of status and import action
8512 -- this validation is not included in validate api
8513 -----------------------------------------------------------
8514 IF vinf_action_tbl(i) = 'N' THEN
8515 /*
8516 -- Check if value set already exists in the System
8517 IF NOT Fnd_Flex_Val_Api.Valueset_Exists(vinf_flex_value_set_name_tbl(i)) THEN
8518 IF p_validate_only = 'N' THEN
8519 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8520 p_msg_name => 'OKC_VALSET_NOT_EXISTS',
8521 p_token1 => 'VALUE',
8522 p_token1_value => vinf_flex_value_tbl(i),
8523 p_token2 => 'VALSET',
8524 p_token2_value => vinf_flex_value_set_name_tbl(i)
8525 );
8526 l_return_status := G_RET_STS_ERROR;
8527 ELSE
8528 IF vinf_validation_type_tbl(i) IS NULL AND vinf_format_type_tbl(i) IS NULL THEN
8529 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8530 p_msg_name => 'OKC_VALSET_NOT_EXISTS',
8531 p_token1 => 'VALUE',
8532 p_token1_value => vinf_flex_value_tbl(i),
8533 p_token2 => 'VALSET',
8534 p_token2_value => vinf_flex_value_set_name_tbl(i)
8535 );
8536 l_return_status := G_RET_STS_ERROR;
8537 END IF;
8538 END IF;
8539 END IF;
8540 */
8541
8542
8543 -- Check if Validation Type for value set is 'I' otherwise values cannot be created
8544 IF (vinf_validation_type_tbl(i) <> 'I') THEN
8545 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8546 p_msg_name => 'OKC_VAL_VALSET_NOT_VALID',
8547 p_token1 => 'VALUE',
8548 p_token1_value => vinf_flex_value_tbl(i),
8549 p_token2 => 'VALSET',
8550 p_token2_value => vinf_flex_value_set_name_tbl(i)
8551 );
8552 l_return_status := G_RET_STS_ERROR;
8553 END IF;
8554
8555
8556 -- Check if value is valid for the value set
8557 l_display_value := fnd_flex_ext.get_message;
8558 IF (NOT Fnd_Flex_Val_Util.Is_Value_Valid
8559 (p_value => vinf_flex_value_tbl(i),
8560 --p_is_displayed => TRUE,
8561 p_vset_name => vinf_flex_value_set_name_tbl(i),
8562 p_vset_format => vinf_format_type_tbl(i),
8563 p_max_length => vinf_maximum_size_tbl(i),
8564 p_precision => vinf_number_precision_tbl(i),
8565 p_alpha_allowed => vinf_alphanum_allowed_tbl(i),
8566 p_uppercase_only => vinf_uppercase_only_tbl(i),
8567 p_zero_fill => vinf_num_mode_enabled_tbl(i),
8568 p_min_value => vinf_minimum_value_tbl(i),
8569 p_max_value => vinf_maximum_value_tbl(i),
8570 x_storage_value => l_storage_value,
8571 x_display_value => l_display_value)) THEN
8572 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8573 p_msg_name => 'OKC_VAL_NOT_VALID');
8574 l_return_status := G_RET_STS_ERROR;
8575 END IF;
8576
8577 IF nvl(vinf_enabled_flag_tbl(i),'*') not in ('N','Y') THEN
8578 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8579 p_msg_name => 'OKC_INVALID_ENABLED_FLAG');
8580 l_return_status := G_RET_STS_ERROR;
8581
8582 END IF;
8583
8584 IF vinf_start_date_active_tbl(i) IS NOT NULL
8585 AND vinf_end_date_active_tbl(i) IS NOT NULL
8586 THEN
8587 IF vinf_start_date_active_tbl(i) > vinf_end_date_active_tbl(i) THEN
8588 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8589 p_msg_name => 'OKC_INVALID_END_DATE');
8590 l_return_status := G_RET_STS_ERROR;
8591 END IF;
8592 END IF;
8593
8594 END IF;
8595 ------------------------------------------------------------------------
8596 -- Now that we have validated and data is clean, we can
8597 -- get ready for DML and also set the process status to Success
8598 -------------------------------------------------------------------------
8599
8600 -- Summarize report for this row
8601 -- Status 'F' is for internal use meaning parsing failure marked in
8602 -- java concurrent program
8603 IF (l_return_status = G_RET_STS_SUCCESS) THEN
8604 IF (nvl(vinf_process_status_tbl(i), 'E') = 'E') THEN
8605 vinf_process_status_tbl(i) := G_RET_STS_SUCCESS;
8606 ELSIF ( vinf_process_status_tbl(i) = 'F') THEN
8607 -- ##count parser failure as error
8608 --l_tot_rows_failed := l_tot_rows_failed+1;
8609 l_part_rows_failed := l_part_rows_failed+1;
8610 vinf_process_status_tbl(i) := G_RET_STS_ERROR;
8611 END IF;
8612 ELSIF (l_return_status = l_sts_warning) THEN
8613 IF (nvl(vinf_process_status_tbl(i),'E') = 'E') THEN
8614 vinf_process_status_tbl(i) := l_sts_warning;
8615 --##count
8616 --l_tot_rows_warned := l_tot_rows_warned+1;
8617 l_part_rows_warned := l_part_rows_warned+1;
8618 ELSIF (vinf_process_status_tbl(i) = 'F') THEN
8619 -- ##count parser failure as error
8620 --l_tot_rows_failed := l_tot_rows_failed+1;
8621 l_part_rows_failed := l_part_rows_failed+1;
8622 vinf_process_status_tbl(i) := G_RET_STS_ERROR;
8623 END IF;
8624 ELSIF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
8625 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8626 ELSIF (l_return_status = G_RET_STS_ERROR) THEN
8627 RAISE FND_API.G_EXC_ERROR;
8628 END IF;
8629
8630 -------------------------
8631 -------------------------
8632 -- Exception Block for each iteration in Loop
8633 -- validation and unexpected errors
8634 -- In case of unexpected error, escape the loop
8635 -------------------------
8636 -------------------------
8637
8638
8639 EXCEPTION
8640 WHEN FND_API.G_EXC_ERROR THEN
8641 IF (l_debug = 'Y') THEN
8642 okc_debug.log('300: In Fnd_flex_values_Import: OKC_API.G_EXCEPTION_ERROR Exception', 2);
8643 END IF;
8644 IF l_val_exist_csr%ISOPEN THEN
8645 CLOSE l_val_exist_csr;
8646 END IF;
8647 --l_return_status := G_RET_STS_ERROR ;
8648 build_error_array(
8649 p_msg_data => x_msg_data,
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 -- Continue to next row
8662
8663 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8664 IF (l_debug = 'Y') THEN
8665 okc_debug.log('400: Leaving Fnd_flex_values_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
8666 END IF;
8667
8668 IF l_val_exist_csr%ISOPEN THEN
8669 CLOSE l_val_exist_csr;
8670 END IF;
8671 IF l_val_interface_csr%ISOPEN THEN
8672 CLOSE l_val_interface_csr;
8673 END IF;
8674
8675 --Set_Message
8676 l_return_status := G_RET_STS_UNEXP_ERROR ;
8677 x_return_status := G_RET_STS_UNEXP_ERROR ;
8678
8679 build_error_array(
8680 p_msg_data => x_msg_data,
8681 p_context => l_context,
8682 p_batch_process_id => l_batch_process_id,
8683 p_interface_id => vinf_interface_id_tbl(i),
8684 p_article_title => vinf_flex_value_tbl(i),
8685 p_error_type => G_RET_STS_UNEXP_ERROR,
8686 p_entity => 'VALUE'
8687 );
8688 vinf_process_status_tbl(i) := G_RET_STS_ERROR;
8689 --##count
8690 --l_tot_rows_failed := l_tot_rows_failed+1;
8691 l_part_rows_failed := l_part_rows_failed+1;
8692 exit; -- exit the current fetch
8693
8694 WHEN OTHERS THEN
8695 IF (l_debug = 'Y') THEN
8696 okc_debug.log('500: Leaving Fnd_flex_values_Import because of EXCEPTION: '||sqlerrm, 2);
8697 END IF;
8698 IF l_val_exist_csr%ISOPEN THEN
8699 CLOSE l_val_exist_csr;
8700 END IF;
8701
8702 IF l_val_interface_csr%ISOPEN THEN
8703 CLOSE l_val_interface_csr;
8704 END IF;
8705
8706 l_return_status := G_RET_STS_UNEXP_ERROR ;
8707 x_return_status := G_RET_STS_UNEXP_ERROR ;
8708
8709 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8710 p_msg_name => G_UNEXPECTED_ERROR,
8711 p_token1 => G_SQLCODE_TOKEN,
8712 p_token1_value => sqlcode,
8713 p_token2 => G_SQLERRM_TOKEN,
8714 p_token2_value => sqlerrm);
8715
8716 build_error_array(
8717 p_msg_data => G_UNEXPECTED_ERROR,
8718 p_context => l_context,
8719 p_batch_process_id => l_batch_process_id,
8720 p_interface_id => vinf_interface_id_tbl(i),
8721 p_article_title => vinf_flex_value_tbl(i),
8722 p_error_type => G_RET_STS_ERROR,
8723 p_entity => 'VALUE'
8724 );
8725 vinf_process_status_tbl(i) := G_RET_STS_ERROR;
8726 --##count
8727 --l_tot_rows_failed := l_tot_rows_failed+1;
8728 l_part_rows_failed := l_part_rows_failed+1;
8729 exit; -- exit the current fetch
8730 END;
8731 -------------------------
8732 -------------------------
8733 -- Exception Block for each iteration in Loop ends
8734 -------------------------
8735 -------------------------
8736
8737
8738 END LOOP; -- end of FOR i in inf_interface_id_tbl.FIRST ..
8739 ------------------------------------------------------------------------
8740 -------------- End of Inner Loop thru fetched row for validation --------
8741 -------------------------------------------------------------------------
8742 -- In order to propagate Unexpected error raise it if it is 'U'
8743 IF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
8744 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8745 END IF;
8746
8747 -------------------------
8748 -------------------------
8749 -- Exception Block for Inner Loop starts
8750 -- Handles unexpected errors as last step
8751 -------------------------
8752 -------------------------
8753 EXCEPTION
8754 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8755 IF (l_debug = 'Y') THEN
8756 okc_debug.log('400: Leaving Fnd_flex_values_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
8757 END IF;
8758 IF l_val_exist_csr%ISOPEN THEN
8759 CLOSE l_val_exist_csr;
8760 END IF;
8761
8762 IF l_val_interface_csr%ISOPEN THEN
8763 CLOSE l_val_interface_csr;
8764 END IF;
8765 l_return_status := G_RET_STS_UNEXP_ERROR ;
8766 x_return_status := G_RET_STS_UNEXP_ERROR ;
8767 exit; -- exit outermost loop
8768
8769 WHEN OTHERS THEN
8770 IF (l_debug = 'Y') THEN
8771 okc_debug.log('500: Leaving Fnd_flex_values_Import because of EXCEPTION: '||sqlerrm, 2);
8772 END IF;
8773 IF l_val_exist_csr%ISOPEN THEN
8774 CLOSE l_val_exist_csr;
8775 END IF;
8776
8777 IF l_val_interface_csr%ISOPEN THEN
8778 CLOSE l_val_interface_csr;
8779 END IF;
8780 l_return_status := G_RET_STS_UNEXP_ERROR ;
8781 x_return_status := G_RET_STS_UNEXP_ERROR ;
8782 exit; -- exit outermost loop
8783 END;
8784
8785 -------------------------
8786 -------------------------
8787 -- Exception Block for Each Iteration of outermost Loop ends
8788 -------------------------
8789 -------------------------
8790
8791 ------------------------------------------------------------------------
8792 --------------------- Start Do_DML for Fnd Flex Values ---------------
8793 -- Insert Fnd Flex Values
8794 -------------------------------------------------------------------------
8795 -- initialize l_return_status to track status of DML execution
8796 l_return_status := G_RET_STS_SUCCESS;
8797
8798
8799 IF p_validate_only = 'N' THEN
8800 BEGIN
8801 SAVEPOINT bulkdml;
8802
8803 i := 0;
8804 -- Bulk insert New Valid Records
8805 BEGIN
8806 l_context := 'INSERTING NEW VALUES INTO TABLE';
8807 FOR i in vinf_interface_id_tbl.FIRST ..vinf_interface_id_tbl.LAST LOOP
8808
8809 IF vinf_action_tbl(i) = 'N' AND vinf_process_status_tbl(i) in ('S','W') THEN
8810
8811
8812 FND_FLEX_VAL_API.CREATE_INDEPENDENT_VSET_VALUE(
8813 P_FLEX_VALUE_SET_NAME => vinf_flex_value_set_name_tbl(i),
8814 P_FLEX_VALUE => vinf_flex_value_tbl(i),
8815 P_DESCRIPTION => vinf_description_tbl(i),
8816 P_ENABLED_FLAG => vinf_enabled_flag_tbl(i),
8817 P_START_DATE_ACTIVE => vinf_start_date_active_tbl(i),
8818 P_END_DATE_ACTIVE => vinf_end_date_active_tbl(i),
8819 P_SUMMARY_FLAG => 'N',
8820 P_STRUCTURED_HIERARCHY_LEVEL => NULL,
8821 P_HIERARCHY_LEVEL => NULL,
8822 X_STORAGE_VALUE => l_storage_value);
8823
8824 END IF;
8825 END LOOP;
8826
8827 EXCEPTION
8828 WHEN OTHERS THEN
8829 IF (l_debug = 'Y') THEN
8830 okc_debug.log('500: Leaving Fnd_flex_values_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
8831 END IF;
8832 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8833 END;
8834
8835 --
8836 -- End of Insert into FND FLEX VALUES
8837 --
8838 --
8839
8840 i := 0;
8841 -- Bulk disable Valid Records
8842 BEGIN
8843 l_context := 'DISABLE VALUES BY UPDATING THE END DATE';
8844 FOR i in vinf_interface_id_tbl.FIRST ..vinf_interface_id_tbl.LAST LOOP
8845
8846 IF vinf_action_tbl(i) = 'D' AND vinf_process_status_tbl(i) in ('S','W') THEN
8847
8848
8849 FND_FLEX_VAL_API.UPDATE_INDEPENDENT_VSET_VALUE(
8850 P_FLEX_VALUE_SET_NAME => vinf_flex_value_set_name_tbl(i),
8851 P_FLEX_VALUE => vinf_flex_value_tbl(i),
8852 --P_DESCRIPTION => vinf_description_tbl(i),
8853 --P_ENABLED_FLAG => vinf_enabled_flag_tbl(i),
8854 --P_START_DATE_ACTIVE => vinf_start_date_active_tbl(i),
8855 P_END_DATE_ACTIVE => vinf_end_date_active_tbl(i),
8856 --P_SUMMARY_FLAG => 'N',
8857 --P_STRUCTURED_HIERARCHY_LEVEL => NULL,
8858 --P_HIERARCHY_LEVEL => NULL,
8859 X_STORAGE_VALUE => l_storage_value);
8860
8861 END IF;
8862 END LOOP;
8863
8864 EXCEPTION
8865 WHEN OTHERS THEN
8866 IF (l_debug = 'Y') THEN
8867 okc_debug.log('500: Leaving Fnd_flex_values_Import because of EXCEPTION: '||l_context||sqlerrm, 2);
8868 END IF;
8869 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8870 END;
8871
8872 --
8873 -- End of Disable FND FLEX VALUES
8874 --
8875 --
8876
8877
8878
8879 -- Exception for bulk DML block
8880 EXCEPTION
8881 WHEN OTHERS THEN
8882 l_bulk_failed := 'Y'; -- indicating that bulk operation has failed
8883 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8884 p_msg_name => G_UNEXPECTED_ERROR,
8885 p_token1 => G_SQLCODE_TOKEN,
8886 p_token1_value => sqlcode,
8887 p_token2 => G_SQLERRM_TOKEN,
8888 p_token2_value => sqlerrm);
8889 Okc_API.Set_Message(p_app_name => G_APP_NAME,
8890 p_msg_name => 'OKC_ART_FETCH_FAILED',
8891 p_token1 => 'CONTEXT',
8892 p_token1_value => l_context);
8893
8894 build_error_array(
8895 p_msg_data => null,
8896 p_context => l_context,
8897 p_batch_process_id => l_batch_process_id,
8898 p_interface_id => -99,
8899 p_article_title => NULL,
8900 p_error_type => G_RET_STS_ERROR,
8901 p_entity => 'VALUE'
8902 );
8903 l_return_status := G_RET_STS_UNEXP_ERROR;
8904 x_return_status := G_RET_STS_UNEXP_ERROR;
8905
8906 --##count:rollback the count
8907 l_part_rows_failed := l_part_rows_processed;
8908 l_part_rows_warned := 0;
8909
8910 ROLLBACK TO SAVEPOINT bulkdml;
8911 exit; -- exit outermost loop
8912 END;
8913
8914 END IF; --- validate_only = 'N'
8915
8916 ------------------------------------------------------------------------
8917 --------------------- End of Do_DML for Values ---------------
8918 -------------------------------------------------------------------------
8919
8920 ------------------------------------------------------------------------
8921 --------------- Start of Do_DML for import related tables ------------
8922 -- Update interface table
8923 -- Insert Errors into Error table
8924 -------------------------------------------------------------------------
8925 -- Update Interface Table
8926 i:=0;
8927 BEGIN
8928 l_context := 'UPDATING VALUES INTERFACE TABLE';
8929 FORALL i in vinf_interface_id_tbl.FIRST..vinf_interface_id_tbl.LAST
8930 UPDATE OKC_VS_VALUES_INTERFACE
8931 SET
8932 -- We don't want to update process_status to 'S' or 'W' in validation_mode
8933 -- because it is not going to be picked up in next run if we do so
8934 PROCESS_STATUS = decode(p_validate_only||vinf_process_status_tbl(i)||l_bulk_failed,
8935 'NEN','E',
8936 'NSN','S',
8937 'NWN','W',
8938 'NEY','E',
8939 'NSY',NULL,
8940 'NWY',NULL,
8941 'YEY','E',
8942 'YEN','E',
8943 'NFY','E',
8944 'YFY','E',
8945 'NFN','E',
8946 'YFN','E',NULL),
8947 PROGRAM_ID = l_program_id,
8948 REQUEST_ID = l_request_id,
8949 PROGRAM_LOGIN_ID = l_program_login_id,
8950 PROGRAM_APPLICATION_ID = l_program_appl_id,
8951 OBJECT_VERSION_NUMBER = vinf_obj_ver_number_tbl(i) + 1,
8952 LAST_UPDATED_BY = l_user_id,
8953 LAST_UPDATE_LOGIN = l_login_id,
8954 LAST_UPDATE_DATE = SYSDATE
8955 WHERE
8956 interface_id = vinf_interface_id_tbl(i);
8957 EXCEPTION
8958 WHEN OTHERS THEN
8959 IF (l_debug = 'Y') THEN
8960 okc_debug.log('500: Leaving Fnd_flex_values_Import because of EXCEPTION: '||sqlerrm, 2);
8961 END IF;
8962
8963 Okc_Api.Set_Message(p_app_name => G_APP_NAME,
8964 p_msg_name => G_UNEXPECTED_ERROR,
8965 p_token1 => G_SQLCODE_TOKEN,
8966 p_token1_value => sqlcode,
8967 p_token2 => G_SQLERRM_TOKEN,
8968 p_token2_value => sqlerrm);
8969 Okc_API.Set_Message(p_app_name => G_APP_NAME,
8970 p_msg_name => 'OKC_VAL_INT_UPDATE_FAILED');
8971 build_error_array(
8972 p_msg_data => null,
8973 p_context => l_context,
8974 p_batch_process_id => l_batch_process_id,
8975 p_interface_id => -99,
8976 p_article_title => NULL,
8977 p_error_type => G_RET_STS_ERROR,
8978 p_entity => 'VALUE'
8979 );
8980
8981 l_return_status := G_RET_STS_UNEXP_ERROR ;
8982 x_return_status := G_RET_STS_UNEXP_ERROR ;
8983 --##count:rollback the count
8984 l_part_rows_failed := l_part_rows_processed;
8985 l_part_rows_warned := 0;
8986
8987 --RAISE FND_API.G_EXC_ERROR ;
8988 END;
8989 --
8990 -- End of Update OKC_VS_VALUES_INTERFACE
8991 --
8992 --
8993
8994 --
8995 --Insert Errors into Error table for this fetch
8996 --
8997 insert_error_array(
8998 x_return_status => x_return_status,
8999 x_msg_count => x_msg_count,
9000 x_msg_data => x_msg_data
9001 );
9002
9003
9004 IF (x_return_status = l_insert_errors_error) THEN
9005 NULL;
9006 -- Ignore
9007 -- RAISE l_insert_errors_exception;
9008 END IF;
9009
9010 ------------------------------------------------------------------------
9011 --------------- End of Do_DML for import related tables ------------
9012 -------------------------------------------------------------------------
9013 commit;
9014
9015 -- Now delete cache for next bulk fetch
9016
9017 vinf_interface_id_tbl.DELETE;
9018 vinf_batch_number_tbl.DELETE;
9019 vinf_obj_ver_number_tbl.DELETE;
9020 vinf_flex_value_set_name_tbl.DELETE;
9021 vinf_flex_value_tbl.DELETE;
9022 vinf_process_status_tbl.DELETE;
9023 vinf_action_tbl.DELETE;
9024 vinf_enabled_flag_tbl.DELETE;
9025 vinf_start_date_active_tbl.DELETE;
9026 vinf_end_date_active_tbl.DELETE;
9027 vinf_language_tbl.DELETE;
9028 vinf_description_tbl.DELETE;
9029 vinf_flex_value_meaning_tbl.DELETE;
9030
9031 vinf_flex_value_id_tbl.DELETE;
9032 vinf_value_set_id_tbl.DELETE;
9033 vinf_format_type_tbl.DELETE;
9034 vinf_maximum_size_tbl.DELETE;
9035 vinf_number_precision_tbl.DELETE;
9036 vinf_alphanum_allowed_tbl.DELETE;
9037 vinf_uppercase_only_tbl.DELETE;
9038 vinf_num_mode_enabled_tbl.DELETE;
9039 vinf_maximum_value_tbl.DELETE;
9040 vinf_minimum_value_tbl.DELETE;
9041
9042 --vinf_flex_value_orig_tbl.DELETE;
9043
9044 err_batch_process_id_tbl.DELETE;
9045 err_article_title_tbl.DELETE;
9046 err_interface_id_tbl.DELETE;
9047 err_error_number_tbl.DELETE;
9048 err_object_version_number_tbl.DELETE;
9049 err_error_type_tbl.DELETE;
9050 err_entity_tbl.DELETE;
9051 err_error_description_tbl.DELETE;
9052
9053 EXIT WHEN l_val_interface_csr%NOTFOUND;
9054 END LOOP;
9055
9056
9057 -----------------------------------------------------------------------
9058 -- End of outermost loop for bulk fetch
9059 -----------------------------------------------------------------------
9060
9061 IF l_val_interface_csr%ISOPEN THEN
9062 CLOSE l_val_interface_csr;
9063 END IF;
9064
9065
9066 --##count:add up last processed counts
9067 l_tot_rows_processed := l_tot_rows_processed + l_part_rows_processed;
9068 l_tot_rows_failed := l_tot_rows_failed + l_part_rows_failed;
9069 l_tot_rows_warned := l_tot_rows_warned + l_part_rows_warned;
9070
9071 --Update Batch Process Table as a last step
9072 UPDATE OKC_ART_INT_BATPROCS_ALL
9073 SET
9074 TOTAL_ROWS_PROCESSED = l_tot_rows_processed,
9075 TOTAL_ROWS_FAILED = l_tot_rows_failed,
9076 TOTAL_ROWS_WARNED = l_tot_rows_warned,
9077 END_DATE = SYSDATE,
9078 PROGRAM_ID = l_program_id,
9079 REQUEST_ID = l_request_id,
9080 PROGRAM_LOGIN_ID = l_program_login_id,
9081 PROGRAM_APPLICATION_ID = l_program_appl_id,
9082 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
9083 LAST_UPDATED_BY = l_user_id,
9084 LAST_UPDATE_LOGIN = l_login_id,
9085 LAST_UPDATE_DATE = SYSDATE
9086 WHERE
9087 BATCH_PROCESS_ID = l_batch_process_id
9088 AND ENTITY = 'Value';
9089
9090 IF err_error_number_tbl.COUNT > 0 THEN
9091 insert_error_array(
9092 x_return_status => x_return_status,
9093 x_msg_count => x_msg_count,
9094 x_msg_data => x_msg_data
9095 );
9096 END IF;
9097
9098 -- Print statistic of this run in the log
9099 -- Commented for new XML Based Import - Moved to new_wrap_up in conc_import_articles
9100 --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');
9101 commit; -- Final commit for status update
9102
9103 IF (l_debug = 'Y') THEN
9104 okc_debug.log('2000: Leaving Fnd_flex_values import', 2);
9105 END IF;
9106 --x_return_status := l_return_status; this may cause to erase error x_return_status
9107
9108 EXCEPTION
9109
9110 WHEN FND_API.G_EXC_ERROR THEN
9111 IF (l_debug = 'Y') THEN
9112 okc_debug.log('3000: Leaving Fnd_flex_values_Import: OKC_API.G_EXCEPTION_ERROR Exception', 2);
9113 END IF;
9114 --Insert Errors into Error table if there is any
9115 insert_error_array(
9116 x_return_status => x_return_status,
9117 x_msg_count => x_msg_count,
9118 x_msg_data => x_msg_data
9119 );
9120 x_return_status := G_RET_STS_ERROR ;
9121
9122 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9123 IF (l_debug = 'Y') THEN
9124 okc_debug.log('4000: Leaving Fnd_flex_values_Import: OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception', 2);
9125 END IF;
9126 --Insert Errors into Error table if there is any
9127
9128 insert_error_array(
9129 x_return_status => x_return_status,
9130 x_msg_count => x_msg_count,
9131 x_msg_data => x_msg_data
9132 );
9133 commit;
9134
9135 IF l_val_interface_csr%ISOPEN THEN
9136 CLOSE l_val_interface_csr;
9137 END IF;
9138
9139 x_return_status := G_RET_STS_UNEXP_ERROR ;
9140 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
9141 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
9142 END IF;
9143 get_print_msgs_stack(p_msg_data => x_msg_data);
9144
9145 WHEN l_insert_errors_exception THEN
9146 --
9147 -- In this exception handling, we don't insert error array again
9148 -- because error happend in the module
9149 --
9150 IF (l_debug = 'Y') THEN
9151 okc_debug.log('5000: Leaving Fnd_flex_values_Import because of EXCEPTION in insert_error_array: '||sqlerrm, 2);
9152 END IF;
9153
9154 IF l_val_interface_csr%ISOPEN THEN
9155 CLOSE l_val_interface_csr;
9156 END IF;
9157
9158
9159 --x_return_status := G_RET_STS_UNEXP_ERROR ;
9160 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
9161 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
9162 END IF;
9163 get_print_msgs_stack(p_msg_data => x_msg_data);
9164 commit;
9165
9166 WHEN OTHERS THEN
9167 IF (l_debug = 'Y') THEN
9168 okc_debug.log('5000: Leaving Fnd_flex_values_Import because of EXCEPTION: '||sqlerrm, 2);
9169 END IF;
9170 --Insert Errors into Error table if there is any
9171 insert_error_array(
9172 x_return_status => x_return_status,
9173 x_msg_count => x_msg_count,
9174 x_msg_data => x_msg_data
9175 );
9176 commit;
9177 --
9178 IF l_val_interface_csr%ISOPEN THEN
9179 CLOSE l_val_interface_csr;
9180 END IF;
9181
9182 x_return_status := G_RET_STS_UNEXP_ERROR ;
9183 IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
9184 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
9185 END IF;
9186 get_print_msgs_stack(p_msg_data => x_msg_data);
9187 END import_fnd_flex_values;
9188
9189 -- MOAC
9190 /*
9191 BEGIN
9192 OPEN cur_org_csr;
9193 FETCH cur_org_csr INTO G_CURRENT_ORG_ID;
9194 CLOSE cur_org_csr;
9195 */
9196 --CLM impact on contracts changes
9197
9198 PROCEDURE import_scn_map(
9199 x_return_status OUT NOCOPY VARCHAR2,
9200 p_batch_number IN VARCHAR2,
9201 p_fetchsize IN NUMBER := 100
9202 )IS
9203 l_api_version CONSTANT NUMBER := 1;
9204 l_api_name CONSTANT VARCHAR2(30) := 'import_scn_map';
9205 l_sts_warning CONSTANT VARCHAR2(1) := 'W';
9206 /* CURSOR l_scnmap_interface_csr ( cp_batch_number IN VARCHAR2) IS
9207 SELECT
9208 SMINT.ARTICLE_TITLE ,
9209 SMINT.BATCH_NUMBER ,
9210 SMINT.ORG_ID ,
9211 SMINT.VARIABLE_VALUE ,
9212 SMINT.SCN_CODE
9213 FROM OKC_SCN_MAP_INTERFACE SMINT
9214 WHERE BATCH_NUMBER = cp_batch_number;
9215
9216 TYPE l_sminf_article_title IS TABLE OF OKC_SCN_MAP_INTERFACE.ARTICLE_TITLE%TYPE INDEX BY BINARY_INTEGER ;
9217 TYPE l_sminf_batch_number IS TABLE OF OKC_SCN_MAP_INTERFACE.BATCH_NUMBER%TYPE INDEX BY BINARY_INTEGER ;
9218 TYPE l_sminf_org_id IS TABLE OF OKC_SCN_MAP_INTERFACE.ORG_ID%TYPE INDEX BY BINARY_INTEGER ;
9219 TYPE l_sminf_variable_value IS TABLE OF OKC_SCN_MAP_INTERFACE.VARIABLE_VALUE%TYPE INDEX BY BINARY_INTEGER ;
9220 TYPE l_sminf_scn_code IS TABLE OF OKC_SCN_MAP_INTERFACE.SCN_CODE%TYPE INDEX BY BINARY_INTEGER ;
9221 v_sminf_article_title_tbl l_sminf_article_title;
9222 v_sminf_batch_number_tbl l_sminf_batch_number;
9223 v_sminf_org_id_tbl l_sminf_org_id;
9224 v_sminf_variable_value_tbl l_sminf_variable_value;
9225 v_sminf_scn_code_tbl l_sminf_scn_code;
9226
9227 l_article_id OKC_ART_VAR_SECTIONS.ARTICLE_ID%TYPE;
9228 l_article_version_id OKC_ART_VAR_SECTIONS.ARTICLE_VERSION_ID%TYPE;
9229 l_variable_code OKC_ART_VAR_SECTIONS.VARIABLE_CODE%TYPE;
9230 l_variable_value OKC_ART_VAR_SECTIONS.VARIABLE_VALUE%TYPE;
9231 l_variable_value_id OKC_ART_VAR_SECTIONS.VARIABLE_VALUE_ID%TYPE;
9232 l_scn_code OKC_ART_VAR_SECTIONS.SCN_CODE%TYPE;
9233
9234 CURSOR okc_art_var_ins_csr(p_article_title IN VARCHAR2,p_batch_number IN VARCHAR2,p_org_id IN NUMBER,p_variable_value IN VARCHAR2) IS
9235 SELECT art.article_id,av.article_version_id,art.variable_code,intf.variable_value,flx.flex_value_id,intf.scn_code
9236 FROM okc_articles_all art,okc_scn_map_interface intf,fnd_flex_values flx,okc_bus_variables_b bus,okc_article_versions av
9237 WHERE art.article_title = intf.article_title
9238 AND art.org_id=intf.org_id
9239 AND art.variable_code = bus.variable_code
9240 AND bus.value_set_id = flx.flex_value_set_id
9241 AND flx.flex_value = intf.variable_value
9242 AND av.article_id = art.article_id
9243 AND intf.article_title = p_article_title
9244 AND intf.batch_number = p_batch_number
9245 AND intf.org_id = p_org_id
9246 AND intf.variable_value = p_variable_value;
9247 */
9248 BEGIN
9249 IF (l_debug = 'Y') THEN
9250 okc_debug.log('1100: Entered scn_import', 2);
9251 END IF;
9252 x_return_status := G_RET_STS_SUCCESS ;
9253
9254 /*OPEN l_scnmap_interface_csr ( p_batch_number );
9255 LOOP
9256 BEGIN
9257 FETCH l_scnmap_interface_csr BULK COLLECT INTO
9258 v_sminf_article_title_tbl,
9259 v_sminf_batch_number_tbl,
9260 v_sminf_org_id_tbl,
9261 v_sminf_variable_value_tbl,
9262 v_sminf_scn_code_tbl LIMIT p_fetchsize;
9263 EXIT WHEN v_sminf_article_title_tbl.COUNT = 0 ;
9264
9265 FOR i in v_sminf_article_title_tbl.FIRST ..v_sminf_article_title_tbl.LAST LOOP
9266 BEGIN
9267 OPEN okc_art_var_ins_csr(v_sminf_article_title_tbl(i),v_sminf_batch_number_tbl(i),v_sminf_org_id_tbl(i),v_sminf_variable_value_tbl(i));
9268 FETCH okc_art_var_ins_csr INTO l_article_id,l_article_version_id,l_variable_code,l_variable_value,l_variable_value_id,l_scn_code;
9269 CLOSE okc_art_var_ins_csr;
9270
9271 INSERT INTO okc_art_var_sections(variable_code,variable_value_id,variable_value,article_id,article_version_id,scn_code)
9272 VALUES(
9273 l_variable_code ,
9274 l_variable_value_id ,
9275 l_variable_value ,
9276 l_article_id ,
9277 l_article_version_id ,
9278 l_scn_code );
9279 END;
9280 END LOOP; --for loop ends
9281
9282 END;
9283 CLOSE l_scnmap_interface_csr;
9284 END LOOP;
9285 EXCEPTION
9286 WHEN OTHERS THEN
9287 IF (l_debug = 'Y') THEN
9288 okc_debug.log('1200: Leaving scn_map_import because of EXCEPTION: '||sqlerrm, 2);
9289 END IF;
9290 x_return_status := G_RET_STS_UNEXP_ERROR ;
9291 */
9292
9293 END import_scn_map;
9294
9295 END OKC_ARTICLES_IMPORT_GRP;