1 PACKAGE BODY EGO_USER_ATTRS_COMMON_PVT AS
2 /* $Header: EGOPEFCB.pls 120.13 2007/05/19 08:07:09 srajapar ship $ */
3
4
5
6 --=======================================================================--
7 --=*********************************************************************=--
8 --=*===================================================================*=--
9 --=*= =*=--
10 --=*= NOTE: This is a PRIVATE package; it is for internal use only, =*=--
11 --=*= and it is not supported for customer use. =*=--
12 --=*= =*=--
13 --=*===================================================================*=--
14 --=*********************************************************************=--
15 --=======================================================================--
16
17
18
19 ------------------------
20 -- Private Data Types --
21 ------------------------
22
23 TYPE LOCAL_DATE_TABLE IS TABLE OF DATE
24 INDEX BY BINARY_INTEGER;
25
26 TYPE LOCAL_BIG_VARCHAR_TABLE IS TABLE OF VARCHAR2(5000)
27 INDEX BY BINARY_INTEGER;
28
29 ---------------------------------------------------------------------
30 -- Type for caching of Attribute Group metadata; the type includes --
31 -- a LOCAL_DATE_TABLE field to keep track of which Attribute Group --
32 -- metadata record has gone unused for the longest amount of time, --
33 -- which is how we decide which Attribute Group to replace when --
34 -- adding a new record to a full cache --
35 ---------------------------------------------------------------------
36 TYPE EGO_ATTR_GROUP_BATCH_REC IS RECORD
37 (
38 CACHED_ATTR_GROUP_METADATA_1 EGO_ATTR_GROUP_METADATA_OBJ
39 ,CACHED_ATTR_GROUP_METADATA_2 EGO_ATTR_GROUP_METADATA_OBJ
40 ,CACHED_ATTR_GROUP_METADATA_3 EGO_ATTR_GROUP_METADATA_OBJ
41 ,CACHED_ATTR_GROUP_METADATA_4 EGO_ATTR_GROUP_METADATA_OBJ
42 ,CACHED_ATTR_GROUP_METADATA_5 EGO_ATTR_GROUP_METADATA_OBJ
43 ,CACHED_ATTR_GROUP_METADATA_6 EGO_ATTR_GROUP_METADATA_OBJ
44 ,CACHED_ATTR_GROUP_METADATA_7 EGO_ATTR_GROUP_METADATA_OBJ
45 ,CACHED_ATTR_GROUP_METADATA_8 EGO_ATTR_GROUP_METADATA_OBJ
46 ,CACHED_ATTR_GROUP_METADATA_9 EGO_ATTR_GROUP_METADATA_OBJ
47 ,CACHED_ATTR_GROUP_METADATA_10 EGO_ATTR_GROUP_METADATA_OBJ
48 ,access_times_table LOCAL_DATE_TABLE
49 );
50
51 ---------------------------------------------------------------------
52 -- Type for caching of Extension Table metadata; the type includes --
53 -- a LOCAL_DATE_TABLE field to keep track of which Extension Table --
54 -- metadata record has gone unused for the longest amount of time, --
55 -- which is how we decide which Extension Table to replace when --
56 -- adding a new record to a full cache --
57 ---------------------------------------------------------------------
58 TYPE EGO_EXT_TABLE_BATCH_REC IS RECORD
59 (
60 CACHED_EXT_TABLE_METADATA_1 EGO_EXT_TABLE_METADATA_OBJ
61 ,CACHED_EXT_TABLE_METADATA_2 EGO_EXT_TABLE_METADATA_OBJ
62 ,CACHED_EXT_TABLE_METADATA_3 EGO_EXT_TABLE_METADATA_OBJ
63 ,CACHED_EXT_TABLE_METADATA_4 EGO_EXT_TABLE_METADATA_OBJ
64 ,CACHED_EXT_TABLE_METADATA_5 EGO_EXT_TABLE_METADATA_OBJ
65 ,access_times_table LOCAL_DATE_TABLE
66 );
67
68 ---------------------------------------------------------------------
69 -- Type for caching of Data Level metadata; the type includes --
70 -- a LOCAL_DATE_TABLE field to keep track of which Data Level --
71 -- metadata record has gone unused for the longest amount of time, --
72 -- which is how we decide which Extension Table to replace when --
73 -- adding a new record to a full cache --
74 ---------------------------------------------------------------------
75 TYPE EGO_DATA_LEVEL_BATCH_REC IS RECORD
76 (
77 CACHED_DATA_LEVEL_METADATA_1 EGO_DATA_LEVEL_METADATA_OBJ
78 ,CACHED_DATA_LEVEL_METADATA_2 EGO_DATA_LEVEL_METADATA_OBJ
79 ,CACHED_DATA_LEVEL_METADATA_3 EGO_DATA_LEVEL_METADATA_OBJ
80 ,CACHED_DATA_LEVEL_METADATA_4 EGO_DATA_LEVEL_METADATA_OBJ
81 ,CACHED_DATA_LEVEL_METADATA_5 EGO_DATA_LEVEL_METADATA_OBJ
82 ,CACHED_DATA_LEVEL_METADATA_6 EGO_DATA_LEVEL_METADATA_OBJ
83 ,CACHED_DATA_LEVEL_METADATA_7 EGO_DATA_LEVEL_METADATA_OBJ
84 ,CACHED_DATA_LEVEL_METADATA_8 EGO_DATA_LEVEL_METADATA_OBJ
85 ,CACHED_DATA_LEVEL_METADATA_9 EGO_DATA_LEVEL_METADATA_OBJ
86 ,CACHED_DATA_LEVEL_METADATA_10 EGO_DATA_LEVEL_METADATA_OBJ
87 ,access_times_table LOCAL_DATE_TABLE
88 );
89
90 ------------------------------
91 -- Private Global Variables --
92 ------------------------------
93
94 G_PKG_NAME CONSTANT VARCHAR2(30) := 'EGO_USER_ATTRS_COMMON_PVT';
95 G_CURRENT_USER_ID NUMBER := FND_GLOBAL.User_Id;
96 G_CURRENT_LOGIN_ID NUMBER := FND_GLOBAL.Login_Id;
97
98 G_AG_METADATA_BATCH_1 EGO_ATTR_GROUP_BATCH_REC;
99 G_AG_METADATA_BATCH_2 EGO_ATTR_GROUP_BATCH_REC;
100 G_AG_METADATA_BATCH_3 EGO_ATTR_GROUP_BATCH_REC;
101 G_AG_METADATA_BATCH_4 EGO_ATTR_GROUP_BATCH_REC;
102 G_AG_METADATA_BATCH_5 EGO_ATTR_GROUP_BATCH_REC;
103
104 G_EXT_TABLE_METADATA_BATCH_1 EGO_EXT_TABLE_BATCH_REC;
105
106 G_DATA_LEVEL_METADATA_BATCH_1 EGO_DATA_LEVEL_BATCH_REC;
107
108 ----------------------------------------------------------------------
109
110 --------------------------------------
111 -- Caching Procedures and Functions --
112 --------------------------------------
113
114 ----------------------------------------------------------------------
115
116 procedure code_debug (msg IN VARCHAR2
117 ,debug_level IN NUMBER default 3
118 ) IS
119 BEGIN
120 null;
121 -- sri_debug('EGOPEFCB '||msg);
122 EGO_USER_ATTRS_DATA_PVT.Debug_Msg(msg , debug_level);
123 END code_debug;
124
125 ----------------------------------------------------------------------
126 PROCEDURE Reset_Cache_And_Globals
127 IS
128
129 l_null_ag_metadata_batch EGO_ATTR_GROUP_BATCH_REC;
130 l_null_ext_table_batch EGO_EXT_TABLE_BATCH_REC;
131 l_null_data_level_batch EGO_DATA_LEVEL_BATCH_REC;
132
133 BEGIN
134
135 G_CURRENT_USER_ID := FND_GLOBAL.User_Id;
136 G_CURRENT_LOGIN_ID := FND_GLOBAL.Login_Id;
137
138 G_AG_METADATA_BATCH_1 := l_null_ag_metadata_batch;
139 G_AG_METADATA_BATCH_2 := l_null_ag_metadata_batch;
140 G_AG_METADATA_BATCH_3 := l_null_ag_metadata_batch;
141 G_AG_METADATA_BATCH_4 := l_null_ag_metadata_batch;
142 G_AG_METADATA_BATCH_5 := l_null_ag_metadata_batch;
143 G_EXT_TABLE_METADATA_BATCH_1 := l_null_ext_table_batch;
144 G_DATA_LEVEL_METADATA_BATCH_1 := l_null_data_level_batch;
145
146 END Reset_Cache_And_Globals;
147
148 ----------------------------------------------------------------------
149
150 FUNCTION Find_Oldest_Element_Info (
151 p_access_times_table IN LOCAL_DATE_TABLE
152 ,x_oldest_time OUT NOCOPY DATE
153 )
154 RETURN NUMBER
155 IS
156
157 l_oldest_index NUMBER;
158 l_current_index NUMBER;
159
160 BEGIN
161
162 IF (p_access_times_table.COUNT > 0) THEN
163 x_oldest_time := SYSDATE;
164 l_oldest_index := l_current_index;
165 l_current_index := p_access_times_table.FIRST;
166 WHILE (l_current_index <= p_access_times_table.LAST)
167 LOOP
168
169 IF (p_access_times_table(l_current_index) < x_oldest_time) THEN
170 x_oldest_time := p_access_times_table(l_current_index);
171 l_oldest_index := l_current_index;
172 END IF;
173
174 l_current_index := p_access_times_table.NEXT(l_current_index);
175 END LOOP;
176 END IF;
177
178 RETURN l_oldest_index;
179
180 END Find_Oldest_Element_Info;
181
182 ----------------------------------------------------------------------
183
184 FUNCTION Is_Room_In_AG_Batch (
185 p_attr_group_batch_rec IN EGO_ATTR_GROUP_BATCH_REC
186 )
187 RETURN BOOLEAN
188 IS
189
190 BEGIN
191
192 RETURN (p_attr_group_batch_rec.access_times_table.COUNT < 10);
193
194 END Is_Room_In_AG_Batch;
195
196 ----------------------------------------------------------------------
197
198 FUNCTION Is_Room_In_ET_Batch (
199 p_ext_table_batch_rec IN EGO_EXT_TABLE_BATCH_REC
200 )
201 RETURN BOOLEAN
202 IS
203
204 BEGIN
205
206 RETURN (p_ext_table_batch_rec.access_times_table.COUNT < 5);
207
208 END Is_Room_In_ET_Batch;
209
210 ----------------------------------------------------------------------
211
212 FUNCTION Is_Room_In_DL_Batch (
213 p_data_level_batch_rec IN EGO_DATA_LEVEL_BATCH_REC
214 )
215 RETURN BOOLEAN
216 IS
217
218 BEGIN
219
220 RETURN (p_data_level_batch_rec.access_times_table.COUNT < 10);
221
222 END Is_Room_In_DL_Batch;
223
224 ----------------------------------------------------------------------
225
226
227 FUNCTION Find_Oldest_AG_Batch_Index
228 RETURN NUMBER
229 IS
230
231 l_dummy_index_variable NUMBER;
232 l_batch_1_oldest_time DATE;
233 l_batch_2_oldest_time DATE;
234 l_batch_3_oldest_time DATE;
235 l_batch_4_oldest_time DATE;
236 l_batch_5_oldest_time DATE;
237 l_oldest_batch_index NUMBER;
238
239 BEGIN
240
241 l_dummy_index_variable := Find_Oldest_Element_Info(G_AG_METADATA_BATCH_1.access_times_table, l_batch_1_oldest_time);
242 l_dummy_index_variable := Find_Oldest_Element_Info(G_AG_METADATA_BATCH_2.access_times_table, l_batch_2_oldest_time);
243 l_dummy_index_variable := Find_Oldest_Element_Info(G_AG_METADATA_BATCH_3.access_times_table, l_batch_3_oldest_time);
244 l_dummy_index_variable := Find_Oldest_Element_Info(G_AG_METADATA_BATCH_4.access_times_table, l_batch_4_oldest_time);
245 l_dummy_index_variable := Find_Oldest_Element_Info(G_AG_METADATA_BATCH_5.access_times_table, l_batch_5_oldest_time);
246
247 IF (l_batch_1_oldest_time < l_batch_2_oldest_time AND
248 l_batch_1_oldest_time < l_batch_3_oldest_time AND
249 l_batch_1_oldest_time < l_batch_4_oldest_time AND
250 l_batch_1_oldest_time < l_batch_5_oldest_time) THEN
251
252 l_oldest_batch_index := 1;
253
254 ELSIF (l_batch_2_oldest_time < l_batch_1_oldest_time AND
255 l_batch_2_oldest_time < l_batch_3_oldest_time AND
256 l_batch_2_oldest_time < l_batch_4_oldest_time AND
257 l_batch_2_oldest_time < l_batch_5_oldest_time) THEN
258
259 l_oldest_batch_index := 2;
260
261 ELSIF (l_batch_3_oldest_time < l_batch_1_oldest_time AND
262 l_batch_3_oldest_time < l_batch_2_oldest_time AND
263 l_batch_3_oldest_time < l_batch_4_oldest_time AND
264 l_batch_3_oldest_time < l_batch_5_oldest_time) THEN
265
266 l_oldest_batch_index := 3;
267
268 ELSIF (l_batch_4_oldest_time < l_batch_1_oldest_time AND
269 l_batch_4_oldest_time < l_batch_2_oldest_time AND
270 l_batch_4_oldest_time < l_batch_3_oldest_time AND
271 l_batch_4_oldest_time < l_batch_5_oldest_time) THEN
272
273 l_oldest_batch_index := 4;
274
275 ELSIF (l_batch_4_oldest_time < l_batch_1_oldest_time AND
276 l_batch_4_oldest_time < l_batch_2_oldest_time AND
277 l_batch_4_oldest_time < l_batch_3_oldest_time AND
278 l_batch_4_oldest_time < l_batch_4_oldest_time) THEN
279
280 l_oldest_batch_index := 5;
281
282 END IF;
283
284 RETURN l_oldest_batch_index;
285
286 END Find_Oldest_AG_Batch_Index;
287
288 ----------------------------------------------------------------------
289
290 FUNCTION Do_AG_PKs_Match (
291 p_attr_group_id IN NUMBER
292 ,p_application_id IN NUMBER
293 ,p_attr_group_type IN VARCHAR2
294 ,p_attr_group_name IN VARCHAR2
295 ,p_attr_group_metadata_obj IN EGO_ATTR_GROUP_METADATA_OBJ
296 )
297 RETURN BOOLEAN
298 IS
299
300 BEGIN
301
302 RETURN (p_attr_group_metadata_obj.ATTR_GROUP_ID = p_attr_group_id OR
303 (p_attr_group_metadata_obj.APPLICATION_ID = p_application_id AND
304 p_attr_group_metadata_obj.ATTR_GROUP_TYPE = p_attr_group_type AND
305 p_attr_group_metadata_obj.ATTR_GROUP_NAME = p_attr_group_name));
306
307 END Do_AG_PKs_Match;
308
309 ----------------------------------------------------------------------
310
311 FUNCTION Find_Attr_Group_In_Batch (
312 p_attr_group_id IN NUMBER
313 ,p_application_id IN NUMBER
314 ,p_attr_group_type IN VARCHAR2
315 ,p_attr_group_name IN VARCHAR2
316 ,px_attr_group_batch_rec IN OUT NOCOPY EGO_ATTR_GROUP_BATCH_REC
317 )
318 RETURN EGO_ATTR_GROUP_METADATA_OBJ
319 IS
320
321 l_attr_group_metadata_obj EGO_ATTR_GROUP_METADATA_OBJ;
322
323 BEGIN
324
325 IF (Do_AG_PKs_Match(p_attr_group_id, p_application_id
326 ,p_attr_group_type, p_attr_group_name
327 ,px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_1)) THEN
328
329 l_attr_group_metadata_obj := px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_1;
330 px_attr_group_batch_rec.access_times_table(1) := SYSDATE;
331
332 ELSIF (Do_AG_PKs_Match(p_attr_group_id, p_application_id
333 ,p_attr_group_type, p_attr_group_name
334 ,px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_2)) THEN
335
336 l_attr_group_metadata_obj := px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_2;
337 px_attr_group_batch_rec.access_times_table(2) := SYSDATE;
338
339 ELSIF (Do_AG_PKs_Match(p_attr_group_id, p_application_id
340 ,p_attr_group_type, p_attr_group_name
341 ,px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_3)) THEN
342
343 l_attr_group_metadata_obj := px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_3;
344 px_attr_group_batch_rec.access_times_table(3) := SYSDATE;
345
346 ELSIF (Do_AG_PKs_Match(p_attr_group_id, p_application_id
347 ,p_attr_group_type, p_attr_group_name
348 ,px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_4)) THEN
349
350 l_attr_group_metadata_obj := px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_4;
351 px_attr_group_batch_rec.access_times_table(4) := SYSDATE;
352
353 ELSIF (Do_AG_PKs_Match(p_attr_group_id, p_application_id
354 ,p_attr_group_type, p_attr_group_name
355 ,px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_5)) THEN
356
357 l_attr_group_metadata_obj := px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_5;
358 px_attr_group_batch_rec.access_times_table(5) := SYSDATE;
359
360 ELSIF (Do_AG_PKs_Match(p_attr_group_id, p_application_id
361 ,p_attr_group_type, p_attr_group_name
362 ,px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_6)) THEN
363
364 l_attr_group_metadata_obj := px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_6;
365 px_attr_group_batch_rec.access_times_table(6) := SYSDATE;
366
367 ELSIF (Do_AG_PKs_Match(p_attr_group_id, p_application_id
368 ,p_attr_group_type, p_attr_group_name
369 ,px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_7)) THEN
370
371 l_attr_group_metadata_obj := px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_7;
372 px_attr_group_batch_rec.access_times_table(7) := SYSDATE;
373
374 ELSIF (Do_AG_PKs_Match(p_attr_group_id, p_application_id
375 ,p_attr_group_type, p_attr_group_name
376 ,px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_8)) THEN
377
378 l_attr_group_metadata_obj := px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_8;
379 px_attr_group_batch_rec.access_times_table(8) := SYSDATE;
380
381 ELSIF (Do_AG_PKs_Match(p_attr_group_id, p_application_id
382 ,p_attr_group_type, p_attr_group_name
383 ,px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_9)) THEN
384
385 l_attr_group_metadata_obj := px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_9;
386 px_attr_group_batch_rec.access_times_table(9) := SYSDATE;
387
388 ELSIF (Do_AG_PKs_Match(p_attr_group_id, p_application_id
389 ,p_attr_group_type, p_attr_group_name
390 ,px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_10)) THEN
391
392 l_attr_group_metadata_obj := px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_10;
393 px_attr_group_batch_rec.access_times_table(10) := SYSDATE;
394
395 END IF;
396
397 RETURN l_attr_group_metadata_obj; --It may still be null here, and that's OK
398
399 END Find_Attr_Group_In_Batch;
400
401 ----------------------------------------------------------------------
402
403 FUNCTION Find_Attr_Group_In_Cache (
404 p_attr_group_id IN NUMBER
405 ,p_application_id IN NUMBER
406 ,p_attr_group_type IN VARCHAR2
407 ,p_attr_group_name IN VARCHAR2
408 )
409 RETURN EGO_ATTR_GROUP_METADATA_OBJ
410 IS
411
412 l_attr_group_metadata_obj EGO_ATTR_GROUP_METADATA_OBJ;
413
414 BEGIN
415
416 l_attr_group_metadata_obj := Find_Attr_Group_In_Batch(p_attr_group_id
417 ,p_application_id
418 ,p_attr_group_type
419 ,p_attr_group_name
420 ,G_AG_METADATA_BATCH_1);
421 IF (l_attr_group_metadata_obj IS NULL) THEN
422 l_attr_group_metadata_obj := Find_Attr_Group_In_Batch(p_attr_group_id
423 ,p_application_id
424 ,p_attr_group_type
425 ,p_attr_group_name
426 ,G_AG_METADATA_BATCH_2);
427 IF (l_attr_group_metadata_obj IS NULL) THEN
428 l_attr_group_metadata_obj := Find_Attr_Group_In_Batch(p_attr_group_id
429 ,p_application_id
430 ,p_attr_group_type
431 ,p_attr_group_name
432 ,G_AG_METADATA_BATCH_3);
433 IF (l_attr_group_metadata_obj IS NULL) THEN
434 l_attr_group_metadata_obj := Find_Attr_Group_In_Batch(p_attr_group_id
435 ,p_application_id
436 ,p_attr_group_type
437 ,p_attr_group_name
438 ,G_AG_METADATA_BATCH_4);
439 IF (l_attr_group_metadata_obj IS NULL) THEN
440 l_attr_group_metadata_obj := Find_Attr_Group_In_Batch(p_attr_group_id
441 ,p_application_id
442 ,p_attr_group_type
443 ,p_attr_group_name
444 ,G_AG_METADATA_BATCH_5);
445 END IF;
446 END IF;
447 END IF;
448 END IF;
449
450 RETURN l_attr_group_metadata_obj;
451
452 END Find_Attr_Group_In_Cache;
453
454 ----------------------------------------------------------------------
455
456 PROCEDURE Add_Attr_Group_To_Batch (
457 p_attr_group_metadata_obj IN EGO_ATTR_GROUP_METADATA_OBJ
458 ,p_replace_oldest_attr_group IN BOOLEAN
459 ,px_attr_group_batch_rec IN OUT NOCOPY EGO_ATTR_GROUP_BATCH_REC
460 ) IS
461
462 l_oldest_rec_index NUMBER;
463 l_dummy_time_variable DATE;
464 l_access_times_table LOCAL_DATE_TABLE;
465
466 BEGIN
467
468 IF (p_replace_oldest_attr_group) THEN
469 l_oldest_rec_index := Find_Oldest_Element_Info(px_attr_group_batch_rec.access_times_table, l_dummy_time_variable);
470 END IF;
471
472 IF (px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_1 IS NULL OR
473 l_oldest_rec_index = 1) THEN
474
475 px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_1 := p_attr_group_metadata_obj;
476 px_attr_group_batch_rec.access_times_table(1) := SYSDATE;
477
478 ELSIF (px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_2 IS NULL OR
479 l_oldest_rec_index = 2) THEN
480
481 px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_2 := p_attr_group_metadata_obj;
482 px_attr_group_batch_rec.access_times_table(2) := SYSDATE;
483
484 ELSIF (px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_3 IS NULL OR
485 l_oldest_rec_index = 3) THEN
486
487 px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_3 := p_attr_group_metadata_obj;
488 px_attr_group_batch_rec.access_times_table(3) := SYSDATE;
489
490 ELSIF (px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_4 IS NULL OR
491 l_oldest_rec_index = 4) THEN
492
493 px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_4 := p_attr_group_metadata_obj;
494 px_attr_group_batch_rec.access_times_table(4) := SYSDATE;
495
496 ELSIF (px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_5 IS NULL OR
497 l_oldest_rec_index = 5) THEN
498
499 px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_5 := p_attr_group_metadata_obj;
500 px_attr_group_batch_rec.access_times_table(5) := SYSDATE;
501
502 ELSIF (px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_6 IS NULL OR
503 l_oldest_rec_index = 6) THEN
504
505 px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_6 := p_attr_group_metadata_obj;
506 px_attr_group_batch_rec.access_times_table(6) := SYSDATE;
507
508 ELSIF (px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_7 IS NULL OR
509 l_oldest_rec_index = 7) THEN
510
511 px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_7 := p_attr_group_metadata_obj;
512 px_attr_group_batch_rec.access_times_table(7) := SYSDATE;
513
514 ELSIF (px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_8 IS NULL OR
515 l_oldest_rec_index = 8) THEN
516
517 px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_8 := p_attr_group_metadata_obj;
518 px_attr_group_batch_rec.access_times_table(8) := SYSDATE;
519
520 ELSIF (px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_9 IS NULL OR
521 l_oldest_rec_index = 9) THEN
522
523 px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_9 := p_attr_group_metadata_obj;
524 px_attr_group_batch_rec.access_times_table(9) := SYSDATE;
525
526 ELSIF (px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_10 IS NULL OR
527 l_oldest_rec_index = 10) THEN
528
529 px_attr_group_batch_rec.CACHED_ATTR_GROUP_METADATA_10 := p_attr_group_metadata_obj;
530 px_attr_group_batch_rec.access_times_table(10) := SYSDATE;
531
532 END IF;
533
534 END Add_Attr_Group_To_Batch;
535
536 ----------------------------------------------------------------------
537
538 PROCEDURE Add_Attr_Group_To_Cache (
539 p_attr_group_metadata_obj IN EGO_ATTR_GROUP_METADATA_OBJ
540 ) IS
541
542 l_index_of_batch_to_update NUMBER;
543
544 BEGIN
545
546 IF (Is_Room_In_AG_Batch(G_AG_METADATA_BATCH_1)) THEN
547
548 Add_Attr_Group_To_Batch(p_attr_group_metadata_obj
549 ,FALSE
550 ,G_AG_METADATA_BATCH_1);
551
552 ELSIF (Is_Room_In_AG_Batch(G_AG_METADATA_BATCH_2)) THEN
553
554 Add_Attr_Group_To_Batch(p_attr_group_metadata_obj
555 ,FALSE
556 ,G_AG_METADATA_BATCH_2);
557
558 ELSIF (Is_Room_In_AG_Batch(G_AG_METADATA_BATCH_3)) THEN
559
560 Add_Attr_Group_To_Batch(p_attr_group_metadata_obj
561 ,FALSE
562 ,G_AG_METADATA_BATCH_3);
563
564 ELSIF (Is_Room_In_AG_Batch(G_AG_METADATA_BATCH_4)) THEN
565
566 Add_Attr_Group_To_Batch(p_attr_group_metadata_obj
567 ,FALSE
568 ,G_AG_METADATA_BATCH_4);
569
570 ELSIF (Is_Room_In_AG_Batch(G_AG_METADATA_BATCH_5)) THEN
571
572 Add_Attr_Group_To_Batch(p_attr_group_metadata_obj
573 ,FALSE
574 ,G_AG_METADATA_BATCH_5);
575
576 ELSE
577
578 l_index_of_batch_to_update := Find_Oldest_AG_Batch_Index();
579
580 IF (l_index_of_batch_to_update = 1) THEN
581 Add_Attr_Group_To_Batch(p_attr_group_metadata_obj
582 ,TRUE
583 ,G_AG_METADATA_BATCH_1);
584 ELSIF (l_index_of_batch_to_update = 2) THEN
585 Add_Attr_Group_To_Batch(p_attr_group_metadata_obj
586 ,TRUE
587 ,G_AG_METADATA_BATCH_2);
588 ELSIF (l_index_of_batch_to_update = 3) THEN
589 Add_Attr_Group_To_Batch(p_attr_group_metadata_obj
590 ,TRUE
591 ,G_AG_METADATA_BATCH_3);
592 ELSIF (l_index_of_batch_to_update = 4) THEN
593 Add_Attr_Group_To_Batch(p_attr_group_metadata_obj
594 ,TRUE
595 ,G_AG_METADATA_BATCH_4);
596 ELSIF (l_index_of_batch_to_update = 5) THEN
597 Add_Attr_Group_To_Batch(p_attr_group_metadata_obj
598 ,TRUE
599 ,G_AG_METADATA_BATCH_5);
600 END IF;
601 END IF;
602
603 END Add_Attr_Group_To_Cache;
604
605 ----------------------------------------------------------------------
606
607 PROCEDURE Remove_OrderBy_Clause(
608 px_where_clause IN OUT NOCOPY VARCHAR2
609 ) IS
610
611 l_search_ordby_clause LONG;
612 l_ord_index NUMBER;
613 l_by_index NUMBER;
614 l_last_ord_index NUMBER;
615 --bug 5119374
616 l_has_order_by BOOLEAN := FALSE;
617
618 BEGIN
619 -- initialize variables
620
621 l_search_ordby_clause := UPPER(px_where_clause);
622 l_ord_index := INSTR(l_search_ordby_clause, 'ORDER ');
623
624 IF l_ord_index <> 0 THEN
625 l_last_ord_index := l_ord_index;
626 --bug 5119374
627 l_has_order_by :=TRUE;
628 ELSE
629 l_last_ord_index := length(px_where_clause);
630 END IF;
631
632 -- find the index of the last 'ORDER BY' clause
633
634 WHILE (l_ord_index <> 0) LOOP
635 l_by_index := INSTR(SUBSTR(l_search_ordby_clause, l_ord_index + 5), 'BY ');
636 IF l_by_index <> 0 THEN
637 l_search_ordby_clause := SUBSTR(l_search_ordby_clause, l_ord_index + 5 + l_by_index + 2);
638 l_ord_index := INSTR(l_search_ordby_clause, 'ORDER ');
639
640 -- if there are more 'ORDER BY' clauses, increment index:
641 -- l_last_ord_index += 5 letters for 'ORDER' +
642 -- + index of 'BY' + 2 letters for 'BY'
643 -- + (index of the next 'ORDER BY' - 1)
644
645 IF l_ord_index <> 0 THEN
646 l_last_ord_index := l_last_ord_index + 5 + l_by_index + 2 + l_ord_index - 1;
647 END IF;
648 ELSE
649 l_ord_index := 0;
650 END IF;
651 END LOOP;
652
653 -- if there is a close bracket: 'ORDER BY' clause is nested -> do nothing
654 -- if no close bracket, remove 'ORDER BY' clause
655 -- if after ORDER BY both '(' and also ')' exist then is not a subquery if and only if there is again no ')' after the previous
656 -- checks. e.g. "ORDER BY TO_NUMBER()" or "ORDER BY TO_NUMBER(X) ) "
657 -- ^ for closing the subquery
658 IF (l_has_order_by
659 AND ( INSTR(l_search_ordby_clause, ')') = 0
660 OR ( INSTR(l_search_ordby_clause, '(') <> 0
661 AND INSTR(l_search_ordby_clause, ')') <> 0
662 AND INSTR(SUBSTR(l_search_ordby_clause, INSTR(l_search_ordby_clause,')') + 1 ), ')' ) = 0
663 )
664 )
665 ) THEN --bug 5119374
666 px_where_clause := RTRIM(SUBSTR(px_where_clause, 0, l_last_ord_index - 1));
667 END IF;
668
669 END Remove_OrderBy_Clause;
670
671 ----------------------------------------------------------------------
672
673 PROCEDURE Build_Sql_Queries_For_Value (
674 p_value_set_id IN NUMBER
675 ,p_validation_code IN VARCHAR2
676 ,px_attr_group_metadata_obj IN OUT NOCOPY EGO_ATTR_GROUP_METADATA_OBJ
677 ,px_attr_metadata_obj IN OUT NOCOPY EGO_ATTR_METADATA_OBJ
678 ) IS
679
680 l_validation_table_info_row EGO_VALIDATION_TABLE_INFO_V%ROWTYPE;
681 l_column_name VARCHAR2(4000); -- Bug 4030107
682 l_where_clause LONG;
683
684 BEGIN
685
686 IF (p_validation_code = EGO_EXT_FWK_PUB.G_INDEPENDENT_VALIDATION_CODE OR p_validation_code = EGO_EXT_FWK_PUB.G_TRANS_IND_VALIDATION_CODE) THEN
687
688 --------------------------------------------------------------------
689 -- We only use this query, which has the Value Set ID hard-coded, --
690 -- in Get_User_Attrs_Data; elsewhere we use a dynamic version of --
691 -- the query that uses a bind variable in place of the VS ID, so --
692 -- that the SQL engine doesn't have to re-parse for each VS ID --
693 --------------------------------------------------------------------
694 px_attr_metadata_obj.INT_TO_DISP_VAL_QUERY := 'SELECT DISTINCT DISPLAY_NAME '||
695 'FROM EGO_VALUE_SET_VALUES_V '||
696 'WHERE VALUE_SET_ID = '||p_value_set_id||
697 ' AND ENABLED_CODE = ''Y'' '||
698 'AND (NVL(START_DATE, SYSDATE - 1) < SYSDATE) '||
699 'AND (NVL(END_DATE, SYSDATE + 1) > SYSDATE) '||
700 'AND INTERNAL_NAME = ';
701
702 ELSIF (p_validation_code = EGO_EXT_FWK_PUB.G_TABLE_VALIDATION_CODE) THEN
703 SELECT APPLICATION_TABLE_NAME
704 ,ID_COLUMN_NAME
705 ,VALUE_COLUMN_NAME
706 ,ADDITIONAL_WHERE_CLAUSE
707 INTO l_validation_table_info_row.APPLICATION_TABLE_NAME
708 ,l_validation_table_info_row.ID_COLUMN_NAME
709 ,l_validation_table_info_row.VALUE_COLUMN_NAME
710 ,l_validation_table_info_row.ADDITIONAL_WHERE_CLAUSE
711 FROM FND_FLEX_VALIDATION_TABLES
712 WHERE FLEX_VALUE_SET_ID = p_value_set_id;
713
714 IF (l_validation_table_info_row.ID_COLUMN_NAME IS NOT NULL) THEN
715 l_column_name := l_validation_table_info_row.ID_COLUMN_NAME;
716 ELSE
717 l_column_name := l_validation_table_info_row.VALUE_COLUMN_NAME;
718 END IF;
719
720 ---------------------------------
721 -- Trim off any leading spaces --
722 ---------------------------------
723 l_where_clause := LTRIM(l_validation_table_info_row.ADDITIONAL_WHERE_CLAUSE);
724
725 ---------------------------------------------
726 -- Check whether the trimmed string starts --
727 -- with 'WHERE'; if so, trim the 'WHERE' --
728 ---------------------------------------------
729 IF (INSTR(UPPER(SUBSTR(l_where_clause, 1, 6)), 'WHERE') <> 0) THEN
730 l_where_clause := SUBSTR(l_where_clause, 6);
731 END IF;
732 Remove_OrderBy_Clause(l_where_clause);
733 -----------------------------------------------------
734 -- Now, if where clause is non-empty, add an 'AND' --
735 -- so that we can append our own where criteria --
736 -----------------------------------------------------
737 IF (LENGTH(l_where_clause) > 0) THEN
738
739 ------------------------------------------------------
740 -- In case the where clause has new line or tabs --
741 -- we need to remove it BugFix:4101091 --
742 ------------------------------------------------------
743 SELECT REPLACE(l_where_clause,FND_GLOBAL.LOCAL_CHR(10),FND_GLOBAL.LOCAL_CHR(32)) INTO l_where_clause FROM dual; --replacing new line character
744 SELECT REPLACE(l_where_clause,FND_GLOBAL.LOCAL_CHR(13),FND_GLOBAL.LOCAL_CHR(32)) INTO l_where_clause FROM dual; --removing carriage return
745 -------------------------------------------------------------------------
746 -- well if there is still some special character left we cant help it. --
747 -------------------------------------------------------------------------
748
749 ------------------------------------------------------
750 -- In case the where clause starts with an Order By --
751 -- we need to add a 1=1 before the order by --
752 ------------------------------------------------------
753 IF ( INSTR(LTRIM(UPPER(l_where_clause)),'ORDER ') = 1 ) THEN
754 IF (INSTR(UPPER(
755 SUBSTR(LTRIM(l_where_clause),INSTR(LTRIM(UPPER(l_where_clause)),'ORDER ')+6 )
756 ),'BY ') <> 0) THEN
757 l_where_clause := ' 1=1 ' || l_where_clause ;
758 END IF;
759 END IF;
760
761 l_where_clause := ' AND ' || l_where_clause ; --BugFix: 4101266 we need to have a wrapper select statement on top of
762 --the value set query and have our where clause on the outer select.
763 ----------------------------------------------------------------------
764 -- If the where clause has an Attribute bind value, set the flag so --
765 -- we'll know to sort Attr values for the AG in Validate_Row (which --
766 -- we need to do to ensure that all bind values have been replaced --
767 -- by the time they're needed as token replacements); also mark the --
768 -- Attribute so that when we do sort, it will go at the end --
769 ----------------------------------------------------------------------
770 IF (INSTR(UPPER(l_where_clause), ':$ATTRIBUTEGROUP$.') > 0) THEN
771
772 px_attr_group_metadata_obj.SORT_ATTR_VALUES_FLAG := 'Y';
773
774 IF (px_attr_metadata_obj.VS_BIND_VALUES_CODE = 'O') THEN
775 px_attr_metadata_obj.VS_BIND_VALUES_CODE := 'B';
776 ELSE
777 px_attr_metadata_obj.VS_BIND_VALUES_CODE := 'A';
778 END IF;
779
780 ELSIF (INSTR(UPPER(l_where_clause), ':$OBJECT$.') > 0) THEN
781
782 IF (px_attr_metadata_obj.VS_BIND_VALUES_CODE = 'A') THEN
783 px_attr_metadata_obj.VS_BIND_VALUES_CODE := 'B';
784 ELSE
785 px_attr_metadata_obj.VS_BIND_VALUES_CODE := 'O';
786 END IF;
787
788 END IF;
789
790 END IF;
791
792 px_attr_metadata_obj.DISP_TO_INT_VAL_QUERY := 'SELECT DISTINCT '||l_column_name ||
793 ' FROM '||l_validation_table_info_row.APPLICATION_TABLE_NAME||
794 ' WHERE 1=1 '||l_where_clause||' AND '||
795 l_validation_table_info_row.VALUE_COLUMN_NAME ||' = ';
796
797 /***
798 TO DO: see if you can move the Additional Where Clause to the end (in case
799 the user passes something like a :1); wait, does that even matter? Won't
800 it break anyway?
801 Investigate.
802 ***/
803
804 px_attr_metadata_obj.INT_TO_DISP_VAL_QUERY := 'SELECT DISTINCT '|| l_validation_table_info_row.VALUE_COLUMN_NAME||
805 ' FROM '||l_validation_table_info_row.APPLICATION_TABLE_NAME||
806 ' WHERE 1=1 '||l_where_clause||' AND '||
807 l_column_name||' = ';
808
809 END IF;
810
811 END Build_Sql_Queries_For_Value;
812
813 ----------------------------------------------------------------------
814
815 PROCEDURE Build_Attr_Metadata_Table (
816 px_attr_group_metadata_obj IN OUT NOCOPY EGO_ATTR_GROUP_METADATA_OBJ
817 ) IS
818
819 l_attr_metadata_table EGO_ATTR_METADATA_TABLE := EGO_ATTR_METADATA_TABLE();
820 l_attr_metadata_obj EGO_ATTR_METADATA_OBJ;
821 l_sql_query LONG;
822
823 CURSOR attrs_cursor (
824 cp_application_id IN NUMBER
825 ,cp_attr_group_type IN VARCHAR2
826 ,cp_attr_group_name IN VARCHAR2
827 ) IS
828 SELECT EXT.ATTR_ID,
829 FLX_EXT.ATTR_GROUP_ID,
830 A.END_USER_COLUMN_NAME,
831 TL.FORM_LEFT_PROMPT,
832 EXT.DATA_TYPE,
833 FC.MEANING DATA_TYPE_MEANING,
834 A.COLUMN_SEQ_NUM,
835 EXT.UNIQUE_KEY_FLAG,
836 A.DEFAULT_VALUE,
837 EXT.INFO_1,
838 VS.MAXIMUM_SIZE,
839 A.REQUIRED_FLAG,
840 A.APPLICATION_COLUMN_NAME,
841 VS.FLEX_VALUE_SET_ID,
842 VS.VALIDATION_TYPE,
843 VS.MINIMUM_VALUE,
844 VS.MAXIMUM_VALUE,
845 EXT.UOM_CLASS,
846 UOM.UOM_CODE,
847 EXT.VIEW_IN_HIERARCHY_CODE,
848 EXT.EDIT_IN_HIERARCHY_CODE
849 FROM EGO_FND_DSC_FLX_CTX_EXT FLX_EXT,
850 FND_DESCR_FLEX_COLUMN_USAGES A,
851 FND_DESCR_FLEX_COL_USAGE_TL TL,
852 EGO_FND_DF_COL_USGS_EXT EXT,
853 EGO_VS_FORMAT_CODES_V FC,
854 FND_FLEX_VALUE_SETS VS,
855 MTL_UNITS_OF_MEASURE UOM
856 WHERE FLX_EXT.APPLICATION_ID = cp_application_id
857 AND FLX_EXT.DESCRIPTIVE_FLEXFIELD_NAME = cp_attr_group_type
858 AND FLX_EXT.DESCRIPTIVE_FLEX_CONTEXT_CODE = cp_attr_group_name
859 AND A.APPLICATION_ID = cp_application_id
860 AND A.DESCRIPTIVE_FLEXFIELD_NAME = cp_attr_group_type
861 AND A.DESCRIPTIVE_FLEX_CONTEXT_CODE = cp_attr_group_name
862 AND TL.APPLICATION_ID = cp_application_id
863 AND TL.DESCRIPTIVE_FLEXFIELD_NAME = cp_attr_group_type
864 AND TL.DESCRIPTIVE_FLEX_CONTEXT_CODE = cp_attr_group_name
865 AND EXT.APPLICATION_ID = cp_application_id
866 AND EXT.DESCRIPTIVE_FLEXFIELD_NAME = cp_attr_group_type
867 AND EXT.DESCRIPTIVE_FLEX_CONTEXT_CODE = cp_attr_group_name
868 AND FC.LOOKUP_CODE(+) = EXT.DATA_TYPE
869 AND A.ENABLED_FLAG = 'Y'
870 AND TL.APPLICATION_COLUMN_NAME = A.APPLICATION_COLUMN_NAME
871 AND TL.LANGUAGE = USERENV('LANG')
872 AND EXT.APPLICATION_COLUMN_NAME = A.APPLICATION_COLUMN_NAME
873 AND A.FLEX_VALUE_SET_ID = VS.FLEX_VALUE_SET_ID (+)
874 AND UOM.UOM_CLASS(+) = EXT.UOM_CLASS
875 AND UOM.BASE_UOM_FLAG(+) = 'Y'
876 ORDER BY A.COLUMN_SEQ_NUM;
877
878 BEGIN
879
880 ----------------------------------------------------------------------------
881 -- The SORT_ATTR_VALUES_FLAG flag records whether any Attributes in this --
882 -- collection have a Value Set of type "Table"; if so, we will need to --
883 -- sort the Attr values when we process a row in order to ensure that any --
884 -- bind values needed by the Value Set are converted before the Value Set --
885 -- is processed --
886 ----------------------------------------------------------------------------
887
888 -------------------------------------------------------
889 -- The UNIQUE_KEY_ATTRS_COUNT records how many Attrs --
890 -- in this Attribute Group are part of a Unique Key --
891 -------------------------------------------------------
892
893 --------------------------------------------------------------------
894 -- The TRANS_ATTRS_COUNT records how many translatable Attributes --
895 -- this Attribute Group has; it will be used in Update_Row --
896 --------------------------------------------------------------------
897
898 FOR attrs_rec IN attrs_cursor(px_attr_group_metadata_obj.APPLICATION_ID
899 ,px_attr_group_metadata_obj.ATTR_GROUP_TYPE
900 ,px_attr_group_metadata_obj.ATTR_GROUP_NAME)
901 LOOP
902 l_attr_metadata_obj := EGO_ATTR_METADATA_OBJ(
903 attrs_rec.ATTR_ID
904 ,attrs_rec.ATTR_GROUP_ID
905 ,px_attr_group_metadata_obj.ATTR_GROUP_NAME
906 ,attrs_rec.END_USER_COLUMN_NAME
907 ,attrs_rec.FORM_LEFT_PROMPT
908 ,attrs_rec.DATA_TYPE
909 ,attrs_rec.DATA_TYPE_MEANING
910 ,attrs_rec.COLUMN_SEQ_NUM
911 ,attrs_rec.UNIQUE_KEY_FLAG
912 ,attrs_rec.DEFAULT_VALUE
913 ,attrs_rec.INFO_1
914 ,attrs_rec.MAXIMUM_SIZE
915 ,attrs_rec.REQUIRED_FLAG
916 ,attrs_rec.APPLICATION_COLUMN_NAME
917 ,attrs_rec.FLEX_VALUE_SET_ID
918 ,attrs_rec.VALIDATION_TYPE
919 ,attrs_rec.MINIMUM_VALUE
920 ,attrs_rec.MAXIMUM_VALUE
921 ,attrs_rec.UOM_CLASS
922 ,attrs_rec.UOM_CODE
923 ,null -- DISP_TO_INT_VAL_QUERY
924 ,null -- INT_TO_DISP_VAL_QUERY
925 ,'N'
926 ,attrs_rec.VIEW_IN_HIERARCHY_CODE
927 ,attrs_rec.EDIT_IN_HIERARCHY_CODE
928 );
929
930 IF (attrs_rec.UNIQUE_KEY_FLAG = 'Y') THEN
931
932 px_attr_group_metadata_obj.UNIQUE_KEY_ATTRS_COUNT :=
933 px_attr_group_metadata_obj.UNIQUE_KEY_ATTRS_COUNT + 1;
934
935 END IF;
936
937 IF (attrs_rec.DATA_TYPE = EGO_EXT_FWK_PUB.G_TRANS_TEXT_DATA_TYPE) THEN
938
939 px_attr_group_metadata_obj.TRANS_ATTRS_COUNT :=
940 px_attr_group_metadata_obj.TRANS_ATTRS_COUNT + 1;
941
942 END IF;
943
944 IF (attrs_rec.VALIDATION_TYPE = EGO_EXT_FWK_PUB.G_INDEPENDENT_VALIDATION_CODE OR
945 attrs_rec.VALIDATION_TYPE = EGO_EXT_FWK_PUB.G_TABLE_VALIDATION_CODE OR
946 attrs_rec.VALIDATION_TYPE = EGO_EXT_FWK_PUB.G_TRANS_IND_VALIDATION_CODE) THEN--Bug fix 4645598
947
948 -----------------------------------------------------------------
949 -- If this Attribute has a Value Set with Internal and Display --
950 -- Values, we build SQL to transform one into the other (and --
951 -- if the Value Set is of type "Table", we set the sort flag --
952 -- in our Attribute Group metadata object to 'Y') --
953 -----------------------------------------------------------------
954
955 Build_Sql_Queries_For_Value(attrs_rec.FLEX_VALUE_SET_ID
956 ,attrs_rec.VALIDATION_TYPE
957 ,px_attr_group_metadata_obj
958 ,l_attr_metadata_obj);
959 END IF;
960
961 ------------------------------------------------------------------
962 -- For hierarchy security, we need to keep track of whether any --
963 -- of the attributes requires propagation (EIH code of LP/AP) --
964 -- for leaf/all propagation --
965 ------------------------------------------------------------------
966 IF (attrs_rec.EDIT_IN_HIERARCHY_CODE = 'LP' OR
967 attrs_rec.EDIT_IN_HIERARCHY_CODE = 'AP') THEN
968
969 px_attr_group_metadata_obj.HIERARCHY_PROPAGATE_FLAG := 'Y';
970 code_debug('In Build_Attr_Metadata_Table, found LP/AP: '||px_attr_group_metadata_obj.ATTR_GROUP_NAME||' '||attrs_rec.ATTR_ID, 2);
971
972 END IF;
973
974 l_attr_metadata_table.EXTEND();
975 l_attr_metadata_table(l_attr_metadata_table.LAST) := l_attr_metadata_obj;
976
977 END LOOP;
978
979 px_attr_group_metadata_obj.attr_metadata_table := l_attr_metadata_table;
980
981 END Build_Attr_Metadata_Table;
982
983 ----------------------------------------------------------------------
984
985 FUNCTION Get_Attr_Group_Metadata (
986 p_attr_group_id IN NUMBER DEFAULT NULL
987 ,p_application_id IN NUMBER DEFAULT NULL
988 ,p_attr_group_type IN VARCHAR2 DEFAULT NULL
989 ,p_attr_group_name IN VARCHAR2 DEFAULT NULL
990 ,p_pick_from_cache IN BOOLEAN DEFAULT TRUE
991 )
992 RETURN EGO_ATTR_GROUP_METADATA_OBJ
993 IS
994
995 l_table_index NUMBER;
996 l_attr_group_metadata_obj EGO_ATTR_GROUP_METADATA_OBJ;
997
998 BEGIN
999
1000 IF (p_pick_from_cache) THEN
1001 l_attr_group_metadata_obj := Find_Attr_Group_In_Cache(p_attr_group_id
1002 ,p_application_id
1003 ,p_attr_group_type
1004 ,p_attr_group_name);
1005 ELSE
1006 l_attr_group_metadata_obj := NULL;
1007 END IF;
1008 code_debug('in Get_Attr_Group_Metadata 1');
1009 ---------------------------------------------------------
1010 -- If we don't have cached data, we query in order to --
1011 -- build a record, which we then cache and also return --
1012 ---------------------------------------------------------
1013 IF (l_attr_group_metadata_obj IS NULL) THEN
1014
1015 l_attr_group_metadata_obj := EGO_ATTR_GROUP_METADATA_OBJ(
1016 p_attr_group_id
1017 ,p_application_id
1018 ,p_attr_group_type
1019 ,p_attr_group_name
1020 ,null -- ATTR_GROUP_DISP_NAME
1021 ,null -- AGV_NAME
1022 ,null -- MULTI_ROW_CODE
1023 ,null -- VIEW_PRIVILEGE
1024 ,null -- EDIT_PRIVILEGE
1025 ,null -- EXT_TABLE_B_NAME
1026 ,null -- EXT_TABLE_TL_NAME
1027 ,null -- EXT_TABLE_VL_NAME
1028 ,'N' -- SORT_ATTR_VALUES_FLAG
1029 ,0 -- UNIQUE_KEY_ATTRS_COUNT
1030 ,0 -- TRANS_ATTRS_COUNT
1031 ,null -- attr_metadata_table
1032 ,null -- ATTR_GROUP_ID_FLAG
1033 ,null -- HIERARCHY_NODE_QUERY
1034 ,null -- HIERARCHY_PROPAGATION_API
1035 ,null -- HIERARCHY_PROPAGATE_FLAG
1036 ,null -- ENABLED_DATA_LEVELS(EGO_DATA_LEVEL_TABLE)
1037 ,null -- VARIANT_CODE
1038 );
1039
1040 ---------------------------------------------------------
1041 -- We query only on Attribute Groups that are enabled. --
1042 -- If we have the three Attribute Group Primary Keys, --
1043 -- we use them; otherwise, we assume the ATTR_GROUP_ID --
1044 -- was passed in, and we use it to query. --
1045 ---------------------------------------------------------
1046 IF (l_attr_group_metadata_obj.APPLICATION_ID IS NOT NULL AND
1047 l_attr_group_metadata_obj.ATTR_GROUP_TYPE IS NOT NULL AND
1048 l_attr_group_metadata_obj.ATTR_GROUP_NAME IS NOT NULL) THEN
1049
1050 SELECT EXT.ATTR_GROUP_ID
1051 ,FLX_TL.DESCRIPTIVE_FLEX_CONTEXT_NAME
1052 ,EXT.AGV_NAME
1053 ,EXT.MULTI_ROW
1054 ,VPF.FUNCTION_NAME
1055 ,EPF.FUNCTION_NAME
1056 ,FLX.APPLICATION_TABLE_NAME
1057 ,FLX_EXT.APPLICATION_TL_TABLE_NAME
1058 ,FLX_EXT.APPLICATION_VL_NAME
1059 ,FLX_EXT.HIERARCHY_NODE_QUERY
1060 ,FLX_EXT.HIERARCHY_PROPAGATION_API
1061 ,EXT.VARIANT
1062 INTO l_attr_group_metadata_obj.ATTR_GROUP_ID
1063 ,l_attr_group_metadata_obj.ATTR_GROUP_DISP_NAME
1064 ,l_attr_group_metadata_obj.AGV_NAME
1065 ,l_attr_group_metadata_obj.MULTI_ROW_CODE
1066 ,l_attr_group_metadata_obj.VIEW_PRIVILEGE
1067 ,l_attr_group_metadata_obj.EDIT_PRIVILEGE
1068 ,l_attr_group_metadata_obj.EXT_TABLE_B_NAME
1069 ,l_attr_group_metadata_obj.EXT_TABLE_TL_NAME
1070 ,l_attr_group_metadata_obj.EXT_TABLE_VL_NAME
1071 ,l_attr_group_metadata_obj.HIERARCHY_NODE_QUERY
1072 ,l_attr_group_metadata_obj.HIERARCHY_PROPAGATION_API
1073 ,l_attr_group_metadata_obj.VARIANT
1074 FROM EGO_FND_DSC_FLX_CTX_EXT EXT
1075 ,FND_DESCRIPTIVE_FLEXS FLX
1076 ,FND_FORM_FUNCTIONS VPF
1077 ,FND_FORM_FUNCTIONS EPF
1078 ,FND_DESCR_FLEX_CONTEXTS_TL FLX_TL
1079 ,EGO_FND_DESC_FLEXS_EXT FLX_EXT
1080 WHERE EXT.APPLICATION_ID = p_application_id
1081 AND EXT.DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
1082 AND EXT.DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
1083 AND VPF.FUNCTION_ID(+) = EXT.VIEW_PRIVILEGE_ID
1084 AND EPF.FUNCTION_ID(+) = EXT.EDIT_PRIVILEGE_ID
1085 AND FLX_TL.APPLICATION_ID = EXT.APPLICATION_ID
1086 AND FLX_TL.DESCRIPTIVE_FLEXFIELD_NAME = EXT.DESCRIPTIVE_FLEXFIELD_NAME
1087 AND FLX_TL.DESCRIPTIVE_FLEX_CONTEXT_CODE = EXT.DESCRIPTIVE_FLEX_CONTEXT_CODE
1088 AND FLX_TL.LANGUAGE = USERENV('LANG')
1089 AND FLX.APPLICATION_ID = EXT.APPLICATION_ID
1090 AND FLX.DESCRIPTIVE_FLEXFIELD_NAME = EXT.DESCRIPTIVE_FLEXFIELD_NAME
1091 AND FLX_EXT.APPLICATION_ID(+) = EXT.APPLICATION_ID
1092 AND FLX_EXT.DESCRIPTIVE_FLEXFIELD_NAME(+) = EXT.DESCRIPTIVE_FLEXFIELD_NAME;
1093
1094 ELSE
1095
1096 SELECT EXT.APPLICATION_ID
1097 ,EXT.DESCRIPTIVE_FLEXFIELD_NAME
1098 ,EXT.DESCRIPTIVE_FLEX_CONTEXT_CODE
1099 ,FLX_TL.DESCRIPTIVE_FLEX_CONTEXT_NAME
1100 ,EXT.AGV_NAME
1101 ,EXT.MULTI_ROW
1102 ,VPF.FUNCTION_NAME
1103 ,EPF.FUNCTION_NAME
1104 ,FLX.APPLICATION_TABLE_NAME
1105 ,FLX_EXT.APPLICATION_TL_TABLE_NAME
1106 ,FLX_EXT.APPLICATION_VL_NAME
1107 ,FLX_EXT.HIERARCHY_NODE_QUERY
1108 ,FLX_EXT.HIERARCHY_PROPAGATION_API
1109 ,EXT.VARIANT
1110 INTO l_attr_group_metadata_obj.APPLICATION_ID
1111 ,l_attr_group_metadata_obj.ATTR_GROUP_TYPE
1112 ,l_attr_group_metadata_obj.ATTR_GROUP_NAME
1113 ,l_attr_group_metadata_obj.ATTR_GROUP_DISP_NAME
1114 ,l_attr_group_metadata_obj.AGV_NAME
1115 ,l_attr_group_metadata_obj.MULTI_ROW_CODE
1116 ,l_attr_group_metadata_obj.VIEW_PRIVILEGE
1117 ,l_attr_group_metadata_obj.EDIT_PRIVILEGE
1118 ,l_attr_group_metadata_obj.EXT_TABLE_B_NAME
1119 ,l_attr_group_metadata_obj.EXT_TABLE_TL_NAME
1120 ,l_attr_group_metadata_obj.EXT_TABLE_VL_NAME
1121 ,l_attr_group_metadata_obj.HIERARCHY_NODE_QUERY
1122 ,l_attr_group_metadata_obj.HIERARCHY_PROPAGATION_API
1123 ,l_attr_group_metadata_obj.VARIANT
1124 FROM EGO_FND_DSC_FLX_CTX_EXT EXT
1125 ,FND_FORM_FUNCTIONS VPF
1126 ,FND_FORM_FUNCTIONS EPF
1127 ,FND_DESCR_FLEX_CONTEXTS_TL FLX_TL
1128 ,FND_DESCRIPTIVE_FLEXS FLX
1129 ,EGO_FND_DESC_FLEXS_EXT FLX_EXT
1130 WHERE EXT.ATTR_GROUP_ID = l_attr_group_metadata_obj.ATTR_GROUP_ID
1131 AND VPF.FUNCTION_ID(+) = EXT.VIEW_PRIVILEGE_ID
1132 AND EPF.FUNCTION_ID(+) = EXT.EDIT_PRIVILEGE_ID
1133 AND EXT.APPLICATION_ID = FLX_TL.APPLICATION_ID
1134 AND EXT.DESCRIPTIVE_FLEXFIELD_NAME = FLX_TL.DESCRIPTIVE_FLEXFIELD_NAME
1135 AND EXT.DESCRIPTIVE_FLEX_CONTEXT_CODE = FLX_TL.DESCRIPTIVE_FLEX_CONTEXT_CODE
1136 AND FLX_TL.LANGUAGE = USERENV('LANG')
1137 AND FLX.APPLICATION_ID = FLX_TL.APPLICATION_ID
1138 AND FLX.DESCRIPTIVE_FLEXFIELD_NAME = FLX_TL.DESCRIPTIVE_FLEXFIELD_NAME
1139 AND FLX_EXT.APPLICATION_ID(+) = FLX_TL.APPLICATION_ID
1140 AND FLX_EXT.DESCRIPTIVE_FLEXFIELD_NAME(+) = FLX_TL.DESCRIPTIVE_FLEXFIELD_NAME;
1141
1142 END IF;
1143
1144 --------------------------------------------------------------
1145 -- Add the enabled data Level metadata to the AG object.
1146 --------------------------------------------------------------
1147 code_debug('in Get_Attr_Group_Metadata before Get_Enabled_Data_Levels_For_AG');
1148
1149 l_attr_group_metadata_obj.ENABLED_DATA_LEVELS := Get_Enabled_Data_Levels_For_AG(l_attr_group_metadata_obj.ATTR_GROUP_ID);
1150 code_debug('in Get_Attr_Group_Metadata after Get_Enabled_Data_Levels_For_AG');
1151 -------------------------------------------------------------
1152 -- B/Tl table needn't have ATTR_GROUP_ID column. --
1153 -- We look in FND_COLUMNS to determine if we need to --
1154 -- use ATTR_GROUP_ID column. Going against B table as --
1155 -- all Group Types neednt have TL table. --
1156 -- Assuming here that if B table doesnt have ATTR_GROUP_ID --
1157 -- then TL table will not have it too. --
1158 -------------------------------------------------------------
1159
1160 IF (l_attr_group_metadata_obj.APPLICATION_ID IS NOT NULL) THEN
1161 SELECT DECODE(COUNT(*), 0, 'N', 'Y')
1162 INTO l_attr_group_metadata_obj.ATTR_GROUP_ID_FLAG
1163 FROM FND_COLUMNS
1164 WHERE COLUMN_NAME = 'ATTR_GROUP_ID'
1165 AND APPLICATION_ID = l_attr_group_metadata_obj.APPLICATION_ID
1166 AND TABLE_ID = (SELECT TABLE_ID
1167 FROM FND_TABLES
1168 WHERE TABLE_NAME = l_attr_group_metadata_obj.EXT_TABLE_B_NAME
1169 AND APPLICATION_ID = l_attr_group_metadata_obj.APPLICATION_ID);
1170
1171 END IF;
1172
1173 -----------------------------------------------------------------
1174 -- If the Attr Group has no specified privileges, then we try --
1175 -- to use a default privilege for View and Edit; these default --
1176 -- privileges are hard-coded by Attr Group Type --
1177 -----------------------------------------------------------------
1178 IF (l_attr_group_metadata_obj.VIEW_PRIVILEGE IS NULL) THEN
1179
1180 IF (l_attr_group_metadata_obj.ATTR_GROUP_TYPE = 'EGO_ITEMMGMT_GROUP') THEN
1181 l_attr_group_metadata_obj.VIEW_PRIVILEGE := 'EGO_VIEW_ITEM';
1182 END IF;
1183
1184 END IF;
1185 IF (l_attr_group_metadata_obj.EDIT_PRIVILEGE IS NULL) THEN
1186
1187 IF (l_attr_group_metadata_obj.ATTR_GROUP_TYPE = 'EGO_ITEMMGMT_GROUP') THEN
1188 l_attr_group_metadata_obj.EDIT_PRIVILEGE := 'EGO_EDIT_ITEM';
1189 END IF;
1190
1191 END IF;
1192
1193 Build_Attr_Metadata_Table(l_attr_group_metadata_obj);
1194
1195 Add_Attr_Group_To_Cache(l_attr_group_metadata_obj);
1196
1197 END IF;
1198
1199 RETURN l_attr_group_metadata_obj;
1200
1201 EXCEPTION
1202 WHEN OTHERS THEN
1203 code_debug('in Get_Attr_Group_Metadata EXCEPTION-'||SQLERRM);
1204 RETURN NULL;
1205
1206 END Get_Attr_Group_Metadata;
1207
1208 ----------------------------------------------------------------------
1209
1210 FUNCTION Find_Metadata_For_Attr (
1211 p_attr_metadata_table IN EGO_ATTR_METADATA_TABLE
1212 ,p_attr_name IN VARCHAR2 DEFAULT NULL
1213 ,p_attr_id IN NUMBER DEFAULT NULL
1214 ,p_db_column_name IN VARCHAR2 DEFAULT NULL
1215 )
1216 RETURN EGO_ATTR_METADATA_OBJ
1217 IS
1218
1219 l_table_index NUMBER;
1220 l_attr_metadata_obj EGO_ATTR_METADATA_OBJ;
1221
1222 BEGIN
1223
1224 code_debug('In Find_Metadata_For_Attr, starting for p_attr_name '||p_attr_name, 2);
1225
1226 l_table_index := p_attr_metadata_table.FIRST;
1227
1228 IF (p_attr_name IS NOT NULL OR
1229 p_attr_id IS NOT NULL OR
1230 p_db_column_name IS NOT NULL) THEN
1231 WHILE (l_table_index <= p_attr_metadata_table.LAST)
1232 LOOP
1233 EXIT WHEN (p_attr_metadata_table(l_table_index).ATTR_NAME = p_attr_name OR
1234 p_attr_metadata_table(l_table_index).ATTR_ID = p_attr_id OR
1235 p_attr_metadata_table(l_table_index).DATABASE_COLUMN = p_db_column_name);
1236
1237 l_table_index := p_attr_metadata_table.NEXT(l_table_index);
1238 END LOOP;
1239
1240 -----------------------------------------------
1241 -- Make sure we have the correct table index --
1242 -----------------------------------------------
1243 IF (l_table_index IS NOT NULL AND
1244 (p_attr_metadata_table(l_table_index).ATTR_NAME = p_attr_name OR
1245 p_attr_metadata_table(l_table_index).ATTR_ID = p_attr_id OR
1246 p_attr_metadata_table(l_table_index).DATABASE_COLUMN = p_db_column_name)) THEN
1247 l_attr_metadata_obj := p_attr_metadata_table(l_table_index);
1248 END IF;
1249 END IF;
1250
1251 code_debug('In Find_Metadata_For_Attr, done', 2);
1252 code_debug('In Find_Metadata_For_Attr, ind: '||l_table_index||' name: '||l_attr_metadata_obj.ATTR_NAME, 2);
1253 code_debug('In Find_Metadata_For_Attr, id: '||l_attr_metadata_obj.ATTR_ID||' dbc: '||l_attr_metadata_obj.DATABASE_COLUMN, 2);
1254 RETURN l_attr_metadata_obj;
1255
1256 END Find_Metadata_For_Attr;
1257
1258 ----------------------------------------------------------------------
1259
1260 FUNCTION Find_Ext_Table_In_Cache (
1261 p_object_id IN NUMBER
1262 )
1263 RETURN EGO_EXT_TABLE_METADATA_OBJ
1264 IS
1265
1266 l_ext_table_metadata_obj EGO_EXT_TABLE_METADATA_OBJ;
1267
1268 BEGIN
1269
1270 IF (G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_1.OBJECT_ID = p_object_id) THEN
1271
1272 l_ext_table_metadata_obj := G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_1;
1273
1274 ELSIF (G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_2.OBJECT_ID = p_object_id) THEN
1275
1276 l_ext_table_metadata_obj := G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_2;
1277
1278 ELSIF (G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_3.OBJECT_ID = p_object_id) THEN
1279
1280 l_ext_table_metadata_obj := G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_3;
1281
1282 ELSIF (G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_4.OBJECT_ID = p_object_id) THEN
1283
1284 l_ext_table_metadata_obj := G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_4;
1285
1286 ELSIF (G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_5.OBJECT_ID = p_object_id) THEN
1287
1288 l_ext_table_metadata_obj := G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_5;
1289
1290 END IF;
1291
1292 RETURN l_ext_table_metadata_obj; --It may still be null here, and that's OK
1293
1294 END Find_Ext_Table_In_Cache;
1295
1296 ----------------------------------------------------------------------
1297
1298 PROCEDURE Add_Ext_Table_To_Cache (
1299 p_ext_table_metadata_obj IN EGO_EXT_TABLE_METADATA_OBJ
1300 ) IS
1301
1302 l_oldest_rec_index NUMBER;
1303 l_dummy_time_variable DATE;
1304
1305 BEGIN
1306
1307 IF (Is_Room_In_ET_Batch(G_EXT_TABLE_METADATA_BATCH_1)) THEN
1308
1309 IF (G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_1 IS NULL) THEN
1310
1311 G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_1 := p_ext_table_metadata_obj;
1312 G_EXT_TABLE_METADATA_BATCH_1.access_times_table(1) := SYSDATE;
1313
1314 ELSIF (G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_2 IS NULL) THEN
1315
1316 G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_2 := p_ext_table_metadata_obj;
1317 G_EXT_TABLE_METADATA_BATCH_1.access_times_table(2) := SYSDATE;
1318
1319 ELSIF (G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_3 IS NULL) THEN
1320
1321 G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_3 := p_ext_table_metadata_obj;
1322 G_EXT_TABLE_METADATA_BATCH_1.access_times_table(3) := SYSDATE;
1323
1324 ELSIF (G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_4 IS NULL) THEN
1325
1326 G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_4 := p_ext_table_metadata_obj;
1327 G_EXT_TABLE_METADATA_BATCH_1.access_times_table(4) := SYSDATE;
1328
1329 ELSIF (G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_5 IS NULL) THEN
1330
1331 G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_5 := p_ext_table_metadata_obj;
1332 G_EXT_TABLE_METADATA_BATCH_1.access_times_table(5) := SYSDATE;
1333
1334 END IF;
1335
1336 ELSE
1337
1338 l_oldest_rec_index := Find_Oldest_Element_Info(G_EXT_TABLE_METADATA_BATCH_1.access_times_table, l_dummy_time_variable);
1339
1340 IF (l_oldest_rec_index = 1) THEN
1341
1342 G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_1 := p_ext_table_metadata_obj;
1343 G_EXT_TABLE_METADATA_BATCH_1.access_times_table(1) := SYSDATE;
1344
1345 ELSIF (l_oldest_rec_index = 2) THEN
1346
1347 G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_2 := p_ext_table_metadata_obj;
1348 G_EXT_TABLE_METADATA_BATCH_1.access_times_table(2) := SYSDATE;
1349
1350 ELSIF (l_oldest_rec_index = 3) THEN
1351
1352 G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_3 := p_ext_table_metadata_obj;
1353 G_EXT_TABLE_METADATA_BATCH_1.access_times_table(3) := SYSDATE;
1354
1355 ELSIF (l_oldest_rec_index = 4) THEN
1356
1357 G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_4 := p_ext_table_metadata_obj;
1358 G_EXT_TABLE_METADATA_BATCH_1.access_times_table(4) := SYSDATE;
1359
1360 ELSIF (l_oldest_rec_index = 5) THEN
1361
1362 G_EXT_TABLE_METADATA_BATCH_1.CACHED_EXT_TABLE_METADATA_5 := p_ext_table_metadata_obj;
1363 G_EXT_TABLE_METADATA_BATCH_1.access_times_table(5) := SYSDATE;
1364
1365 END IF;
1366
1367 END IF;
1368
1369 END Add_Ext_Table_To_Cache;
1370
1371 ----------------------------------------------------------------------
1372
1373 --
1374 -- this is retained only for backward compatibility to R12
1375 -- must not be used from R12C and beyond
1376 --
1377 FUNCTION Get_Ext_Table_Metadata (
1378 p_object_id IN NUMBER
1379 )
1380 RETURN EGO_EXT_TABLE_METADATA_OBJ
1381 IS
1382
1383 l_ext_table_metadata_obj EGO_EXT_TABLE_METADATA_OBJ;
1384 l_obj_name FND_OBJECTS.OBJ_NAME%TYPE;-- 4105308 OBJ_NAME IN FND_OBJECTS LENGTH HAS BEEN INCREASED
1385 l_pk1_obj EGO_COL_METADATA_OBJ := EGO_COL_METADATA_OBJ(null, null);
1386 l_pk2_obj EGO_COL_METADATA_OBJ := EGO_COL_METADATA_OBJ(null, null);
1387 l_pk3_obj EGO_COL_METADATA_OBJ := EGO_COL_METADATA_OBJ(null, null);
1388 l_pk4_obj EGO_COL_METADATA_OBJ := EGO_COL_METADATA_OBJ(null, null);
1389 l_pk5_obj EGO_COL_METADATA_OBJ := EGO_COL_METADATA_OBJ(null, null);
1390 l_class_code_obj EGO_COL_METADATA_OBJ := EGO_COL_METADATA_OBJ(null, null);
1391 l_num_data_level_cols NUMBER;
1392 l_data_level1_obj EGO_COL_METADATA_OBJ := EGO_COL_METADATA_OBJ(null, null);
1393 l_data_level2_obj EGO_COL_METADATA_OBJ := EGO_COL_METADATA_OBJ(null, null);
1394 l_data_level3_obj EGO_COL_METADATA_OBJ := EGO_COL_METADATA_OBJ(null, null);
1395
1396 CURSOR data_level_meanings_cursor (cp_obj_name VARCHAR2)
1397 IS
1398 SELECT MEANING
1399 FROM FND_LOOKUP_VALUES
1400 WHERE LOOKUP_TYPE = 'EGO_EF_DATA_LEVEL'
1401 AND ATTRIBUTE1 = cp_obj_name
1402 AND VIEW_APPLICATION_ID = 0
1403 ORDER BY ATTRIBUTE2;
1404
1405 BEGIN
1406
1407 l_ext_table_metadata_obj := Find_Ext_Table_In_Cache(p_object_id);
1408
1409 IF (l_ext_table_metadata_obj IS NULL) THEN
1410
1411 SELECT O.OBJ_NAME
1412 ,O.PK1_COLUMN_NAME
1413 ,O.PK2_COLUMN_NAME
1414 ,O.PK3_COLUMN_NAME
1415 ,O.PK4_COLUMN_NAME
1416 ,O.PK5_COLUMN_NAME
1417 ,O.PK1_COLUMN_TYPE
1418 ,O.PK2_COLUMN_TYPE
1419 ,O.PK3_COLUMN_TYPE
1420 ,O.PK4_COLUMN_TYPE
1421 ,O.PK5_COLUMN_TYPE
1422 ,E.CLASSIFICATION_COL_NAME
1423 ,E.CLASSIFICATION_COL_TYPE
1424 ,L.ATTRIBUTE2
1425 ,L.ATTRIBUTE3
1426 ,L.ATTRIBUTE4
1427 ,L.ATTRIBUTE5
1428 ,L.ATTRIBUTE6
1429 ,L.ATTRIBUTE7
1430 ,L.ATTRIBUTE8
1431 INTO l_obj_name
1432 ,l_pk1_obj.col_name
1433 ,l_pk2_obj.col_name
1434 ,l_pk3_obj.col_name
1435 ,l_pk4_obj.col_name
1436 ,l_pk5_obj.col_name
1437 ,l_pk1_obj.data_type
1438 ,l_pk2_obj.data_type
1439 ,l_pk3_obj.data_type
1440 ,l_pk4_obj.data_type
1441 ,l_pk5_obj.data_type
1442 ,l_class_code_obj.col_name
1443 ,l_class_code_obj.data_type
1444 ,l_num_data_level_cols
1445 ,l_data_level1_obj.col_name
1446 ,l_data_level1_obj.data_type
1447 ,l_data_level2_obj.col_name
1448 ,l_data_level2_obj.data_type
1449 ,l_data_level3_obj.col_name
1450 ,l_data_level3_obj.data_type
1451 FROM FND_OBJECTS O
1452 ,EGO_FND_OBJECTS_EXT E
1453 ,FND_LOOKUP_VALUES L
1454 WHERE O.OBJECT_ID = p_object_id
1455 AND O.OBJ_NAME = E.OBJECT_NAME
1456 AND L.LOOKUP_TYPE(+) = 'EGO_EF_DATA_LEVEL'
1457 AND L.ATTRIBUTE1(+) = O.OBJ_NAME
1458 AND L.ATTRIBUTE2(+) > 0
1459 AND L.LANGUAGE(+) = USERENV('LANG');
1460
1461 l_ext_table_metadata_obj := EGO_EXT_TABLE_METADATA_OBJ(
1462 p_object_id
1463 ,l_obj_name
1464 ,null -- DATA_LEVEL_MEANING_1
1465 ,null -- DATA_LEVEL_MEANING_2
1466 ,null -- DATA_LEVEL_MEANING_3
1467 ,null -- pk_column_metadata
1468 ,EGO_COL_METADATA_ARRAY(
1469 l_class_code_obj
1470 )
1471 ,null -- data_level_metadata
1472 );
1473
1474 ------------------------------------------------------------
1475 -- Create an array for the primary key column information --
1476 -- and add the array to the ext table metadata object --
1477 ------------------------------------------------------------
1478 IF (l_pk5_obj.COL_NAME IS NOT NULL) THEN
1479 l_ext_table_metadata_obj.pk_column_metadata := EGO_COL_METADATA_ARRAY(
1480 l_pk1_obj
1481 ,l_pk2_obj
1482 ,l_pk3_obj
1483 ,l_pk4_obj
1484 ,l_pk5_obj
1485 );
1486 ELSIF (l_pk4_obj.COL_NAME IS NOT NULL) THEN
1487 l_ext_table_metadata_obj.pk_column_metadata := EGO_COL_METADATA_ARRAY(
1488 l_pk1_obj
1489 ,l_pk2_obj
1490 ,l_pk3_obj
1491 ,l_pk4_obj
1492 );
1493 ELSIF (l_pk3_obj.COL_NAME IS NOT NULL) THEN
1494 l_ext_table_metadata_obj.pk_column_metadata := EGO_COL_METADATA_ARRAY(
1495 l_pk1_obj
1496 ,l_pk2_obj
1497 ,l_pk3_obj
1498 );
1499 ELSIF (l_pk2_obj.COL_NAME IS NOT NULL) THEN
1500 l_ext_table_metadata_obj.pk_column_metadata := EGO_COL_METADATA_ARRAY(
1501 l_pk1_obj
1502 ,l_pk2_obj
1503 );
1504 ELSE -- i.e., only l_pk1_obj.COL_NAME is not NULL
1505 l_ext_table_metadata_obj.pk_column_metadata := EGO_COL_METADATA_ARRAY(
1506 l_pk1_obj
1507 );
1508 END IF;
1509
1510 -----------------------------------------------------------
1511 -- Create an array for the data level column information --
1512 -- and add the array to the ext table metadata object --
1513 -----------------------------------------------------------
1514 IF (l_num_data_level_cols = 1) THEN
1515 l_ext_table_metadata_obj.data_level_metadata := EGO_COL_METADATA_ARRAY(
1516 l_data_level1_obj
1517 );
1518 ELSIF (l_num_data_level_cols = 2) THEN
1519 l_ext_table_metadata_obj.data_level_metadata := EGO_COL_METADATA_ARRAY(
1520 l_data_level1_obj
1521 ,l_data_level2_obj
1522 );
1523 ELSIF (l_num_data_level_cols = 3) THEN
1524 l_ext_table_metadata_obj.data_level_metadata := EGO_COL_METADATA_ARRAY(
1525 l_data_level1_obj
1526 ,l_data_level2_obj
1527 ,l_data_level3_obj
1528 );
1529 END IF;
1530
1531 ----------------------------------------
1532 -- Add the user-friendly names of the --
1533 -- data levels (for error-reporting) --
1534 ----------------------------------------
1535 FOR data_level_rec IN data_level_meanings_cursor(l_obj_name)
1536 LOOP
1537
1538 IF (data_level_meanings_cursor%ROWCOUNT = 1) THEN
1539
1540 l_ext_table_metadata_obj.DATA_LEVEL_MEANING_1 := data_level_rec.MEANING;
1541
1542 ELSIF (data_level_meanings_cursor%ROWCOUNT = 2) THEN
1543
1544 l_ext_table_metadata_obj.DATA_LEVEL_MEANING_2 := data_level_rec.MEANING;
1545
1546 ELSIF (data_level_meanings_cursor%ROWCOUNT = 3) THEN
1547
1548 l_ext_table_metadata_obj.DATA_LEVEL_MEANING_3 := data_level_rec.MEANING;
1549
1550 END IF;
1551
1552 END LOOP;
1553
1554 Add_Ext_Table_To_Cache(l_ext_table_metadata_obj);
1555
1556 END IF;
1557
1558 RETURN l_ext_table_metadata_obj;
1559
1560 EXCEPTION
1561 WHEN NO_DATA_FOUND THEN
1562 RETURN NULL;
1563
1564 END Get_Ext_Table_Metadata;
1565
1566 ---------------------------------------------------
1567 -- Miscellaneous Common Procedures and Functions --
1568 ---------------------------------------------------
1569
1570 ----------------------------------------------------------------------
1571
1572 -- This function's allowable p_mode values are:
1573 -- 'NAMES': returns a comma-delimited list of column names
1574 -- 'VALUES': returns a comma-delimited list of column values
1575 -- 'EQUALS': returns a list of the form 'Name1 = Value1 AND Name2 = Value2...'
1576 -- 'VALUES_ALL_CC': as 'VALUES', but also has all *related* Classification Codes
1577
1578 -- Note: This function does not currently support 'DATE'-type columns.
1579
1580 FUNCTION Get_List_For_Table_Cols (
1581 p_col_metadata_array IN EGO_COL_METADATA_ARRAY
1582 ,p_col_name_value_pairs IN EGO_COL_NAME_VALUE_PAIR_ARRAY
1583 ,p_mode IN VARCHAR2
1584 ,p_use_binds IN BOOLEAN DEFAULT FALSE
1585 ,p_prefix IN VARCHAR2 DEFAULT NULL
1586 )
1587 RETURN VARCHAR2
1588 IS
1589
1590 l_separator VARCHAR2(6);
1591 l_col_name VARCHAR2(30);
1592 l_col_type VARCHAR2(8);
1593 l_col_values_index NUMBER;
1594 l_col_value VARCHAR2(1000);
1595 l_col_string VARCHAR2(1775) := '';
1596 l_prev_string_index NUMBER;
1597 l_string_index NUMBER;
1598 l_next_element VARCHAR2(150);
1599 l_is_last_element BOOLEAN;
1600 l_val_begin_pos NUMBER;
1601
1602 BEGIN
1603
1604 code_debug('In Get_List_For_Table_Cols for mode - '||p_mode||' prefix - '||p_prefix||', starting', 2);
1605 IF p_use_binds THEN
1606 code_debug('In Get_List_For_Table_Cols using binds ', 2);
1607 ELSE
1608 code_debug('In Get_List_For_Table_Cols using NO binds ', 2);
1609 END IF;
1610
1611 IF (p_col_name_value_pairs IS NOT NULL OR p_mode = 'NAMES') THEN
1612 --------------------------------------------------------------
1613 -- Figure out the separator for this list based on the mode --
1614 --------------------------------------------------------------
1615 IF (UPPER(p_mode) = 'EQUALS') THEN
1616 l_separator := ' AND ';
1617 ELSE
1618 l_separator := ', ';
1619 END IF;
1620
1621 IF (p_col_metadata_array IS NOT NULL AND p_col_metadata_array.COUNT > 0) THEN
1622
1623 FOR i IN p_col_metadata_array.FIRST .. p_col_metadata_array.LAST
1624 LOOP
1625 code_debug('In Get_List_For_Table_Cols for col - '||i||' - '||p_col_metadata_array(i).COL_NAME);
1626 IF (p_col_metadata_array(i).COL_NAME IS NOT NULL) THEN
1627 --------------------------------------------------------
1628 -- Append the separator to the previous list element, --
1629 -- and prepend the prefix argument to the first list --
1630 -- element. --
1631 --------------------------------------------------------
1632 IF (i = p_col_metadata_array.FIRST) THEN
1633 IF (p_use_binds) THEN
1634 FND_DSQL.Add_Text(p_prefix);
1635 END IF;
1636 l_col_string := l_col_string || p_prefix;
1637 ELSE
1638 IF (p_use_binds) THEN
1639 FND_DSQL.Add_Text(l_separator);
1640 END IF;
1641 l_col_string := l_col_string || l_separator;
1642 END IF;
1643
1644 ------------------------------------------------
1645 -- Loop for each column in the metadata array --
1646 ------------------------------------------------
1647 l_col_name := p_col_metadata_array(i).COL_NAME;
1648 l_col_value := NULL;
1649 -----------------------------------------------
1650 -- Get the column type for this column value --
1651 -----------------------------------------------
1652 l_col_type := p_col_metadata_array(i).DATA_TYPE;
1653
1654 IF (UPPER(p_mode) <> 'NAMES') THEN
1655
1656 ------------------------------------------------------
1657 -- Try to find the index for this column's value by --
1658 -- matching up the column name with l_col_name, and --
1659 -- then get the value itself (we may not find the --
1660 -- value or it may be NULL, which will be fine). --
1661 ------------------------------------------------------
1662 IF (p_col_name_value_pairs IS NOT NULL AND
1663 p_col_name_value_pairs.COUNT > 0) THEN
1664
1665 l_col_values_index := p_col_name_value_pairs.FIRST;
1666 WHILE (l_col_values_index <= p_col_name_value_pairs.LAST)
1667 LOOP
1668 IF (p_col_name_value_pairs(l_col_values_index).NAME = l_col_name) THEN
1669 l_col_value := p_col_name_value_pairs(l_col_values_index).VALUE;
1670 END IF;
1671 l_col_values_index := p_col_name_value_pairs.NEXT(l_col_values_index);
1672 END LOOP;
1673 END IF;
1674 END IF; -- (UPPER(p_mode) <> 'NAMES')
1675
1676 --------------------------------------------
1677 -- 4). Add this column's info to the list --
1678 --------------------------------------------
1679 IF (UPPER(p_mode) = 'NAMES') THEN
1680 IF (p_use_binds) THEN
1681 FND_DSQL.Add_Text(l_col_name);
1682 END IF;
1683 l_col_string := l_col_string || l_col_name;
1684
1685 ELSIF (UPPER(p_mode) = 'VALUES' OR UPPER(p_mode) = 'VALUES_ALL_CC') THEN
1686 IF (l_col_value IS NULL) THEN
1687 IF (p_use_binds) THEN
1688 FND_DSQL.Add_Text('NULL');
1689 END IF;
1690 l_col_string := l_col_string || 'NULL';
1691 ELSE
1692 IF (l_col_type = 'NUMBER' OR l_col_type = 'INTEGER') THEN
1693 IF (p_use_binds) THEN
1694 EGO_USER_ATTRS_DATA_PVT.Add_Bind(p_value => TO_NUMBER(l_col_value));
1695 END IF;
1696 l_col_string := l_col_string || l_col_value;
1697 ELSIF (l_col_type = 'VARCHAR' OR l_col_type = 'VARCHAR2') THEN
1698 IF (p_use_binds) THEN
1699 EGO_USER_ATTRS_DATA_PVT.Add_Bind(p_value => l_col_value);
1700 END IF;
1701 l_col_string := l_col_string ||''''|| l_col_value ||'''';
1702 END IF;
1703 END IF;
1704
1705 ELSIF (UPPER(p_mode) = 'EQUALS') THEN
1706 IF (l_col_value IS NULL) THEN
1707 IF (p_use_binds) THEN
1708 FND_DSQL.Add_Text(l_col_name || ' IS NULL');
1709 END IF;
1710 l_col_string := l_col_string || l_col_name || ' IS NULL';
1711 ELSE
1712 IF (l_col_type = 'NUMBER' OR l_col_type = 'INTEGER') THEN
1713 IF (p_use_binds) THEN
1714 FND_DSQL.Add_Text(l_col_name || ' = ');
1715 EGO_USER_ATTRS_DATA_PVT.Add_Bind(p_value => TO_NUMBER(l_col_value));
1716 END IF;
1717 l_col_string := l_col_string || l_col_name || ' = ' || l_col_value;
1718 ELSIF (l_col_type = 'VARCHAR' OR l_col_type = 'VARCHAR2') THEN
1719 IF (p_use_binds) THEN
1720 FND_DSQL.Add_Text(l_col_name || ' = ');
1721 EGO_USER_ATTRS_DATA_PVT.Add_Bind(p_value => l_col_value);
1722 END IF;
1723 l_col_string := l_col_string ||l_col_name || ' = ''' || l_col_value || '''';
1724 END IF;
1725 END IF;
1726 END IF; -- (UPPER(p_mode) = 'EQUALS')
1727 END IF; -- p_col_metadata_array(i).COL_NAME IS NOT NULL
1728 END LOOP;
1729
1730 -------------------------------------------------------------------------
1731 -- 5). If the mode is 'VALUES_ALL_CC', append the related Class Codes --
1732 -- by looping through the passed-in name/value pairs again to find all --
1733 -- elements starting with 'RELATED_CLASS_CODE_LIST' --
1734 -------------------------------------------------------------------------
1735 IF (UPPER(p_mode) = 'VALUES_ALL_CC' AND
1736 p_col_name_value_pairs IS NOT NULL AND
1737 p_col_name_value_pairs.COUNT > 0) THEN
1738
1739 -------------------------------------------------------------------
1740 -- Assume the first element in the metadata array represents the --
1741 -- class code column. --
1742 -------------------------------------------------------------------
1743 l_col_type := p_col_metadata_array(p_col_metadata_array.FIRST).DATA_TYPE;
1744 l_col_values_index := p_col_name_value_pairs.FIRST;
1745 WHILE (l_col_values_index <= p_col_name_value_pairs.LAST)
1746 LOOP
1747
1748 IF (INSTR(UPPER(p_col_name_value_pairs(l_col_values_index).NAME), 'RELATED_CLASS_CODE_LIST') <> 0 AND
1749 p_col_name_value_pairs(l_col_values_index).VALUE IS NOT NULL AND
1750 LENGTH(p_col_name_value_pairs(l_col_values_index).VALUE) > 0) THEN
1751
1752 -------------------------------------------------------
1753 -- Append the separator to the previous list element --
1754 -------------------------------------------------------
1755 IF (LENGTH(l_col_string) > 0) THEN
1756 IF (p_use_binds) THEN
1757 FND_DSQL.Add_Text(l_separator);
1758 END IF;
1759 l_col_string := l_col_string || l_separator;
1760 ELSE
1761 IF (p_use_binds) THEN
1762 FND_DSQL.Add_Text(p_prefix);
1763 END IF;
1764 l_col_string := l_col_string || p_prefix;
1765 END IF;
1766
1767 -----------------------------------
1768 -- Append the related class code --
1769 -----------------------------------
1770 IF (p_use_binds) THEN
1771
1772 -- in the case of using binds, we have to parse the value string to bind
1773 -- each individual value separately.
1774 l_prev_string_index := 1;
1775 l_is_last_element := FALSE;
1776
1777 LOOP
1778
1779 l_string_index := INSTR(p_col_name_value_pairs(l_col_values_index).VALUE, ',', l_prev_string_index);
1780
1781 IF (l_string_index = 0) THEN
1782 l_string_index := LENGTH(p_col_name_value_pairs(l_col_values_index).VALUE) + 1;
1783 l_is_last_element := TRUE;
1784 END IF;
1785
1786 l_next_element := SUBSTR(p_col_name_value_pairs(l_col_values_index).VALUE
1787 ,l_prev_string_index
1788 ,l_string_index - l_prev_string_index);
1789 IF (l_col_type = 'NUMBER' OR l_col_type = 'INTEGER') THEN
1790 EGO_USER_ATTRS_DATA_PVT.Add_Bind(p_value => TO_NUMBER(l_next_element));
1791 ELSIF (l_col_type = 'VARCHAR' OR l_col_type = 'VARCHAR2') THEN
1792 l_val_begin_pos := INSTR(l_next_element, '''') + 1;
1793 EGO_USER_ATTRS_DATA_PVT.Add_Bind( p_value =>
1794 SUBSTR(l_next_element,l_val_begin_pos,
1795 INSTR(l_next_element, '''', -1, 1) - l_val_begin_pos)
1796 );
1797 END IF;
1798
1799 EXIT WHEN (l_is_last_element);
1800
1801 l_prev_string_index := l_string_index + 1;
1802 FND_DSQL.Add_Text(', ');
1803
1804 END LOOP;
1805
1806 END IF;
1807
1808 -- append the value string when binds aren't being considered
1809 l_col_string := l_col_string ||
1810 p_col_name_value_pairs(l_col_values_index).VALUE;
1811
1812 END IF;
1813
1814 l_col_values_index := p_col_name_value_pairs.NEXT(l_col_values_index);
1815 END LOOP;
1816
1817 END IF;
1818 END IF;
1819 END IF;
1820
1821 code_debug('In Get_List_For_Table_Cols for mode '||p_mode||', done', 2);
1822 RETURN l_col_string;
1823
1824 END Get_List_For_Table_Cols;
1825
1826 ----------------------------------------------------------------------
1827
1828 FUNCTION Create_DB_Col_Alias_If_Needed (
1829 p_attr_metadata_obj IN EGO_ATTR_METADATA_OBJ
1830 ) RETURN VARCHAR2
1831 IS
1832
1833 l_db_column_alias VARCHAR2(90);
1834
1835 BEGIN
1836
1837 ----------------------------------------
1838 -- Start with just the DB column name --
1839 ----------------------------------------
1840 l_db_column_alias := p_attr_metadata_obj.DATABASE_COLUMN;
1841
1842 -------------------------------------------------------------------------
1843 -- Set up an alias to convert Date, Number values to formatted strings --
1844 -------------------------------------------------------------------------
1845 IF (p_attr_metadata_obj.DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
1846
1847 l_db_column_alias := 'TO_CHAR('||p_attr_metadata_obj.DATABASE_COLUMN||')';
1848
1849 ---------------------------------------------------------------
1850 -- In the Date and Date Time case, use SUBSTR to get around --
1851 -- the strange PL/SQL behavior of adding an initial space to --
1852 -- Dates that have been TO_CHAR'ed --
1853 ---------------------------------------------------------------
1854 ELSIF (p_attr_metadata_obj.DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE) THEN
1855
1856 l_db_column_alias := 'SUBSTR(TO_CHAR(TRUNC('||p_attr_metadata_obj.DATABASE_COLUMN||'), '''||EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT||'''), 2)';
1857
1858 ELSIF (p_attr_metadata_obj.DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE) THEN
1859
1860 l_db_column_alias := 'SUBSTR(TO_CHAR('||p_attr_metadata_obj.DATABASE_COLUMN||', '''||EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT||'''), 2)';
1861
1862 END IF;
1863
1864 RETURN l_db_column_alias;
1865
1866 END Create_DB_Col_Alias_If_Needed;
1867
1868 ----------------------------------------------------------------------
1869 --bug 5094087
1870 -------------------------------------------------------------------------------------
1871 -- API Name: Get_User_Pref_Date_Time_Val --
1872 -- --
1873 -- Description:This Function retruns the Formatted Date or Date Time Value --
1874 -- depending on the type of the Attribute Passed in and the Value passed in --
1875 -- Parameters: The Value of date or DateTime and the Attribute Type with X for --
1876 -- Date Type or Y for Date_time Type --
1877 -------------------------------------------------------------------------------------
1878 FUNCTION Get_User_Pref_Date_Time_Val (
1879 p_date IN DATE
1880 ,p_attr_type IN VARCHAR2
1881 ,x_return_status OUT NOCOPY VARCHAR2
1882 ,x_msg_count OUT NOCOPY NUMBER
1883 ,x_msg_data OUT NOCOPY VARCHAR2
1884 ) RETURN VARCHAR2 IS
1885
1886 l_api_name VARCHAR2(30):='Get_User_Pref_Date_Time_Val';
1887 l_attr_int_value VARCHAR2(100);
1888 l_date_factor VARCHAR2(30);
1889 l_time_factor VARCHAR2(30);
1890 l_space_pos NUMBER;
1891 BEGIN
1892 -- check for valid parameters, return message if invalid.
1893 IF p_attr_type NOT IN ('X','Y') THEN
1894 x_return_status := FND_API.G_RET_STS_ERROR;
1895 FND_MESSAGE.Set_Name('EGO', 'EGO_API_INVALID_PARAMS');
1896 FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
1897 FND_MESSAGE.Set_Token('PROC_NAME"', l_api_name);
1898 FND_MSG_PUB.Add;
1899 FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
1900 ,p_count => x_msg_count
1901 ,p_data => x_msg_data);
1902 RETURN p_date;
1903 END IF;
1904 --return the date as it is if it is null or ''
1905 IF (p_date IS NULL OR p_date = '') THEN
1906 RETURN p_date;
1907 END IF;
1908
1909 --process only if the attribute is of type date or date time
1910 l_attr_int_value := TRIM(TO_CHAR(p_date,EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT));
1911 l_space_pos := Instr(l_attr_int_value,' ');
1912 l_time_factor := SUBSTR(l_attr_int_value,l_space_pos+1);
1913 l_attr_int_value := TO_CHAR(p_date);
1914 IF p_attr_type = 'Y' THEN
1915 l_attr_int_value := l_attr_int_value||' '||l_time_factor;
1916 END IF;
1917 RETURN l_attr_int_value;
1918 EXCEPTION
1919 WHEN OTHERS THEN
1920 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1921 FND_MESSAGE.SET_NAME('FND', 'SQL_PLSQL_ERROR');
1922 FND_MESSAGE.SET_TOKEN('ROUTINE',G_PKG_NAME||l_api_name);
1923 FND_MESSAGE.SET_TOKEN('ERRNO', SQLCODE);
1924 FND_MESSAGE.SET_TOKEN('REASON', SQLERRM);
1925 FND_MSG_PUB.Add;
1926 FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
1927 ,p_count => x_msg_count
1928 ,p_data => x_msg_data);
1929 RETURN NULL;
1930 END Get_User_Pref_Date_Time_Val;
1931
1932 ----------------------------------------------------------------------
1933
1934 FUNCTION Find_Data_Level_In_Cache (
1935 p_data_level_id IN NUMBER
1936 )
1937 RETURN EGO_DATA_LEVEL_METADATA_OBJ
1938 IS
1939
1940 l_data_level_metadata_obj EGO_DATA_LEVEL_METADATA_OBJ := NULL;
1941
1942 BEGIN
1943 IF (G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_1.DATA_LEVEL_ID = p_data_level_id) THEN
1944 l_data_level_metadata_obj := G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_1;
1945 ELSIF (G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_2.DATA_LEVEL_ID = p_data_level_id) THEN
1946 l_data_level_metadata_obj := G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_2;
1947 ELSIF (G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_3.DATA_LEVEL_ID = p_data_level_id) THEN
1948 l_data_level_metadata_obj := G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_3;
1949 ELSIF (G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_4.DATA_LEVEL_ID = p_data_level_id) THEN
1950 l_data_level_metadata_obj := G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_4;
1951 ELSIF (G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_5.DATA_LEVEL_ID = p_data_level_id) THEN
1952 l_data_level_metadata_obj := G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_5;
1953 ELSIF (G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_6.DATA_LEVEL_ID = p_data_level_id) THEN
1954 l_data_level_metadata_obj := G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_6;
1955 ELSIF (G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_7.DATA_LEVEL_ID = p_data_level_id) THEN
1956 l_data_level_metadata_obj := G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_7;
1957 ELSIF (G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_8.DATA_LEVEL_ID = p_data_level_id) THEN
1958 l_data_level_metadata_obj := G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_8;
1959 ELSIF (G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_9.DATA_LEVEL_ID = p_data_level_id) THEN
1960 l_data_level_metadata_obj := G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_9;
1961 ELSIF (G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_10.DATA_LEVEL_ID = p_data_level_id) THEN
1962 l_data_level_metadata_obj := G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_10;
1963 END IF;
1964 RETURN l_data_level_metadata_obj; --It may still be null here, and that's OK
1965
1966 END Find_Data_Level_In_Cache;
1967
1968 ----------------------------------------------------------------------
1969 PROCEDURE Add_Data_Level_To_Cache (
1970 p_data_level_metadata_obj IN EGO_DATA_LEVEL_METADATA_OBJ
1971 ) IS
1972
1973 l_oldest_rec_index NUMBER;
1974 l_dummy_time_variable DATE;
1975
1976 BEGIN
1977
1978 IF (Is_Room_In_DL_Batch(G_DATA_LEVEL_METADATA_BATCH_1)) THEN
1979 IF (G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_1 IS NULL) THEN
1980 G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_1 := p_DATA_LEVEL_METADATA_obj;
1981 G_DATA_LEVEL_METADATA_BATCH_1.access_times_table(1) := SYSDATE;
1982 ELSIF (G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_2 IS NULL) THEN
1983 G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_2 := p_DATA_LEVEL_METADATA_obj;
1984 G_DATA_LEVEL_METADATA_BATCH_1.access_times_table(2) := SYSDATE;
1985 ELSIF (G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_3 IS NULL) THEN
1986 G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_3 := p_DATA_LEVEL_METADATA_obj;
1987 G_DATA_LEVEL_METADATA_BATCH_1.access_times_table(3) := SYSDATE;
1988 ELSIF (G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_4 IS NULL) THEN
1989 G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_4 := p_DATA_LEVEL_METADATA_obj;
1990 G_DATA_LEVEL_METADATA_BATCH_1.access_times_table(4) := SYSDATE;
1991 ELSIF (G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_5 IS NULL) THEN
1992 G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_5 := p_DATA_LEVEL_METADATA_obj;
1993 G_DATA_LEVEL_METADATA_BATCH_1.access_times_table(5) := SYSDATE;
1994 ELSIF (G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_6 IS NULL) THEN
1995 G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_6 := p_DATA_LEVEL_METADATA_obj;
1996 G_DATA_LEVEL_METADATA_BATCH_1.access_times_table(6) := SYSDATE;
1997 ELSIF (G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_7 IS NULL) THEN
1998 G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_7 := p_DATA_LEVEL_METADATA_obj;
1999 G_DATA_LEVEL_METADATA_BATCH_1.access_times_table(7) := SYSDATE;
2000 ELSIF (G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_8 IS NULL) THEN
2001 G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_8 := p_DATA_LEVEL_METADATA_obj;
2002 G_DATA_LEVEL_METADATA_BATCH_1.access_times_table(8) := SYSDATE;
2003 ELSIF (G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_9 IS NULL) THEN
2004 G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_9 := p_DATA_LEVEL_METADATA_obj;
2005 G_DATA_LEVEL_METADATA_BATCH_1.access_times_table(9) := SYSDATE;
2006 ELSIF (G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_10 IS NULL) THEN
2007 G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_10 := p_DATA_LEVEL_METADATA_obj;
2008 G_DATA_LEVEL_METADATA_BATCH_1.access_times_table(10) := SYSDATE;
2009 END IF;
2010 ELSE
2011 l_oldest_rec_index := Find_Oldest_Element_Info(G_DATA_LEVEL_METADATA_BATCH_1.access_times_table, l_dummy_time_variable);
2012 IF (l_oldest_rec_index = 1) THEN
2013 G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_1 := p_DATA_LEVEL_METADATA_obj;
2014 G_DATA_LEVEL_METADATA_BATCH_1.access_times_table(1) := SYSDATE;
2015 ELSIF (l_oldest_rec_index = 2) THEN
2016 G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_2 := p_DATA_LEVEL_METADATA_obj;
2017 G_DATA_LEVEL_METADATA_BATCH_1.access_times_table(2) := SYSDATE;
2018 ELSIF (l_oldest_rec_index = 3) THEN
2019 G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_3 := p_DATA_LEVEL_METADATA_obj;
2020 G_DATA_LEVEL_METADATA_BATCH_1.access_times_table(3) := SYSDATE;
2021 ELSIF (l_oldest_rec_index = 4) THEN
2022 G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_4 := p_DATA_LEVEL_METADATA_obj;
2023 G_DATA_LEVEL_METADATA_BATCH_1.access_times_table(4) := SYSDATE;
2024 ELSIF (l_oldest_rec_index = 5) THEN
2025 G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_5 := p_DATA_LEVEL_METADATA_obj;
2026 G_DATA_LEVEL_METADATA_BATCH_1.access_times_table(5) := SYSDATE;
2027 ELSIF (l_oldest_rec_index = 6) THEN
2028 G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_6 := p_DATA_LEVEL_METADATA_obj;
2029 G_DATA_LEVEL_METADATA_BATCH_1.access_times_table(6) := SYSDATE;
2030 ELSIF (l_oldest_rec_index = 7) THEN
2031 G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_7 := p_DATA_LEVEL_METADATA_obj;
2032 G_DATA_LEVEL_METADATA_BATCH_1.access_times_table(7) := SYSDATE;
2033 ELSIF (l_oldest_rec_index = 8) THEN
2034 G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_8 := p_DATA_LEVEL_METADATA_obj;
2035 G_DATA_LEVEL_METADATA_BATCH_1.access_times_table(8) := SYSDATE;
2036 ELSIF (l_oldest_rec_index = 9) THEN
2037 G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_9 := p_DATA_LEVEL_METADATA_obj;
2038 G_DATA_LEVEL_METADATA_BATCH_1.access_times_table(9) := SYSDATE;
2039 ELSIF (l_oldest_rec_index = 10) THEN
2040 G_DATA_LEVEL_METADATA_BATCH_1.CACHED_DATA_LEVEL_METADATA_10 := p_DATA_LEVEL_METADATA_obj;
2041 G_DATA_LEVEL_METADATA_BATCH_1.access_times_table(10) := SYSDATE;
2042 END IF;
2043 END IF;
2044
2045 END Add_Data_Level_To_Cache;
2046
2047 ----------------------------------------------------------------------
2048
2049 FUNCTION Get_Data_Level_Metadata (p_data_level_id IN NUMBER)
2050 RETURN EGO_DATA_LEVEL_METADATA_OBJ
2051 IS
2052
2053 l_data_level_mdata EGO_DATA_LEVEL_METADATA_OBJ;
2054
2055 BEGIN
2056 code_debug ('In Get_Data_Level_Metadata start ');
2057 l_data_level_mdata := Find_Data_Level_In_Cache(p_data_level_id);
2058
2059 IF (l_data_level_mdata IS NULL) THEN
2060 code_debug ('In Get_Data_Level_Metadata creating new data level metadata ');
2061 l_data_level_mdata := EGO_DATA_LEVEL_METADATA_OBJ(null,null,null,null,null,null,null,null,null,null,null,null,null,null);
2062
2063 SELECT DATA_LEVEL_ID
2064 ,DATA_LEVEL_NAME
2065 ,USER_DATA_LEVEL_NAME
2066 ,PK1_COLUMN_NAME
2067 ,PK2_COLUMN_NAME
2068 ,PK3_COLUMN_NAME
2069 ,PK4_COLUMN_NAME
2070 ,PK5_COLUMN_NAME
2071 ,PK1_COLUMN_TYPE
2072 ,PK2_COLUMN_TYPE
2073 ,PK3_COLUMN_TYPE
2074 ,PK4_COLUMN_TYPE
2075 ,PK5_COLUMN_TYPE
2076 INTO l_data_level_mdata.DATA_LEVEL_ID
2077 ,l_data_level_mdata.DATA_LEVEL_NAME
2078 ,l_data_level_mdata.USER_DATA_LEVEL_NAME
2079 ,l_data_level_mdata.PK_COLUMN_NAME1
2080 ,l_data_level_mdata.PK_COLUMN_NAME2
2081 ,l_data_level_mdata.PK_COLUMN_NAME3
2082 ,l_data_level_mdata.PK_COLUMN_NAME4
2083 ,l_data_level_mdata.PK_COLUMN_NAME5
2084 ,l_data_level_mdata.PK_COLUMN_TYPE1
2085 ,l_data_level_mdata.PK_COLUMN_TYPE2
2086 ,l_data_level_mdata.PK_COLUMN_TYPE3
2087 ,l_data_level_mdata.PK_COLUMN_TYPE4
2088 ,l_data_level_mdata.PK_COLUMN_TYPE5
2089 FROM EGO_DATA_LEVEL_VL
2090 WHERE DATA_LEVEL_ID = p_data_level_id;
2091
2092 IF(l_data_level_mdata.DATA_LEVEL_ID IS NOT NULL) THEN
2093 code_debug ('In Get_Data_Level_Metadata creating add data level metadata to cache ');
2094 Add_Data_Level_To_Cache(p_data_level_metadata_obj => l_data_level_mdata);
2095 RETURN l_data_level_mdata;
2096 ELSE
2097 code_debug ('In Get_Data_Level_Metadata cannot find data level metadata ');
2098 RETURN NULL;
2099 END IF;
2100 ELSE
2101 code_debug ('In Get_Data_Level_Metadata data level metadata observed in cache ');
2102 RETURN l_data_level_mdata;
2103 END IF;
2104
2105 EXCEPTION
2106 WHEN OTHERS THEN
2107 code_debug ('In Get_Data_Level_Metadata EXCEPTION ');
2108 RETURN l_data_level_mdata;
2109
2110 END Get_Data_Level_Metadata;
2111
2112 ------------------------------------------------------------------------
2113
2114 FUNCTION Get_Enabled_Data_Levels_For_AG (p_attr_group_id IN NUMBER)
2115 RETURN EGO_DATA_LEVEL_TABLE
2116 IS
2117 CURSOR enabled_data_levels(p_attr_group_id IN NUMBER)
2118 IS
2119 SELECT DATA_LEVEL_ID, VIEW_PRIVILEGE_ID,EDIT_PRIVILEGE_ID,RAISE_PRE_EVENT,RAISE_POST_EVENT, DEFAULTING
2120 FROM EGO_ATTR_GROUP_DL
2121 WHERE ATTR_GROUP_ID = p_attr_group_id;
2122
2123 l_data_level_table EGO_DATA_LEVEL_TABLE := EGO_DATA_LEVEL_TABLE();
2124 l_data_level_obj EGO_DATA_LEVEL_ROW_OBJ;
2125 l_data_level_rec enabled_data_levels%ROWTYPE;
2126 l_data_level_mdata_obj EGO_DATA_LEVEL_METADATA_OBJ;
2127 BEGIN
2128 code_debug('in Get_Enabled_Data_Levels_For_AG');
2129 l_data_level_obj := EGO_DATA_LEVEL_ROW_OBJ(null,null,null,null,null,null,null,null);
2130 OPEN enabled_data_levels(p_attr_group_id);
2131 LOOP
2132 FETCH enabled_data_levels INTO l_data_level_rec;
2133 EXIT WHEN enabled_data_levels%NOTFOUND;
2134 code_debug('in Get_Enabled_Data_Levels_For_AG in the LOOP -'||l_data_level_rec.DATA_LEVEL_ID);
2135
2136 l_data_level_obj.DATA_LEVEL_ID := l_data_level_rec.DATA_LEVEL_ID;
2137 l_data_level_obj.RAISE_PRE_EVENT := l_data_level_rec.RAISE_PRE_EVENT;
2138 l_data_level_obj.RAISE_POST_EVENT := l_data_level_rec.RAISE_POST_EVENT;
2139 l_data_level_obj.VIEW_PRIVILEGE_ID := l_data_level_rec.VIEW_PRIVILEGE_ID;
2140 l_data_level_obj.EDIT_PRIVILEGE_ID := l_data_level_rec.EDIT_PRIVILEGE_ID;
2141 l_data_level_obj.DEFAULTING := l_data_level_rec.DEFAULTING;
2142
2143 l_data_level_mdata_obj := Get_Data_Level_Metadata(l_data_level_obj.DATA_LEVEL_ID);
2144
2145 l_data_level_obj.DATA_LEVEL_NAME := l_data_level_mdata_obj.DATA_LEVEL_NAME;
2146 l_data_level_obj.USER_DATA_LEVEL_NAME := l_data_level_mdata_obj.USER_DATA_LEVEL_NAME;
2147
2148 l_data_level_table.EXTEND();
2149 l_data_level_table(l_data_level_table.LAST) := l_data_level_obj;
2150
2151 END LOOP;
2152 CLOSE enabled_data_levels;
2153
2154 RETURN l_data_level_table;
2155
2156 END Get_Enabled_Data_Levels_For_AG;
2157
2158 -----------------------------------------------------------------------
2159
2160 FUNCTION Get_Data_Level_Col_Array( p_application_id IN NUMBER
2161 ,p_attr_group_type IN VARCHAR2)
2162 RETURN EGO_COL_METADATA_ARRAY
2163 IS
2164
2165 CURSOR associated_dl_cursor(p_app_id IN NUMBER, p_ag_type IN VARCHAR2)
2166 IS
2167 SELECT DATA_LEVEL_ID
2168 FROM EGO_DATA_LEVEL_B
2169 WHERE APPLICATION_ID = p_app_id
2170 AND ATTR_GROUP_TYPE = p_ag_type;
2171
2172 l_data_level_id NUMBER;
2173 l_dl_mdata_obj EGO_DATA_LEVEL_METADATA_OBJ;
2174 l_data_level_obj EGO_COL_METADATA_OBJ := EGO_COL_METADATA_OBJ(null, null);
2175 l_dl_col_list VARCHAR2(2000);
2176 l_dl_col_array EGO_COL_METADATA_ARRAY;
2177
2178 BEGIN
2179
2180 l_dl_col_array := EGO_COL_METADATA_ARRAY();
2181 code_debug('In Get_Data_Level_Col_Array starting: p_application_id-'||p_application_id||' p_attr_group_type-'||p_attr_group_type);
2182 l_dl_col_list := ' ';
2183 OPEN associated_dl_cursor(p_application_id, p_attr_group_type);
2184 LOOP
2185 FETCH associated_dl_cursor INTO l_data_level_id;
2186 EXIT WHEN associated_dl_cursor%NOTFOUND;
2187
2188 l_dl_mdata_obj := Get_Data_Level_Metadata(l_data_level_id);
2189 code_debug('In Get_Data_Level_Col_Array l_data_level_id ='||l_data_level_id||' l_dl_col_list-'||l_dl_col_list||' pk1-'||l_dl_mdata_obj.PK_COLUMN_NAME1);
2190 IF(l_dl_mdata_obj.PK_COLUMN_NAME5 IS NOT NULL AND INSTR(l_dl_col_list,l_dl_mdata_obj.PK_COLUMN_NAME5) = 0) THEN
2191 l_data_level_obj.COL_NAME := l_dl_mdata_obj.PK_COLUMN_NAME5;
2192 l_data_level_obj.DATA_TYPE := l_dl_mdata_obj.PK_COLUMN_TYPE5;
2193 l_dl_col_list := l_dl_col_list||' '||l_dl_mdata_obj.PK_COLUMN_NAME5||' ';
2194 l_dl_col_array.EXTEND();
2195 l_dl_col_array(l_dl_col_array.LAST) := EGO_COL_METADATA_OBJ(l_dl_mdata_obj.PK_COLUMN_NAME5, l_dl_mdata_obj.PK_COLUMN_TYPE5);
2196 END IF;
2197 IF(l_dl_mdata_obj.PK_COLUMN_NAME4 IS NOT NULL AND INSTR(l_dl_col_list,l_dl_mdata_obj.PK_COLUMN_NAME4) = 0) THEN
2198 l_data_level_obj.COL_NAME := l_dl_mdata_obj.PK_COLUMN_NAME4;
2199 l_data_level_obj.DATA_TYPE := l_dl_mdata_obj.PK_COLUMN_TYPE4;
2200 l_dl_col_list := l_dl_col_list||' '||l_dl_mdata_obj.PK_COLUMN_NAME4||' ';
2201 l_dl_col_array.EXTEND();
2202 l_dl_col_array(l_dl_col_array.LAST) := EGO_COL_METADATA_OBJ(l_dl_mdata_obj.PK_COLUMN_NAME4, l_dl_mdata_obj.PK_COLUMN_TYPE4);
2203 END IF;
2204 IF(l_dl_mdata_obj.PK_COLUMN_NAME3 IS NOT NULL AND INSTR(l_dl_col_list,l_dl_mdata_obj.PK_COLUMN_NAME3) = 0) THEN
2205 l_data_level_obj.COL_NAME := l_dl_mdata_obj.PK_COLUMN_NAME3;
2206 l_data_level_obj.DATA_TYPE := l_dl_mdata_obj.PK_COLUMN_TYPE3;
2207 l_dl_col_list := l_dl_col_list||' '||l_dl_mdata_obj.PK_COLUMN_NAME3||' ';
2208 l_dl_col_array.EXTEND();
2209 l_dl_col_array(l_dl_col_array.LAST) := EGO_COL_METADATA_OBJ(l_dl_mdata_obj.PK_COLUMN_NAME3, l_dl_mdata_obj.PK_COLUMN_TYPE3);
2210 END IF;
2211 IF(l_dl_mdata_obj.PK_COLUMN_NAME2 IS NOT NULL AND INSTR(l_dl_col_list,l_dl_mdata_obj.PK_COLUMN_NAME2) = 0) THEN
2212 l_data_level_obj.COL_NAME := l_dl_mdata_obj.PK_COLUMN_NAME2;
2213 l_data_level_obj.DATA_TYPE := l_dl_mdata_obj.PK_COLUMN_TYPE2;
2214 l_dl_col_list := l_dl_col_list||' '||l_dl_mdata_obj.PK_COLUMN_NAME2||' ';
2215 l_dl_col_array.EXTEND();
2216 l_dl_col_array(l_dl_col_array.LAST) := EGO_COL_METADATA_OBJ(l_dl_mdata_obj.PK_COLUMN_NAME2, l_dl_mdata_obj.PK_COLUMN_TYPE2);
2217 END IF;
2218 IF(l_dl_mdata_obj.PK_COLUMN_NAME1 IS NOT NULL AND INSTR(l_dl_col_list,l_dl_mdata_obj.PK_COLUMN_NAME1) = 0) THEN
2219 l_data_level_obj.COL_NAME := l_dl_mdata_obj.PK_COLUMN_NAME1;
2220 l_data_level_obj.DATA_TYPE := l_dl_mdata_obj.PK_COLUMN_TYPE1;
2221 l_dl_col_list := l_dl_col_list||' '||l_dl_mdata_obj.PK_COLUMN_NAME1||' ';
2222 l_dl_col_array.EXTEND();
2223 l_dl_col_array(l_dl_col_array.LAST) := EGO_COL_METADATA_OBJ(l_dl_mdata_obj.PK_COLUMN_NAME1, l_dl_mdata_obj.PK_COLUMN_TYPE1);
2224 END IF;
2225 code_debug('In Get_Data_Level_Col_Array ... for '||l_data_level_obj.COL_NAME||' l_dl_col_list-'||l_dl_col_list);
2226 END LOOP;
2227 code_debug('In Get_Data_Level_Col_Array l_dl_col_array.COUNT:'||l_dl_col_array.COUNT);
2228 IF(l_dl_col_array.COUNT <1) THEN
2229 RETURN NULL;
2230 ELSE
2231 RETURN l_dl_col_array;
2232 END IF;
2233
2234 END Get_Data_Level_Col_Array;
2235
2236 -------------------------------------------------------------------------------
2237
2238 FUNCTION Get_Data_Levels_For_AGType ( p_application_id IN NUMBER
2239 ,p_attr_group_type IN VARCHAR2
2240 )
2241 RETURN EGO_DATA_LEVEL_METADATA_TABLE
2242 IS
2243
2244 CURSOR associated_data_levels ( p_application_id IN NUMBER
2245 ,p_attr_group_type IN VARCHAR2
2246 )
2247 IS
2248 SELECT DATA_LEVEL_ID
2249 FROM EGO_DATA_LEVEL_VL
2250 WHERE APPLICATION_ID = p_application_id
2251 AND ATTR_GROUP_TYPE = p_attr_Group_type;
2252
2253 l_dl_mdata EGO_DATA_LEVEL_METADATA_OBJ;
2254 l_dl_id NUMBER;
2255 l_dl_mdata_table EGO_DATA_LEVEL_METADATA_TABLE := EGO_DATA_LEVEL_METADATA_TABLE();
2256
2257 BEGIN
2258
2259 OPEN associated_data_levels(p_application_id, p_attr_Group_type);
2260 LOOP
2261 FETCH associated_data_levels INTO l_dl_id;
2262 EXIT WHEN associated_data_levels%NOTFOUND;
2263 l_dl_mdata_table.EXTEND;
2264 l_dl_mdata_table(l_dl_mdata_table.LAST) := Get_Data_Level_Metadata(l_dl_id);
2265 END LOOP;
2266
2267 RETURN l_dl_mdata_table;
2268
2269 END Get_Data_Levels_For_AGType;
2270
2271 ---------------------------------------------------------------------------------
2272
2273 FUNCTION Get_All_Data_Level_PK_Names ( p_application_id IN NUMBER
2274 ,p_attr_group_type IN VARCHAR2)
2275 RETURN VARCHAR2 IS
2276
2277 CURSOR get_all_pk_names (cp_application_id IN NUMBER
2278 ,cp_attr_group_type IN VARCHAR2)
2279 IS
2280 SELECT DISTINCT pk1_column_name column_name
2281 FROM ego_data_level_b
2282 WHERE application_id=cp_application_id
2283 AND attr_group_type = cp_attr_group_type
2284 AND pk1_column_name IS NOT NULL
2285 UNION
2286 SELECT DISTINCT pk2_column_name column_name
2287 FROM ego_data_level_b
2288 WHERE application_id=cp_application_id
2289 AND attr_group_type = cp_attr_group_type
2290 AND pk2_column_name IS NOT NULL
2291 UNION
2292 SELECT DISTINCT pk3_column_name column_name
2293 FROM ego_data_level_b
2294 WHERE application_id=cp_application_id
2295 AND attr_group_type = cp_attr_group_type
2296 AND pk3_column_name IS NOT NULL
2297 UNION
2298 SELECT DISTINCT pk4_column_name column_name
2299 FROM ego_data_level_b
2300 WHERE application_id=cp_application_id
2301 AND attr_group_type = cp_attr_group_type
2302 AND pk4_column_name IS NOT NULL
2303 UNION
2304 SELECT DISTINCT pk5_column_name column_name
2305 FROM ego_data_level_b
2306 WHERE application_id=cp_application_id
2307 AND attr_group_type = cp_attr_group_type
2308 AND pk5_column_name IS NOT NULL;
2309
2310 l_dl_col_list VARCHAR2(1000) := null;
2311
2312 BEGIN
2313 FOR cr in get_all_pk_names (cp_application_id => p_application_id
2314 ,cp_attr_group_type => p_attr_group_type) LOOP
2315 IF l_dl_col_list IS NULL THEN
2316 l_dl_col_list := cr.column_name;
2317 ELSE
2318 l_dl_col_list := l_dl_col_list||', '||cr.column_name;
2319 END IF;
2320 END LOOP;
2321 return l_dl_col_list;
2322 END Get_All_Data_Level_PK_Names;
2323
2324 ---------------------------------------------------------------------------------
2325
2326 FUNCTION HAS_COLUMN_IN_TABLE (p_table_name IN VARCHAR2
2327 ,p_column_name IN VARCHAR2
2328 )
2329 RETURN VARCHAR2 IS
2330 l_dummy_number NUMBER;
2331 BEGIN
2332 SELECT 1
2333 INTO l_dummy_number
2334 FROM SYS.all_tab_columns
2335 WHERE table_name = p_table_name
2336 AND column_name = p_column_name;
2337 RETURN FND_API.G_TRUE;
2338 EXCEPTION
2339 WHEN OTHERS THEN
2340 RETURN FND_API.G_FALSE;
2341 END has_column_in_table;
2342
2343
2344 END EGO_USER_ATTRS_COMMON_PVT;