DBA Data[Home] [Help]

PACKAGE BODY: APPS.EGO_USER_ATTRS_BULK_PVT

Source


1 PACKAGE BODY ego_user_attrs_bulk_pvt AS
2 /* $Header: EGOVBUAB.pls 120.137.12020000.15 2013/02/13 14:32:10 vijoshi ship $ */
3 
4                       ------------------------
5                       -- Private Data Types --
6                       ------------------------
7 
8     TYPE DIST_ATTR_IN_DATA_SET_REC IS RECORD
9     (
10       ATTR_GROUP_ID                     NUMBER
11      ,ATTR_INT_NAME                     VARCHAR2(30)
12      ,ATTR_GROUP_INT_NAME               VARCHAR2(30)
13     );
14     TYPE DIST_ATTR_IN_DATA_SET_TABLE IS TABLE OF DIST_ATTR_IN_DATA_SET_REC
15       INDEX BY BINARY_INTEGER;
16 
17     TYPE PK_COL_REC IS RECORD  (PK_COL_1  VARCHAR2(300)
18                                ,PK_COL_2  VARCHAR2(300)
19                                ,PK_COL_3  VARCHAR2(300)
20                                ,PK_COL_4  VARCHAR2(300)
21                                ,PK_COL_5  VARCHAR2(300)
22                                );
23     TYPE PK_COL_TABLE IS TABLE OF PK_COL_REC INDEX BY BINARY_INTEGER;
24 
25 
26                    ------------------------------
27                    -- Private Global Variables --
28                    ------------------------------
29 
30     G_PKG_NAME           CONSTANT VARCHAR2(30) := 'EGO_USER_ATTRS_BULK_PVT';
31 
32     G_CURRENT_USER_ID             NUMBER;
33     G_CURRENT_LOGIN_ID            NUMBER;
34     G_API_VERSION                 NUMBER;
35 
36     G_USER_NAME                   FND_USER.USER_NAME%TYPE;
37     G_HZ_PARTY_ID                 VARCHAR2(30);
38 
39     G_NO_USER_NAME_TO_VALIDATE    EXCEPTION;
40 
41     -- used for error handling.
42     G_ADD_ERRORS_TO_FND_STACK     VARCHAR2(1);
43     G_APPLICATION_CONTEXT         VARCHAR2(30);
44     G_ENTITY_ID                   NUMBER;
45     G_ENTITY_CODE                 VARCHAR2(30);
46 
47     G_PK_COLS_TABLE               PK_COL_TABLE;
48 
49     G_REQUEST_ID                  NUMBER := FND_GLOBAL.CONC_REQUEST_ID;
50 
51     G_FND_RET_STS_WARNING         VARCHAR2(1):= 'W';
52 
53                           -------------------------
54                           -- Private Procedures  --
55                           -------------------------
56 
57 ----------------------------------------------------------------------
58 
59 procedure code_debug (msg   IN  VARCHAR2
60                      ,debug_level  IN  NUMBER  default 3
61                      ) IS
62 BEGIN
63 null;
64 --  IF (INSTR(msg, 'Insert_Default_Val_Rows') <> 0 ) THEN
65 --    sri_debug('EGOVBUAB '||msg);
66 --  END IF;
67 --  EGO_USER_ATTRS_DATA_PVT.Debug_Msg(msg , debug_level);
68 
69 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
70   IF NVL(FND_GLOBAL.conc_request_id, -1) <> -1 THEN
71 
72     FND_FILE.put_line(which => FND_FILE.LOG
73                      ,buff  => '[EGOVBUAB] '||msg);
74   END IF;
75 END IF;
76 EXCEPTION
77   WHEN OTHERS THEN
78     NULL;
79 END code_debug;
80 
81 ----------------------------------------------------------------------
82 
83 PROCEDURE write_intf_records (p_data_set_id    in number
84                              ,p_count   IN  NUMBER
85                              ) IS
86 -- PRAGMA AUTONOMOUS_TRANSACTION;
87 
88   l_rec  ego_itm_usr_attr_intrfc%ROWTYPE;
89   l_dummy_number  NUMBER;
90 BEGIN
91 NULL;
92 /***
93   SELECT count(*)
94   INTO l_dummy_number
95   FROM ego_itm_usr_attr_intrfc
96   WHERE data_set_id = p_data_set_id;
97   code_debug(p_log_level => 0
98             ,p_module => 'write_intf_records'
99             ,p_message => p_count||' - No records in intf table '||l_dummy_number
100             );
101   IF l_dummy_number > 0 THEN
102     code_debug(p_log_level => 0
103               ,p_module => 'write_intf_records'
104               ,p_message => p_count||' Writing data in format '||
105         ' inventory_item_id, organization_id, data_level_id, revision_id, pk1_value, pk2_value, '||
106         ' attr_group_id, attr_group_int_name, attr_int_name, attr_value_str, attr_value_num, '||
107         ' row_identifier');
108     IF p_count < 100 THEN
109       FOR cr in (SELECT * FROM ego_itm_usr_attr_intrfc
110                   WHERE data_set_id = p_data_set_id
111               ORDER BY inventory_item_id, organization_id, data_level_id,
112                        revision_id, pk1_value, pk2_value, attr_group_id,
113                        attr_int_name, row_identifier
114                 ) LOOP
115         code_debug(p_log_level => 0
116                   ,p_module => 'write_intf_records'
117                   ,p_message => p_count||' - '||cr.inventory_item_id||', '||
118                          cr.organization_id||', '||cr.data_level_id||', '||cr.revision_id||', '||
119                          cr.pk1_value||',  '||cr.pk2_value||', '||cr.attr_group_id||', '||
120                          cr.attr_group_int_name||', '||cr.attr_int_name||',  '||
121                          cr.attr_value_str||', '||cr.attr_value_num||', '||cr.row_identifier);
122       END LOOP;
123     END IF;
124   END IF;
125 ***/
126 END write_intf_records;
127 
128 ----------------------------------------------------------------------
129 
130 FUNCTION Attr_Is_In_Data_Set (
131         p_attr_metadata_obj             IN   EGO_ATTR_METADATA_OBJ
132        ,p_dist_attrs_in_data_set_table  IN   DIST_ATTR_IN_DATA_SET_TABLE
133 ) RETURN BOOLEAN
134 IS
135 
136     l_is_in_data_set                    BOOLEAN;
137 
138   BEGIN
139 
140     l_is_in_data_set := FALSE;
141     IF (p_dist_attrs_in_data_set_table.COUNT > 0) THEN
142       FOR i IN p_dist_attrs_in_data_set_table.FIRST .. p_dist_attrs_in_data_set_table.LAST
143       LOOP
144         EXIT WHEN l_is_in_data_set;
145         IF (p_dist_attrs_in_data_set_table(i).ATTR_INT_NAME = p_attr_metadata_obj.ATTR_NAME) THEN
146           l_is_in_data_set := TRUE;
147         END IF;
148       END LOOP;
149     END IF;
150 
151     RETURN l_is_in_data_set;
152 
153 END Attr_Is_In_Data_Set;
154 
155 ----------------------------------------------------------------------
156 
157 Function GET_ATTR_OBJECT
158   (p_attr_grp_meta_obj IN EGO_ATTR_GROUP_METADATA_OBJ
159   ,p_attr_int_name     IN VARCHAR2)
160   RETURN EGO_ATTR_METADATA_OBJ IS
161   --
162   -- used by log_error_messages
163   -- returns the attribute metadata object
164   --
165     l_attr_metadata_obj     EGO_ATTR_METADATA_TABLE;
166   BEGIN
167     l_attr_metadata_obj := p_attr_grp_meta_obj.ATTR_METADATA_TABLE;
168     IF l_attr_metadata_obj.count > 0 THEN
169       FOR i IN l_attr_metadata_obj.FIRST .. l_attr_metadata_obj.LAST LOOP
170         IF l_attr_metadata_obj(i).attr_name = p_attr_int_name THEN
171           RETURN l_attr_metadata_obj(i);
172         END IF;
173       END LOOP;
174     END IF;
175     RETURN NULL;
176   EXCEPTION
177     WHEN OTHERS THEN
178       RETURN NULL;
179   END GET_ATTR_OBJECT;
180 
181 ----------------------------------------------------------------------
182 
183 Function GET_ENTITY_INDEX
184   (p_entity_index        IN  NUMBER
185   ,p_instance_pk1_value  IN  VARCHAR2
186   ,p_instance_pk2_value  IN  VARCHAR2
187   ,p_instance_pk3_value  IN  VARCHAR2
188   ,p_instance_pk4_value  IN  VARCHAR2
189   ,p_instance_pk5_value  IN  VARCHAR2
190   ) RETURN NUMBER IS
191   --
192   -- used to get the entity index for error logging
193   --
194     l_entity_index     NUMBER;
195     l_pk_col_rec       PK_COL_REC;
196     l_null_char_value  VARCHAR2(10);
197   BEGIN
198     IF NVL(p_entity_index,0) <> 0 THEN
199       RETURN p_entity_index;
200     ELSE
201       l_entity_index := NULL;
202       l_null_char_value := FND_API.G_MISS_CHAR;
203       l_pk_col_rec.pk_col_1 := NVL(p_instance_pk1_value, l_null_char_value);
204       l_pk_col_rec.pk_col_2 := NVL(p_instance_pk2_value, l_null_char_value);
205       l_pk_col_rec.pk_col_3 := NVL(p_instance_pk3_value, l_null_char_value);
206       l_pk_col_rec.pk_col_4 := NVL(p_instance_pk4_value, l_null_char_value);
207       l_pk_col_rec.pk_col_5 := NVL(p_instance_pk5_value, l_null_char_value);
208       IF (G_PK_COLS_TABLE.COUNT > 0) THEN
209         FOR i IN G_PK_COLS_TABLE.FIRST .. G_PK_COLS_TABLE.LAST LOOP
210           EXIT WHEN l_entity_index IS NOT NULL;
211           IF (G_PK_COLS_TABLE(i).pk_col_1 = l_pk_col_rec.pk_col_1 AND
212               G_PK_COLS_TABLE(i).pk_col_2 = l_pk_col_rec.pk_col_2 AND
213               G_PK_COLS_TABLE(i).pk_col_3 = l_pk_col_rec.pk_col_3 AND
214               G_PK_COLS_TABLE(i).pk_col_4 = l_pk_col_rec.pk_col_4 AND
215               G_PK_COLS_TABLE(i).pk_col_5 = l_pk_col_rec.pk_col_5 ) THEN
216             l_entity_index := i;
217           END IF;
218         END LOOP;
219       ELSE
220         -- no records exist
221         NULL;
222       END IF;
223       IF l_entity_index IS NULL THEN
224         l_entity_index := G_PK_COLS_TABLE.COUNT+1;
225         G_PK_COLS_TABLE(l_entity_index) := l_pk_col_rec;
226       END IF;
227       RETURN l_entity_index;
228     END IF;
229   EXCEPTION
230     WHEN OTHERS THEN
231       RETURN -1;
232   END GET_ENTITY_INDEX;
233 
234 ----------------------------------------------------------------------
235 
236 PROCEDURE Log_Errors_Now (
237         p_entity_id                     IN   NUMBER
238        ,p_entity_index                  IN   NUMBER
239        ,p_entity_code                   IN   VARCHAR2
240        ,p_object_name                   IN   VARCHAR2
241        ,p_pk1_column_name               IN   VARCHAR2
242        ,p_pk2_column_name               IN   VARCHAR2
243        ,p_pk3_column_name               IN   VARCHAR2
244        ,p_pk4_column_name               IN   VARCHAR2
245        ,p_pk5_column_name               IN   VARCHAR2
246        ,p_classification_col_name       IN   VARCHAR2
247        ,p_interface_table_name          IN   VARCHAR2
248        ,p_err_col_static_sql            IN   VARCHAR2
249        ,p_err_where_static_sql          IN   VARCHAR2
250        ,p_attr_grp_meta_obj             IN   EGO_ATTR_GROUP_METADATA_OBJ
251        ,p_data_set_id                   IN   NUMBER DEFAULT NULL /*Fix for bug#9678667. Literal to bind*/
252 ) IS
253   --
254   -- no exception is thrown
255   -- calling program will handle the exceptions.
256   --
257     l_err_token_table             ERROR_HANDLER.Token_Tbl_Type;
258     l_err_col_dynamic_sql         VARCHAR2(32767);
259     l_err_where_dynamic_sql       VARCHAR2(32767);
260     l_err_sql                     VARCHAR2(32767);
261     l_err_msg_name                VARCHAR2(99);
262     l_attr_grp_disp_name          FND_DESCR_FLEX_CONTEXTS_TL.descriptive_flex_context_name%TYPE;
263     l_attr_metadata_obj           EGO_ATTR_METADATA_OBJ;
264     l_attr_disp_name              FND_DESCR_FLEX_CONTEXTS_TL.descriptive_flex_context_name%TYPE;
265     l_comma_message               VARCHAR2(99);
266     l_msg_token_value             VARCHAR2(32767);
267     l_attr_table                  EGO_ATTR_METADATA_TABLE;
268     l_entity_index                NUMBER;
269 
270     TYPE DYNAMIC_CUR IS REF CURSOR;
271     c_err_cursor                  DYNAMIC_CUR;
272 
273     TYPE error_record_type IS RECORD
274        (process_status       NUMBER
275        ,row_identifier       NUMBER
276        ,attr_group_int_name  VARCHAR2(999)
277        ,attr_int_name        VARCHAR2(999)
278        ,attr_value_str       VARCHAR2(32767)
279        ,attr_value_num       NUMBER
280        ,attr_value_date      DATE
281        ,attr_disp_value      VARCHAR2(32767)
282        ,transaction_type     VARCHAR2(99)
283        ,transaction_id       NUMBER
284        ,attr_group_id        NUMBER
285        ,pk_col_1             VARCHAR2(256)
286        ,pk_col_2             VARCHAR2(256)
287        ,pk_col_3             VARCHAR2(256)
288        ,pk_col_4             VARCHAR2(256)
289        ,pk_col_5             VARCHAR2(256)
290        ,class_code_value     VARCHAR2(256)
291        );
292 
293     error_rec   error_record_type;
294 
295   BEGIN
296     -- add the key value into the fetch columns.
297     IF (p_pk1_column_name IS NOT NULL) THEN
298       l_err_col_dynamic_sql := ', '||p_pk1_column_name||' AS pk_col_1 ';
299     ELSE
300       l_err_col_dynamic_sql := ', NULL AS pk_col_1 ';
301     END IF;
302     IF (p_pk2_column_name IS NOT NULL) THEN
303       l_err_col_dynamic_sql := l_err_col_dynamic_sql || ', '||p_pk2_column_name||' AS pk_col_2 ';
304     ELSE
305       l_err_col_dynamic_sql := l_err_col_dynamic_sql || ', NULL AS pk_col_2 ';
306     END IF;
307     IF (p_pk3_column_name IS NOT NULL) THEN
308       l_err_col_dynamic_sql := l_err_col_dynamic_sql || ', '||p_pk3_column_name||' AS pk_col_3 ';
309     ELSE
310       l_err_col_dynamic_sql := l_err_col_dynamic_sql || ', NULL AS pk_col_3 ';
311     END IF;
312     IF (p_pk4_column_name IS NOT NULL) THEN
313       l_err_col_dynamic_sql := l_err_col_dynamic_sql || ', '||p_pk4_column_name||' AS pk_col_4 ';
314     ELSE
315       l_err_col_dynamic_sql := l_err_col_dynamic_sql || ', NULL AS pk_col_4 ';
316     END IF;
317     IF (p_pk5_column_name IS NOT NULL) THEN
318       l_err_col_dynamic_sql := l_err_col_dynamic_sql || ', '||p_pk5_column_name||' AS pk_col_5 ';
319     ELSE
320       l_err_col_dynamic_sql := l_err_col_dynamic_sql || ', NULL AS pk_col_5 ';
321     END IF;
322     IF (p_classification_col_name IS NOT NULL) THEN
323       l_err_col_dynamic_sql := l_err_col_dynamic_sql || ', '||p_classification_col_name||' AS class_code_value ';
324     ELSE
325       l_err_col_dynamic_sql := l_err_col_dynamic_sql || ', NULL AS class_code_value ';
326     END IF;
327 
328     -- add something if reqd
329     l_err_where_dynamic_sql  := NULL;
330 
331     l_err_sql := p_err_col_static_sql||l_err_col_dynamic_sql||' FROM '||p_interface_table_name
332                  ||p_err_where_static_sql||l_err_where_dynamic_sql;
333     -- the error tokens are used in multiple places
334     IF p_attr_grp_meta_obj IS NOT NULL THEN
335       l_attr_grp_disp_name := p_attr_grp_meta_obj.attr_group_disp_name;
336     ELSE
337       l_attr_grp_disp_name := NULL;
338     END IF;
339 
340     OPEN c_err_cursor FOR l_err_sql USING p_data_set_id, p_attr_grp_meta_obj.attr_group_name;   /*Fix for bug#9678667. Literal to bind*/
341 
342     LOOP
343       FETCH c_err_cursor INTO error_rec;
344       EXIT WHEN c_err_cursor%NOTFOUND;
345       -- some variables that will be used over the messages
346       l_attr_metadata_obj := GET_ATTR_OBJECT (p_attr_grp_meta_obj => p_attr_grp_meta_obj
347                                              ,p_attr_int_name     => error_rec.attr_int_name);
348       IF l_attr_metadata_obj IS NULL THEN
349         --Bug 5144368:START
350         --we should not retun from here but has to log the errors in the
351         --MTL_INTERFACE_ERRORS with the wrong attribute internal name as the
352         --attribute display name
353         l_attr_metadata_obj := EGO_ATTR_METADATA_OBJ(null,null,null,null,null,
354                                                      null,null,null,null,null,
355                                                      null,null,null,null,null,
356                                                      null,null,null,null,null,
357                                                      null,null,null,null,null);
358         l_attr_metadata_obj.attr_disp_name := error_rec.attr_int_name;
359         --Bug 5144368:END
360       END IF;
361 
362       l_entity_index := get_entity_index(p_entity_index       => p_entity_id
363                                         ,p_instance_pk1_value => error_rec.pk_col_1
364                                         ,p_instance_pk2_value => error_rec.pk_col_2
365                                         ,p_instance_pk3_value => error_rec.pk_col_3
366                                         ,p_instance_pk4_value => error_rec.pk_col_4
367                                         ,p_instance_pk5_value => error_rec.pk_col_5
368                                         );
369 
370       IF BITAND(error_rec.PROCESS_STATUS,G_PS_BAD_ATTR_OR_AG_METADATA) <> 0 THEN
371         l_err_msg_name := 'EGO_EF_ATTR_DOES_NOT_EXIST';
372         l_err_token_table(1).TOKEN_NAME := 'BAD_ATTR_NAME';
373         l_err_token_table(1).TOKEN_VALUE := l_attr_metadata_obj.attr_disp_name;
374         l_err_token_table(2).TOKEN_NAME := 'AG_NAME';
375         l_err_token_table(2).TOKEN_VALUE := l_attr_grp_disp_name;
376         ERROR_HANDLER.Add_Error_Message
377            (p_message_name              => l_err_msg_name
378            ,p_application_id            =>'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
379            ,p_token_tbl                 => l_err_token_table
380            ,p_message_type              => FND_API.G_RET_STS_ERROR
381            ,p_row_identifier            => error_rec.TRANSACTION_ID
382            ,p_entity_id                 => G_ENTITY_ID
383            ,p_entity_index              => l_entity_index
384            ,p_table_name                => p_interface_table_name
385            ,p_entity_code               => G_ENTITY_CODE
386            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
387           );
388         l_err_token_table.DELETE();
389       END IF;
390 
391       IF BITAND(error_rec.PROCESS_STATUS,G_PS_MULTIPLE_ENTRIES) <> 0 THEN
392         l_err_msg_name := 'EGO_EF_MULT_VALUES_FOR_ATTR';
393         l_err_token_table(1).TOKEN_NAME := 'ATTR_NAME';
394         l_err_token_table(1).TOKEN_VALUE := l_attr_metadata_obj.attr_disp_name;
395         l_err_token_table(2).TOKEN_NAME := 'AG_NAME';
396         l_err_token_table(2).TOKEN_VALUE := l_attr_grp_disp_name;
397         ERROR_HANDLER.Add_Error_Message
398            (p_message_name              => l_err_msg_name
399            ,p_application_id            =>'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
400            ,p_token_tbl                 => l_err_token_table
401            ,p_message_type              => FND_API.G_RET_STS_ERROR
402            ,p_row_identifier            => error_rec.TRANSACTION_ID
403            ,p_entity_id                 => G_ENTITY_ID
404            ,p_entity_index              => l_entity_index
405            ,p_table_name                => p_interface_table_name
406            ,p_entity_code               => G_ENTITY_CODE
407            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
408           );
409         l_err_token_table.DELETE();
410       END IF;
411 
412       IF BITAND(error_rec.PROCESS_STATUS,G_PS_MULTIPLE_VALUES) <> 0 THEN
413         l_err_msg_name := 'EGO_EF_INT_AND_DISP_VAL_EXIST';
414         l_err_token_table(1).TOKEN_NAME := 'ATTR_NAME';
415         l_err_token_table(1).TOKEN_VALUE := l_attr_metadata_obj.attr_disp_name;
416         l_err_token_table(2).TOKEN_NAME := 'AG_NAME';
417         l_err_token_table(2).TOKEN_VALUE := l_attr_grp_disp_name;
418         ERROR_HANDLER.Add_Error_Message
419            (p_message_name              => l_err_msg_name
420            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
421            ,p_token_tbl                 => l_err_token_table
422            ,p_message_type              => FND_API.G_RET_STS_ERROR
423            ,p_row_identifier            => error_rec.TRANSACTION_ID
424            ,p_entity_id                 => G_ENTITY_ID
425            ,p_entity_index              => l_entity_index
426            ,p_table_name                => p_interface_table_name
427            ,p_entity_code               => G_ENTITY_CODE
428            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
429           );
430         l_err_token_table.DELETE();
431       END IF;
432 
433       IF BITAND(error_rec.PROCESS_STATUS,G_PS_NO_PRIVILEGES) <> 0 THEN
434         l_err_msg_name := 'EGO_EF_AG_USER_PRIV_ERR';
435         l_err_token_table(1).TOKEN_NAME := 'USER_NAME';
436         l_err_token_table(1).TOKEN_VALUE := G_USER_NAME;
437         l_err_token_table(2).TOKEN_NAME := 'AG_NAME';
438         l_err_token_table(2).TOKEN_VALUE := l_attr_grp_disp_name;
439         ERROR_HANDLER.Add_Error_Message
440            (p_message_name              => l_err_msg_name
441            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
442            ,p_token_tbl                 => l_err_token_table
443            ,p_message_type              => FND_API.G_RET_STS_ERROR
444            ,p_row_identifier            => error_rec.TRANSACTION_ID
445            ,p_entity_id                 => G_ENTITY_ID
446            ,p_entity_index              => l_entity_index
447            ,p_table_name                => p_interface_table_name
448            ,p_entity_code               => G_ENTITY_CODE
449            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
450           );
451         l_err_token_table.DELETE();
452       END IF;
453 
454       IF BITAND(error_rec.PROCESS_STATUS,G_PS_VALUE_NOT_IN_VS) <> 0 THEN
455         IF (l_attr_metadata_obj.validation_code = EGO_EXT_FWK_PUB.G_INDEPENDENT_VALIDATION_CODE
456             OR
457             l_attr_metadata_obj.validation_code = EGO_EXT_FWK_PUB.G_TRANS_IND_VALIDATION_CODE
458             OR
459             l_attr_metadata_obj.validation_code = EGO_EXT_FWK_PUB.G_TABLE_VALIDATION_CODE
460            ) THEN
461           l_err_msg_name := 'EGO_EF_INDEPENDENT_VS_VIOLATED';
462           l_err_token_table(1).TOKEN_NAME := 'VALUE';
463           IF (l_attr_metadata_obj.data_type_code = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
464             l_err_token_table(1).TOKEN_VALUE := NVL(error_rec.ATTR_DISP_VALUE,error_rec.attr_value_num);
465           ELSIF (l_attr_metadata_obj.data_type_code = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE
466                  OR
467                  l_attr_metadata_obj.data_type_code = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE
468                 ) THEN
469             l_err_token_table(1).TOKEN_VALUE := NVL(error_rec.ATTR_DISP_VALUE,error_rec.attr_value_date);
470           ELSE
471             l_err_token_table(1).TOKEN_VALUE := NVL(error_rec.ATTR_DISP_VALUE,error_rec.attr_value_str);
472           END IF;
473           l_err_token_table(2).TOKEN_NAME := 'ATTR_NAME';
474           l_err_token_table(2).TOKEN_VALUE := l_attr_metadata_obj.attr_disp_name;
475           l_err_token_table(3).TOKEN_NAME := 'AG_NAME';
476           l_err_token_table(3).TOKEN_VALUE := l_attr_grp_disp_name;
477           ERROR_HANDLER.Add_Error_Message
478            (p_message_name              => l_err_msg_name
479            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
480            ,p_token_tbl                 => l_err_token_table
481            ,p_message_type              => FND_API.G_RET_STS_ERROR
482            ,p_row_identifier            => error_rec.TRANSACTION_ID
483            ,p_entity_id                 => G_ENTITY_ID
484            ,p_entity_index              => l_entity_index
485            ,p_table_name                => p_interface_table_name
486            ,p_entity_code               => G_ENTITY_CODE
487            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
488           );
489           l_err_token_table.DELETE();
490         END IF;
491       END IF;
492 
493       IF BITAND(error_rec.PROCESS_STATUS,G_PS_MIN_VAL_VIOLATION) <> 0 THEN
494         l_err_token_table(1).TOKEN_NAME := 'ATTR_NAME';
495         l_err_token_table(1).TOKEN_VALUE := l_attr_metadata_obj.attr_disp_name;
496         l_err_token_table(2).TOKEN_NAME := 'AG_NAME';
497         l_err_token_table(2).TOKEN_VALUE := l_attr_grp_disp_name;
498         IF (l_attr_metadata_obj.data_type_code = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
499           l_err_msg_name := 'EGO_EF_MIN_VAL_NUM_VIOLATED';
500           l_err_token_table(3).TOKEN_NAME := 'MIN_NUM_VALUE';
501           l_err_token_table(3).TOKEN_VALUE := l_attr_metadata_obj.MINIMUM_VALUE;
502         ELSE
503           l_err_msg_name := 'EGO_EF_MIN_VAL_DATE_VIOLATED';
504           l_err_token_table(3).TOKEN_NAME := 'MIN_DATE_VALUE';
505           l_err_token_table(3).TOKEN_VALUE := l_attr_metadata_obj.MINIMUM_VALUE;
506         END IF;
507         ERROR_HANDLER.Add_Error_Message
508            (p_message_name              => l_err_msg_name
509            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
510            ,p_token_tbl                 => l_err_token_table
511            ,p_message_type              => FND_API.G_RET_STS_ERROR
512            ,p_row_identifier            => error_rec.TRANSACTION_ID
513            ,p_entity_id                 => G_ENTITY_ID
514            ,p_entity_index              => l_entity_index
515            ,p_table_name                => p_interface_table_name
516            ,p_entity_code               => G_ENTITY_CODE
517            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
518           );
519         l_err_token_table.DELETE();
520       END IF;
521 
522       IF BITAND(error_rec.PROCESS_STATUS,G_PS_MAX_VAL_VIOLATION) <> 0 THEN
523         l_err_token_table(1).TOKEN_NAME := 'ATTR_NAME';
524         l_err_token_table(1).TOKEN_VALUE := l_attr_metadata_obj.attr_disp_name;
525         l_err_token_table(2).TOKEN_NAME := 'AG_NAME';
526         l_err_token_table(2).TOKEN_VALUE := l_attr_grp_disp_name;
527         IF (l_attr_metadata_obj.data_type_code = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
528           l_err_msg_name := 'EGO_EF_MAX_VAL_NUM_VIOLATED';
529           l_err_token_table(3).TOKEN_NAME := 'MAX_NUM_VALUE';
530           l_err_token_table(3).TOKEN_VALUE := l_attr_metadata_obj.MAXIMUM_VALUE;
531         ELSE
532           l_err_msg_name := 'EGO_EF_MAX_VAL_DATE_VIOLATED';
533           l_err_token_table(3).TOKEN_NAME := 'MAX_DATE_VALUE';
534           l_err_token_table(3).TOKEN_VALUE := l_attr_metadata_obj.MAXIMUM_VALUE;
535         END IF;
536         ERROR_HANDLER.Add_Error_Message
537            (p_message_name              => l_err_msg_name
538            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
539            ,p_token_tbl                 => l_err_token_table
540            ,p_message_type              => FND_API.G_RET_STS_ERROR
541            ,p_row_identifier            => error_rec.TRANSACTION_ID
542            ,p_entity_id                 => G_ENTITY_ID
543            ,p_entity_index              => l_entity_index
544            ,p_table_name                => p_interface_table_name
545            ,p_entity_code               => G_ENTITY_CODE
546            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
547           );
548         l_err_token_table.DELETE();
549       END IF;
550 
551       IF BITAND(error_rec.PROCESS_STATUS,G_PS_VAL_RANGE_VIOLATION) <> 0 THEN
552         l_err_token_table(1).TOKEN_NAME := 'ATTR_NAME';
553         l_err_token_table(1).TOKEN_VALUE := l_attr_metadata_obj.attr_disp_name;
554         l_err_token_table(2).TOKEN_NAME := 'AG_NAME';
555         l_err_token_table(2).TOKEN_VALUE := l_attr_grp_disp_name;
556         l_err_msg_name := 'EGO_VAL_OUT_OF_RANGE';
557         l_err_token_table(3).TOKEN_NAME := 'MINVALUE';
558         l_err_token_table(3).TOKEN_VALUE := l_attr_metadata_obj.MINIMUM_VALUE;
559         l_err_token_table(4).TOKEN_NAME := 'MAXVALUE';
560         l_err_token_table(4).TOKEN_VALUE := l_attr_metadata_obj.MAXIMUM_VALUE;
561 
562         ERROR_HANDLER.Add_Error_Message
563            (p_message_name              => l_err_msg_name
564            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
565            ,p_token_tbl                 => l_err_token_table
566            ,p_message_type              => FND_API.G_RET_STS_ERROR
567            ,p_row_identifier            => error_rec.TRANSACTION_ID
568            ,p_entity_id                 => G_ENTITY_ID
569            ,p_entity_index              => l_entity_index
570            ,p_table_name                => p_interface_table_name
571            ,p_entity_code               => G_ENTITY_CODE
572            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
573           );
574         l_err_token_table.DELETE();
575       END IF;
576 
577       IF BITAND(error_rec.PROCESS_STATUS,G_PS_INVALID_NUMBER_DATA) <> 0 THEN
578         l_err_msg_name := 'EGO_EF_DATA_TYPE_INCORRECT';
579         l_err_token_table(1).TOKEN_NAME := 'ATTR_NAME';
580         l_err_token_table(1).TOKEN_VALUE := l_attr_metadata_obj.attr_disp_name;
581         l_err_token_table(2).TOKEN_NAME := 'AG_NAME';
582         l_err_token_table(2).TOKEN_VALUE := l_attr_grp_disp_name;
583         l_err_token_table(3).TOKEN_NAME := 'DATA_TYPE';
584         l_err_token_table(3).TOKEN_VALUE := l_attr_metadata_obj.data_type_meaning;
585         l_err_token_table(4).TOKEN_NAME := 'VALUE';
586         l_err_token_table(4).TOKEN_VALUE := NVL(error_rec.ATTR_DISP_VALUE,error_rec.attr_value_num);
587         ERROR_HANDLER.Add_Error_Message
588            (p_message_name              => l_err_msg_name
589            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
590            ,p_token_tbl                 => l_err_token_table
591            ,p_message_type              => FND_API.G_RET_STS_ERROR
592            ,p_row_identifier            => error_rec.TRANSACTION_ID
593            ,p_entity_id                 => G_ENTITY_ID
594            ,p_entity_index              => l_entity_index
595            ,p_table_name                => p_interface_table_name
596            ,p_entity_code               => G_ENTITY_CODE
597            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
598           );
599         l_err_token_table.DELETE();
600       END IF;
601 
602       IF BITAND(error_rec.PROCESS_STATUS,G_PS_INVALID_DATE_DATA) <> 0 THEN
603         l_err_msg_name := 'EGO_EF_DATA_TYPE_INCORRECT';
604         l_err_token_table(1).TOKEN_NAME := 'ATTR_NAME';
605         l_err_token_table(1).TOKEN_VALUE := l_attr_metadata_obj.attr_disp_name;
606         l_err_token_table(2).TOKEN_NAME := 'AG_NAME';
607         l_err_token_table(2).TOKEN_VALUE := l_attr_grp_disp_name;
608         l_err_token_table(3).TOKEN_NAME := 'DATA_TYPE';
609         l_err_token_table(3).TOKEN_VALUE := l_attr_metadata_obj.data_type_meaning;
610         l_err_token_table(4).TOKEN_NAME := 'VALUE';
611         l_err_token_table(4).TOKEN_VALUE := NVL(error_rec.ATTR_DISP_VALUE,error_rec.attr_value_date);
612         ERROR_HANDLER.Add_Error_Message
613            (p_message_name              => l_err_msg_name
614            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
615            ,p_token_tbl                 => l_err_token_table
616            ,p_message_type              => FND_API.G_RET_STS_ERROR
617            ,p_row_identifier            => error_rec.TRANSACTION_ID
618            ,p_entity_id                 => G_ENTITY_ID
619            ,p_entity_index              => l_entity_index
620            ,p_table_name                => p_interface_table_name
621            ,p_entity_code               => G_ENTITY_CODE
622            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
623           );
624         l_err_token_table.DELETE();
625       END IF;
626 
627       IF BITAND(error_rec.PROCESS_STATUS,G_PS_INVALID_DATE_TIME_DATA) <> 0 THEN
628         l_err_msg_name := 'EGO_EF_DATA_TYPE_INCORRECT';
629         l_err_token_table(1).TOKEN_NAME := 'ATTR_NAME';
630         l_err_token_table(1).TOKEN_VALUE := l_attr_metadata_obj.attr_disp_name;
631         l_err_token_table(2).TOKEN_NAME := 'AG_NAME';
632         l_err_token_table(2).TOKEN_VALUE := l_attr_grp_disp_name;
633         l_err_token_table(3).TOKEN_NAME := 'DATA_TYPE';
634         l_err_token_table(3).TOKEN_VALUE := l_attr_metadata_obj.data_type_meaning;
635         l_err_token_table(4).TOKEN_NAME := 'VALUE';
636         l_err_token_table(4).TOKEN_VALUE := NVL(error_rec.ATTR_DISP_VALUE,error_rec.attr_value_date);
637         ERROR_HANDLER.Add_Error_Message
638            (p_message_name              => l_err_msg_name
639            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
640            ,p_token_tbl                 => l_err_token_table
641            ,p_message_type              => FND_API.G_RET_STS_ERROR
642            ,p_row_identifier            => error_rec.TRANSACTION_ID
643            ,p_entity_id                 => G_ENTITY_ID
644            ,p_entity_index              => l_entity_index
645            ,p_table_name                => p_interface_table_name
646            ,p_entity_code               => G_ENTITY_CODE
647            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
648           );
649         l_err_token_table.DELETE();
650       END IF;
651 
652       IF BITAND(error_rec.PROCESS_STATUS,G_PS_MAX_LENGTH_VIOLATION) <> 0 THEN
653         l_err_msg_name := 'EGO_EF_MAX_SIZE_VIOLATED';
654         l_err_token_table(1).TOKEN_NAME := 'VALUE';
655         IF (l_attr_metadata_obj.data_type_code = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
656           l_err_token_table(1).TOKEN_VALUE := NVL(error_rec.ATTR_DISP_VALUE,error_rec.attr_value_num);
657         ELSIF (l_attr_metadata_obj.data_type_code = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE
658                OR
659                l_attr_metadata_obj.data_type_code = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE
660               ) THEN
661           l_err_token_table(1).TOKEN_VALUE := NVL(error_rec.ATTR_DISP_VALUE,error_rec.attr_value_date);
662         ELSE
663           l_err_token_table(1).TOKEN_VALUE := NVL(error_rec.ATTR_DISP_VALUE,error_rec.attr_value_str);
664         END IF;
665 
666         l_err_token_table(2).TOKEN_NAME := 'ATTR_NAME';
667         l_err_token_table(2).TOKEN_VALUE := l_attr_metadata_obj.attr_disp_name;
668         l_err_token_table(3).TOKEN_NAME := 'AG_NAME';
669         l_err_token_table(3).TOKEN_VALUE := l_attr_grp_disp_name;
670         ERROR_HANDLER.Add_Error_Message
671            (p_message_name              => l_err_msg_name
672            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
673            ,p_token_tbl                 => l_err_token_table
674            ,p_message_type              => FND_API.G_RET_STS_ERROR
675            ,p_row_identifier            => error_rec.TRANSACTION_ID
676            ,p_entity_id                 => G_ENTITY_ID
677            ,p_entity_index              => l_entity_index
678            ,p_table_name                => p_interface_table_name
679            ,p_entity_code               => G_ENTITY_CODE
680            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
681           );
682         l_err_token_table.DELETE();
683       END IF;
684 
685       IF BITAND(error_rec.PROCESS_STATUS,G_PS_BAD_TTYPE_UPDATE) <> 0 THEN
686         l_err_msg_name := 'EGO_EF_ROW_NOT_FOUND';
687         l_err_token_table(1).TOKEN_NAME := 'AG_NAME';
688         l_err_token_table(1).TOKEN_VALUE := l_attr_grp_disp_name;
689         ERROR_HANDLER.Add_Error_Message
690            (p_message_name              => l_err_msg_name
691            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
692            ,p_token_tbl                 => l_err_token_table
693            ,p_message_type              => FND_API.G_RET_STS_ERROR
694            ,p_row_identifier            => error_rec.TRANSACTION_ID
695            ,p_entity_id                 => G_ENTITY_ID
696            ,p_entity_index              => l_entity_index
697            ,p_table_name                => p_interface_table_name
698            ,p_entity_code               => G_ENTITY_CODE
699            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
700           );
701         l_err_token_table.DELETE();
702       END IF;
703 
704       IF BITAND(error_rec.PROCESS_STATUS,G_PS_BAD_TTYPE_CREATE) <> 0 THEN
705         l_err_token_table(1).TOKEN_NAME := 'AG_NAME';
706         l_err_token_table(1).TOKEN_VALUE := l_attr_grp_disp_name;
707         IF p_attr_grp_meta_obj.multi_row_code = 'Y' THEN
708           -- multi row error.
709           l_attr_table := p_attr_grp_meta_obj.ATTR_METADATA_TABLE;
710           IF l_attr_table.count > 0 THEN
711             FND_MESSAGE.set_name(application => 'EGO'
712                                 ,name        => 'EGO_COMMA');
713             l_comma_message := FND_MESSAGE.GET;
714             l_msg_token_value := NULL;
715             FOR i IN l_attr_table.FIRST .. l_attr_table.LAST LOOP
716               IF l_attr_table(i).unique_key_flag = 'Y' THEN
717                 l_msg_token_value := l_msg_token_value ||l_attr_table(i).attr_disp_name|| l_comma_message;
718               END IF;
719             END LOOP;
720             IF l_msg_token_value IS NULL THEN
721               l_err_msg_name := 'EGO_EF_NO_UK_FOR_CREATE';
722             ELSE
723               l_err_msg_name := 'EGO_EF_MULTIROW_EXISTS';
724               l_msg_token_value := SUBSTR(l_msg_token_value, 1 ,
725                            (INSTR(l_msg_token_value, l_comma_message,-1)-1));
726               l_err_token_table(2).TOKEN_NAME := 'ATTR_NAMES';
727               l_err_token_table(2).TOKEN_VALUE := l_msg_token_value;
728             END IF;
729           END IF;
730         ELSE
731           -- single row error.
732           l_err_msg_name := 'EGO_EF_ROW_ALREADY_EXISTS';
733         END IF;
734         ERROR_HANDLER.Add_Error_Message
735            (p_message_name              => l_err_msg_name
736            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
737            ,p_token_tbl                 => l_err_token_table
738            ,p_message_type              => FND_API.G_RET_STS_ERROR
739            ,p_row_identifier            => error_rec.TRANSACTION_ID
740            ,p_entity_id                 => G_ENTITY_ID
741            ,p_entity_index              => l_entity_index
742            ,p_table_name                => p_interface_table_name
743            ,p_entity_code               => G_ENTITY_CODE
744            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
745           );
746         l_err_token_table.DELETE();
747       END IF;
748 
749       IF BITAND(error_rec.PROCESS_STATUS,G_PS_BAD_TTYPE_DELETE) <> 0 THEN
750         l_err_msg_name := 'EGO_EF_ROW_NOT_FOUND';
751         l_err_token_table(1).TOKEN_NAME := 'AG_NAME';
752         l_err_token_table(1).TOKEN_VALUE := l_attr_grp_disp_name;
753         ERROR_HANDLER.Add_Error_Message
754            (p_message_name              => l_err_msg_name
755            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
756            ,p_token_tbl                 => l_err_token_table
757            ,p_message_type              => FND_API.G_RET_STS_ERROR
758            ,p_row_identifier            => error_rec.TRANSACTION_ID
759            ,p_entity_id                 => G_ENTITY_ID
760            ,p_entity_index              => l_entity_index
761            ,p_table_name                => p_interface_table_name
762            ,p_entity_code               => G_ENTITY_CODE
763            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
764           );
765         l_err_token_table.DELETE();
766       END IF;
767 
768       IF BITAND(error_rec.PROCESS_STATUS,G_PS_REQUIRED_ATTRIBUTE) <> 0 THEN
769         l_err_msg_name := 'EGO_EF_NO_VAL_FOR_REQ_ATTR';
770         l_err_token_table(1).TOKEN_NAME := 'ATTR_NAME';
771         l_err_token_table(1).TOKEN_VALUE := l_attr_metadata_obj.attr_disp_name;
772         l_err_token_table(2).TOKEN_NAME := 'AG_NAME';
773         l_err_token_table(2).TOKEN_VALUE := l_attr_grp_disp_name;
774         ERROR_HANDLER.Add_Error_Message
775            (p_message_name              => l_err_msg_name
776            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
777            ,p_token_tbl                 => l_err_token_table
778            ,p_message_type              => FND_API.G_RET_STS_ERROR
779            ,p_row_identifier            => error_rec.TRANSACTION_ID
780            ,p_entity_id                 => G_ENTITY_ID
781            ,p_entity_index              => l_entity_index
782            ,p_table_name                => p_interface_table_name
783            ,p_entity_code               => G_ENTITY_CODE
784            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
785           );
786         l_err_token_table.DELETE();
787       END IF;
788 
789       IF BITAND(error_rec.PROCESS_STATUS,G_PS_AG_NOT_ASSOCIATED) <> 0 THEN
790         l_err_msg_name := 'EGO_EF_AG_NOT_ASSOCIATED';
791         l_err_token_table(1).TOKEN_NAME := 'AG_NAME';
792         l_err_token_table(1).TOKEN_VALUE := l_attr_grp_disp_name;
793         l_err_token_table(2).TOKEN_NAME := 'CLASS_MEANING';
794         BEGIN
795           SELECT EGO_EXT_FWK_PUB.Get_Class_Meaning(p_object_name, error_rec.class_code_value)
796             INTO l_err_token_table(2).TOKEN_VALUE
797             FROM DUAL;
798         EXCEPTION
799           WHEN OTHERS THEN
800             l_err_token_table(2).TOKEN_VALUE :=  error_rec.class_code_value;
801         END;
802         ERROR_HANDLER.Add_Error_Message
803            (p_message_name              => l_err_msg_name
804            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
805            ,p_token_tbl                 => l_err_token_table
806            ,p_message_type              => FND_API.G_RET_STS_ERROR
807            ,p_row_identifier            => error_rec.TRANSACTION_ID
808            ,p_entity_id                 => G_ENTITY_ID
809            ,p_entity_index              => l_entity_index
810            ,p_table_name                => p_interface_table_name
811            ,p_entity_code               => G_ENTITY_CODE
812            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
813           );
814         l_err_token_table.DELETE();
815       END IF;
816 
817      IF BITAND(error_rec.PROCESS_STATUS, G_PS_IDENTICAL_ROWS) <> 0 THEN
818 
819 /*
820        EGO_USER_ATTRS_DATA_PVT.Get_Err_Info_For_UK_Violation
821        (p_attr_group_metadata_obj       IN    -- EGO_ATTR_GROUP_METADATA_OBJ
822          ,p_attr_name_value_pairs         IN    -- EGO_USER_ATTR_DATA_TABLE
823          ,p_is_err_in_production_table    => true -- boolean
824          ,x_unique_key_err_msg            => l_err_msg_name
825          ,x_token_table                   => l_err_token_table
826          );
827        EGO_USER_ATTRS_DATA_PVT.Get_Err_Info_For_UK_Not_Resp
828         (p_attr_group_metadata_obj       IN   EGO_ATTR_GROUP_METADATA_OBJ
829         ,p_is_err_in_production_table    IN   BOOLEAN
830         ,x_unique_key_err_msg            OUT NOCOPY VARCHAR2
831         ,x_token_table                   OUT NOCOPY ERROR_HANDLER.Token_Tbl_Type
832         );
833 */
834 
835         l_err_msg_name := 'EGO_EF_IDENTICAL_ROWS_ERR';
836         l_err_token_table(1).TOKEN_NAME := 'AG_NAME';
837         l_err_token_table(1).TOKEN_VALUE := l_attr_grp_disp_name;
838         ERROR_HANDLER.Add_Error_Message
839            (p_message_name              => l_err_msg_name
840            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
841            ,p_token_tbl                 => l_err_token_table
842            ,p_message_type              => FND_API.G_RET_STS_ERROR
843            ,p_row_identifier            => error_rec.TRANSACTION_ID
844            ,p_entity_id                 => G_ENTITY_ID
845            ,p_entity_index              => l_entity_index
846            ,p_table_name                => p_interface_table_name
847            ,p_entity_code               => G_ENTITY_CODE
848            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
849           );
850         l_err_token_table.DELETE();
851       END IF;
852 
853       IF BITAND(error_rec.PROCESS_STATUS,G_PS_BAD_PK_VAL) <> 0 THEN
854         IF p_pk5_column_name IS NOT NULL THEN
855           l_err_msg_name := 'EGO_EF_NO_PK_VALUES_5';
856           l_err_token_table(1).TOKEN_NAME := 'PK1_COL_NAME';
857           l_err_token_table(1).TOKEN_VALUE := p_pk1_column_name;
858           l_err_token_table(2).TOKEN_NAME := 'PK2_COL_NAME';
859           l_err_token_table(2).TOKEN_VALUE := p_pk2_column_name;
860           l_err_token_table(3).TOKEN_NAME := 'PK3_COL_NAME';
861           l_err_token_table(3).TOKEN_VALUE := p_pk3_column_name;
862           l_err_token_table(4).TOKEN_NAME := 'PK4_COL_NAME';
863           l_err_token_table(4).TOKEN_VALUE := p_pk4_column_name;
864           l_err_token_table(5).TOKEN_NAME := 'PK5_COL_NAME';
865           l_err_token_table(5).TOKEN_VALUE := p_pk5_column_name;
866           l_err_token_table(6).TOKEN_NAME := 'OBJ_NAME';
867           l_err_token_table(6).TOKEN_VALUE := p_object_name;
868         ELSIF p_pk4_column_name IS NOT NULL THEN
869           l_err_msg_name := 'EGO_EF_NO_PK_VALUES_4';
870           l_err_token_table(1).TOKEN_NAME := 'PK1_COL_NAME';
871           l_err_token_table(1).TOKEN_VALUE := p_pk1_column_name;
872           l_err_token_table(2).TOKEN_NAME := 'PK2_COL_NAME';
873           l_err_token_table(2).TOKEN_VALUE := p_pk2_column_name;
874           l_err_token_table(3).TOKEN_NAME := 'PK3_COL_NAME';
875           l_err_token_table(3).TOKEN_VALUE := p_pk3_column_name;
876           l_err_token_table(4).TOKEN_NAME := 'PK4_COL_NAME';
877           l_err_token_table(4).TOKEN_VALUE := p_pk4_column_name;
878           l_err_token_table(5).TOKEN_NAME := 'OBJ_NAME';
879           l_err_token_table(5).TOKEN_VALUE := p_object_name;
880         ELSIF p_pk3_column_name IS NOT NULL THEN
881           l_err_msg_name := 'EGO_EF_NO_PK_VALUES_3';
882           l_err_token_table(1).TOKEN_NAME := 'PK1_COL_NAME';
883           l_err_token_table(1).TOKEN_VALUE := p_pk1_column_name;
884           l_err_token_table(2).TOKEN_NAME := 'PK2_COL_NAME';
885           l_err_token_table(2).TOKEN_VALUE := p_pk2_column_name;
886           l_err_token_table(3).TOKEN_NAME := 'PK3_COL_NAME';
887           l_err_token_table(3).TOKEN_VALUE := p_pk3_column_name;
888           l_err_token_table(4).TOKEN_NAME := 'OBJ_NAME';
889           l_err_token_table(4).TOKEN_VALUE := p_object_name;
890         ELSIF p_pk2_column_name IS NOT NULL THEN
891           l_err_msg_name := 'EGO_EF_NO_PK_VALUES_2';
892           l_err_token_table(1).TOKEN_NAME := 'PK1_COL_NAME';
893           l_err_token_table(1).TOKEN_VALUE := p_pk1_column_name;
894           l_err_token_table(2).TOKEN_NAME := 'PK2_COL_NAME';
895           l_err_token_table(2).TOKEN_VALUE := p_pk2_column_name;
896           l_err_token_table(3).TOKEN_NAME := 'OBJ_NAME';
897           l_err_token_table(3).TOKEN_VALUE := p_object_name;
898         ELSIF p_pk1_column_name IS NOT NULL THEN
899           l_err_msg_name := 'EGO_EF_NO_PK_VALUES_1';
900           l_err_token_table(1).TOKEN_NAME := 'PK1_COL_NAME';
901           l_err_token_table(1).TOKEN_VALUE := p_pk1_column_name;
902           l_err_token_table(2).TOKEN_NAME := 'OBJ_NAME';
903           l_err_token_table(2).TOKEN_VALUE := p_object_name;
904         END IF;
905         ERROR_HANDLER.Add_Error_Message
906            (p_message_name              => l_err_msg_name
907            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
908            ,p_token_tbl                 => l_err_token_table
909            ,p_message_type              => FND_API.G_RET_STS_ERROR
910            ,p_row_identifier            => error_rec.TRANSACTION_ID
911            ,p_entity_id                 => G_ENTITY_ID
912            ,p_entity_index              => l_entity_index
913            ,p_table_name                => p_interface_table_name
914            ,p_entity_code               => G_ENTITY_CODE
915            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
916           );
917         l_err_token_table.DELETE();
918       END IF;
919 
920       IF BITAND(error_rec.PROCESS_STATUS,G_PS_DATA_IN_WRONG_COL) <> 0 THEN
921         IF (l_attr_metadata_obj.data_type_code = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
922           l_err_msg_name := 'EGO_EF_NUM_IN_WRONG_COL';
923         ELSIF (l_attr_metadata_obj.data_type_code = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE
924                OR
925                l_attr_metadata_obj.data_type_code = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE
926               ) THEN
927           l_err_msg_name := 'EGO_EF_DATE_IN_WRONG_COL';
928         ELSE
929           l_err_msg_name := 'EGO_EF_CHAR_IN_WRONG_COL';
930         END IF;
931         l_err_token_table(1).TOKEN_NAME := 'ATTR_NAME';
932         l_err_token_table(1).TOKEN_VALUE := l_attr_metadata_obj.attr_disp_name;
933         l_err_token_table(2).TOKEN_NAME := 'AG_NAME';
934         l_err_token_table(2).TOKEN_VALUE := l_attr_grp_disp_name;
935         ERROR_HANDLER.Add_Error_Message
936            (p_message_name              => l_err_msg_name
937            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
938            ,p_token_tbl                 => l_err_token_table
939            ,p_message_type              => FND_API.G_RET_STS_ERROR
940            ,p_row_identifier            => error_rec.TRANSACTION_ID
941            ,p_entity_id                 => G_ENTITY_ID
942            ,p_entity_index              => l_entity_index
943            ,p_table_name                => p_interface_table_name
944            ,p_entity_code               => G_ENTITY_CODE
945            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
946           );
947         l_err_token_table.DELETE();
948       END IF;
949 
950       IF BITAND(error_rec.PROCESS_STATUS,G_PS_VALUE_NOT_IN_TVS) <> 0 THEN
951 -- this condition is not required
952 --        IF (l_attr_metadata_obj.validation_code = EGO_EXT_FWK_PUB.G_INDEPENDENT_VALIDATION_CODE
953 --            OR
954 --            l_attr_metadata_obj.validation_code = EGO_EXT_FWK_PUB.G_TABLE_VALIDATION_CODE
955 --           ) THEN
956           l_err_msg_name := 'EGO_EF_INDEPENDENT_VS_VIOLATED';
957           l_err_token_table(1).TOKEN_NAME := 'VALUE';
958           IF (l_attr_metadata_obj.data_type_code = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
959             l_err_token_table(1).TOKEN_VALUE := NVL(error_rec.ATTR_DISP_VALUE,error_rec.attr_value_num);
960           ELSIF (l_attr_metadata_obj.data_type_code = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE
961                  OR
962                  l_attr_metadata_obj.data_type_code = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE
963                 ) THEN
964             l_err_token_table(1).TOKEN_VALUE := NVL(error_rec.ATTR_DISP_VALUE,error_rec.attr_value_date);
965           ELSE
966             l_err_token_table(1).TOKEN_VALUE := NVL(error_rec.ATTR_DISP_VALUE,error_rec.attr_value_str);
967           END IF;
968           l_err_token_table(2).TOKEN_NAME := 'ATTR_NAME';
969           l_err_token_table(2).TOKEN_VALUE := l_attr_metadata_obj.attr_disp_name;
970           l_err_token_table(3).TOKEN_NAME := 'AG_NAME';
971           l_err_token_table(3).TOKEN_VALUE := l_attr_grp_disp_name;
972           ERROR_HANDLER.Add_Error_Message
973            (p_message_name              => l_err_msg_name
974            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
975            ,p_token_tbl                 => l_err_token_table
976            ,p_message_type              => FND_API.G_RET_STS_ERROR
977            ,p_row_identifier            => error_rec.TRANSACTION_ID
978            ,p_entity_id                 => G_ENTITY_ID
979            ,p_entity_index              => l_entity_index
980            ,p_table_name                => p_interface_table_name
981            ,p_entity_code               => G_ENTITY_CODE
982            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
983           );
984           l_err_token_table.DELETE();
985 --        END IF;
986       END IF;
987 
988       IF BITAND(error_rec.PROCESS_STATUS,G_PS_BAD_ATTRS_IN_TVS_WHERE) <> 0 THEN
989         l_err_msg_name := 'EGO_EF_VS_INVALID_BIND';
990         l_err_token_table(1).TOKEN_NAME := 'ATTR_NAME';
991         l_err_token_table(1).TOKEN_VALUE := l_attr_metadata_obj.attr_disp_name;
992         l_err_token_table(2).TOKEN_NAME := 'AG_NAME';
993         l_err_token_table(2).TOKEN_VALUE := l_attr_grp_disp_name;
994         ERROR_HANDLER.Add_Error_Message
995            (p_message_name              => l_err_msg_name
996            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
997            ,p_token_tbl                 => l_err_token_table
998            ,p_message_type              => FND_API.G_RET_STS_ERROR
999            ,p_row_identifier            => error_rec.TRANSACTION_ID
1000            ,p_entity_id                 => G_ENTITY_ID
1001            ,p_entity_index              => l_entity_index
1002            ,p_table_name                => p_interface_table_name
1003            ,p_entity_code               => G_ENTITY_CODE
1004            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
1005           );
1006         l_err_token_table.DELETE();
1007       END IF;
1008 
1009       IF BITAND(error_rec.PROCESS_STATUS,G_PS_BAD_ATTR_GRP_ID) <> 0 THEN
1010         l_err_msg_name := 'EGO_EF_BAD_AG_ID';
1011         l_err_token_table(1).TOKEN_NAME := 'AG_ID';
1012         l_err_token_table(1).TOKEN_VALUE := error_rec.ATTR_GROUP_ID;
1013         l_err_token_table(2).TOKEN_NAME := 'AG_NAME';
1014         l_err_token_table(2).TOKEN_VALUE := l_attr_grp_disp_name;
1015         ERROR_HANDLER.Add_Error_Message
1016            (p_message_name              => l_err_msg_name
1017            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
1018            ,p_token_tbl                 => l_err_token_table
1019            ,p_message_type              => FND_API.G_RET_STS_ERROR
1020            ,p_row_identifier            => error_rec.TRANSACTION_ID
1021            ,p_entity_id                 => G_ENTITY_ID
1022            ,p_entity_index              => l_entity_index
1023            ,p_table_name                => p_interface_table_name
1024            ,p_entity_code               => G_ENTITY_CODE
1025            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
1026           );
1027         l_err_token_table.DELETE();
1028       END IF;
1029 
1030       IF BITAND(error_rec.PROCESS_STATUS,G_PS_TL_COL_IS_A_UK) <> 0 THEN
1031         l_err_msg_name := 'EGO_EF_TL_COL_IS_A_UK';
1032         l_err_token_table(1).TOKEN_NAME := 'AG_NAME';
1033         l_err_token_table(1).TOKEN_VALUE := l_attr_grp_disp_name;
1034         ERROR_HANDLER.Add_Error_Message
1035            (p_message_name              => l_err_msg_name
1036            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
1037            ,p_token_tbl                 => l_err_token_table
1038            ,p_message_type              => FND_API.G_RET_STS_ERROR
1039            ,p_row_identifier            => error_rec.TRANSACTION_ID
1040            ,p_entity_id                 => G_ENTITY_ID
1041            ,p_entity_index              => l_entity_index
1042            ,p_table_name                => p_interface_table_name
1043            ,p_entity_code               => G_ENTITY_CODE
1044            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
1045           );
1046         l_err_token_table.DELETE();
1047       END IF;
1048 
1049       IF BITAND(error_rec.PROCESS_STATUS,G_PS_PRE_EVENT_FAILED) <> 0 THEN
1050         l_err_msg_name := 'EGO_EF_PRE_EVENT_FAILED';
1051         l_err_token_table(1).TOKEN_NAME := 'AG_NAME';
1052         l_err_token_table(1).TOKEN_VALUE := l_attr_grp_disp_name;
1053         ERROR_HANDLER.Add_Error_Message
1054            (p_message_name              => l_err_msg_name
1055            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
1056            ,p_token_tbl                 => l_err_token_table
1057            ,p_message_type              => FND_API.G_RET_STS_ERROR
1058            ,p_row_identifier            => error_rec.TRANSACTION_ID
1059            ,p_entity_id                 => G_ENTITY_ID
1060            ,p_entity_index              => l_entity_index
1061            ,p_table_name                => p_interface_table_name
1062            ,p_entity_code               => G_ENTITY_CODE
1063            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
1064           );
1065         l_err_token_table.DELETE();
1066       END IF;
1067 
1068 --BugFix : 4171705
1069       IF BITAND(error_rec.PROCESS_STATUS,G_PS_BAD_TVS_SETUP) <> 0 THEN
1070         l_err_msg_name := 'EGO_EF_BAD_TVS_SETUP';
1071         l_err_token_table(1).TOKEN_NAME := 'AG_NAME';
1072         l_err_token_table(1).TOKEN_VALUE := l_attr_grp_disp_name;
1073         l_err_token_table(2).TOKEN_NAME := 'ATTR_NAME';
1074         l_err_token_table(2).TOKEN_VALUE := l_attr_metadata_obj.attr_disp_name;
1075         ERROR_HANDLER.Add_Error_Message
1076            (p_message_name              => l_err_msg_name
1077            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
1078            ,p_token_tbl                 => l_err_token_table
1079            ,p_message_type              => FND_API.G_RET_STS_ERROR
1080            ,p_row_identifier            => error_rec.TRANSACTION_ID
1081            ,p_entity_id                 => G_ENTITY_ID
1082            ,p_entity_index              => l_entity_index
1083            ,p_table_name                => p_interface_table_name
1084            ,p_entity_code               => G_ENTITY_CODE
1085            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
1086           );
1087         l_err_token_table.DELETE();
1088       END IF;
1089 
1090       IF BITAND(error_rec.PROCESS_STATUS,G_PS_INVALID_UOM) <> 0 THEN
1091         l_err_msg_name := 'EGO_EF_BAD_UOM';
1092         l_err_token_table(1).TOKEN_NAME := 'AG_NAME';
1093         l_err_token_table(1).TOKEN_VALUE := l_attr_grp_disp_name;
1094         l_err_token_table(2).TOKEN_NAME := 'ATTR_NAME';
1095         l_err_token_table(2).TOKEN_VALUE := l_attr_metadata_obj.attr_disp_name;
1096         ERROR_HANDLER.Add_Error_Message
1097            (p_message_name              => l_err_msg_name
1098            ,p_application_id            => 'EGO'--Bug 7507091 Orig value: G_APPLICATION_CONTEXT
1099            ,p_token_tbl                 => l_err_token_table
1100            ,p_message_type              => FND_API.G_RET_STS_ERROR
1101            ,p_row_identifier            => error_rec.TRANSACTION_ID
1102            ,p_entity_id                 => G_ENTITY_ID
1103            ,p_entity_index              => l_entity_index
1104            ,p_table_name                => p_interface_table_name
1105            ,p_entity_code               => G_ENTITY_CODE
1106            ,p_addto_fnd_stack           => G_ADD_ERRORS_TO_FND_STACK
1107           );
1108         l_err_token_table.DELETE();
1109       END IF;
1110 
1111     END LOOP;
1112     -- Bug : 4099546
1113     CLOSE c_err_cursor;
1114 
1115 END log_errors_now;
1116 
1117 /* Bug 10151142 : Start
1118  -- Private procedure - Prepare_Dynamic_Sqls_Clob:
1119  -- This procedure builds dynamic sql for dependent table value sets.
1120  -- the query built may have size more that 32k in which case execute immediate doesn't work,
1121  -- so we will put this query in an array of type dbms_sql.varchar2a so that we can use DBMS_SQL api.
1122 */
1123 PROCEDURE Prepare_Dynamic_Sqls_Clob (
1124     p_data_set_id                   IN NUMBER,
1125     p_data_type_code                IN VARCHAR2,
1126     p_interface_table_name          IN   VARCHAR2,
1127     p_tvs_val_check_sel_clob        IN   CLOB,
1128     p_tvs_select_clob               IN   CLOB,
1129     p_attr_name                     IN   VARCHAR2,
1130     p_attr_group_name               IN   VARCHAR2,
1131     x_return_status                 OUT NOCOPY VARCHAR2,
1132     x_msg_data                      OUT NOCOPY VARCHAR2,
1133     x_sql_1_ub                      OUT NOCOPY NUMBER,
1134     x_sql_ub                        OUT NOCOPY NUMBER,
1135     x_dynamic_sql_1_v_type          OUT NOCOPY dbms_sql.varchar2a,
1136     x_dynamic_sql_v_type            OUT NOCOPY dbms_sql.varchar2a
1137   ) IS
1138 
1139   l_api_name    VARCHAR2(30)  := 'Prepare_Dynamic_Sqls_Clob';
1140   l_buffer      varchar2(8191):= '';
1141   l_amount      number := 8191;
1142   l_offset      number :=1;
1143   l_clob_length number;
1144 
1145   l_dynamic_sql_1_clob_part1  CLOB;
1146   l_dynamic_sql_clob_part1    CLOB;
1147   l_dynamic_sql_clob_part2    CLOB;
1148 
1149   l_dynamic_sql_v_type    dbms_sql.varchar2a;
1150   l_dynamic_sql_1_v_type  dbms_sql.varchar2a;
1151 
1152   l_clob_length_1 NUMBER;
1153   l_index_1       NUMBER;
1154   l_index         NUMBER;
1155   l_count         NUMBER ;
1156 
1157   l_data_type_clause  VARCHAR2(100);
1158   l_dynamic_sql       VARCHAR2(32767);
1159   l_dummy             NUMBER;
1160   l_message           VARCHAR2(3800);
1161 
1162 BEGIN
1163   code_debug(l_api_name|| '  Starting  ');
1164 
1165   IF (p_data_type_code = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
1166     l_data_type_clause := 'ATTR_VALUE_NUM';
1167   ELSIF (p_data_type_code = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE OR p_data_type_code = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE) THEN
1168     l_data_type_clause := 'ATTR_VALUE_DATE';
1169   ELSE
1170     l_data_type_clause  := 'ATTR_VALUE_STR';
1171   END IF;
1172 
1173   code_debug('          Preparing l_dynamic_sql_1_v_type ' ,3);
1174   l_dynamic_sql_1_v_type(1) := 'UPDATE '||p_interface_table_name||' UAI1 SET PROCESS_STATUS = PROCESS_STATUS + DECODE((';
1175 
1176   l_dynamic_sql_1_clob_part1 := p_tvs_val_check_sel_clob;
1177   l_clob_length_1 := dbms_lob.getlength(l_dynamic_sql_1_clob_part1);
1178 
1179   code_debug('           Length of l_dynamic_sql_1_clob_part1 :'||l_clob_length_1, 3);
1180 
1181   /* Read 8191 characters from clob sequentially and append them to the VARCHAR2 table
1182   using DBMS_LOB.READ function */
1183   l_offset := 1;
1184   l_count := 0;
1185   l_index_1 := 2;
1186   l_amount := 8191;
1187   l_dynamic_sql_1_v_type(l_index_1) := '';
1188 
1189   code_debug('          Processing l_dynamic_sql_1_clob_part1 ' ,3);
1190   while l_offset <= l_clob_length_1 LOOP
1191     l_buffer := '';
1192     l_count := l_count + 1;
1193 
1194     dbms_lob.read(l_dynamic_sql_1_clob_part1, l_amount, l_offset, l_buffer);
1195 
1196     IF (l_count = 4) THEN
1197       l_count := 0;
1198       l_index_1 := l_index_1 + 1 ;
1199       l_dynamic_sql_1_v_type(l_index_1) := '';
1200     END IF;
1201 
1202     l_dynamic_sql_1_v_type(l_index_1) := l_dynamic_sql_1_v_type(l_index_1)||l_buffer;
1203     l_offset := l_offset + l_amount;
1204   end loop;
1205 
1206   l_index_1 := l_index_1 + 1;
1207   l_dynamic_sql_1_v_type(l_index_1) := ') ,0,'||G_PS_VALUE_NOT_IN_TVS||',0)  WHERE DATA_SET_ID = :data_set_id '||'
1208     AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
1209     AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
1210     AND ATTR_INT_NAME = '''||p_attr_name||'''
1211     AND ATTR_GROUP_INT_NAME = '''||p_attr_group_name||'''
1212     AND '||l_data_type_clause||' IS NOT NULL AND TRANSACTION_TYPE <> '''||EGO_USER_ATTRS_DATA_PVT.G_DELETE_MODE||''''; -- bug 13774267
1213     /*
1214        No need to check attribute value against value set in case of Delete. The check is skipped only for ATTR_VALUE*.
1215        The validation need to be done if the user passes ATTR_DISP_VALUE. hence didn't add the condition for  l_dynamic_sql_v_type
1216     */
1217 
1218   x_sql_1_ub := l_index_1;
1219   x_dynamic_sql_1_v_type := l_dynamic_sql_1_v_type;
1220 
1221   code_debug('          Preparing l_dynamic_sql_1_v_type is done ' ,3);
1222 
1223   code_debug('          Preparing l_dynamic_sql_v_type :' ,3);
1224   l_dynamic_sql_v_type(1) := 'UPDATE '||p_interface_table_name||' UAI1 SET '||l_data_type_clause||' = NVL(';
1225 
1226   l_dynamic_sql_clob_part1 := p_tvs_select_clob;
1227   l_clob_length := dbms_lob.getlength(l_dynamic_sql_clob_part1);
1228 
1229   code_debug('           Length of l_dynamic_sql_clob_part1 :'||l_clob_length, 3);
1230 
1231   /* Read 8191 characters from clob sequentially and append them to the VARCHAR2 variable
1232   using DBMS_LOB.READ function */
1233   l_offset := 1;
1234   l_count := 0;
1235   l_index := 2;
1236   l_amount := 8191;
1237   l_dynamic_sql_v_type(l_index) := '';
1238 
1239   code_debug('          Processing l_dynamic_sql_clob_part1 :' ,3);
1240   while l_offset <= l_clob_length LOOP
1241     l_buffer := '';
1242     l_count := l_count + 1;
1243 
1244     dbms_lob.read(l_dynamic_sql_clob_part1, l_amount, l_offset, l_buffer);
1245 
1246     IF (l_count = 4) THEN
1247       l_count := 0;
1248       l_index := l_index + 1 ;
1249       l_dynamic_sql_v_type(l_index) := '';
1250     END IF;
1251 
1252     l_dynamic_sql_v_type(l_index) := l_dynamic_sql_v_type(l_index)||l_buffer;
1253     l_offset := l_offset + l_amount;
1254   end loop;
1255 
1256   l_index := l_index + 1;
1257   l_dynamic_sql_v_type(l_index) := ' ,NULL), PROCESS_STATUS = PROCESS_STATUS + DECODE((';
1258 
1259   l_dynamic_sql_clob_part2 :=  p_tvs_select_clob;
1260   l_clob_length := dbms_lob.getlength(l_dynamic_sql_clob_part2);
1261 
1262   code_debug('           Length of l_dynamic_sql_clob_part2 :'||l_clob_length, 3);
1263 
1264   /* Read 8191 characters from clob sequentially and append them to the VARCHAR2 variable
1265   using DBMS_LOB.READ function */
1266   l_offset := 1;
1267   l_count := 0;
1268   l_index := l_index + 1;
1269   l_amount := 8191;
1270   l_dynamic_sql_v_type(l_index) := '';
1271 
1272   code_debug('          Processing l_dynamic_sql_clob_part2 :' ,3);
1273   while l_offset <= l_clob_length LOOP
1274     l_buffer := '';
1275     l_count := l_count + 1;
1276 
1277     dbms_lob.read(l_dynamic_sql_clob_part2, l_amount, l_offset, l_buffer);
1278 
1279     IF (l_count = 4) THEN
1280       l_count := 0;
1281       l_index := l_index + 1 ;
1282       l_dynamic_sql_v_type(l_index) := '';
1283     END IF;
1284 
1285     l_dynamic_sql_v_type(l_index) := l_dynamic_sql_v_type(l_index)||l_buffer;
1286     l_offset := l_offset + l_amount;
1287   end loop;
1288 
1289   l_index := l_index+1;
1290   l_dynamic_sql_v_type(l_index) := ' ),NULL,'||G_PS_VALUE_NOT_IN_TVS||',0) WHERE DATA_SET_ID = :data_set_id '||'
1291     AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
1292     AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
1293     AND ATTR_INT_NAME = '''||p_attr_name||'''
1294     AND ATTR_GROUP_INT_NAME = '''||p_attr_group_name||'''
1295     AND ATTR_DISP_VALUE IS NOT NULL ';
1296 
1297   x_sql_ub := l_index;
1298   x_dynamic_sql_v_type := l_dynamic_sql_v_type;
1299 
1300   code_debug('          Preparing l_dynamic_sql_v_type is done ' ,3);
1301 
1302   x_return_status := FND_API.G_RET_STS_SUCCESS;
1303   code_debug(l_api_name||' Done ',0);
1304 EXCEPTION
1305   WHEN OTHERS THEN
1306     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1307     x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' - '||SQLERRM;
1308     code_debug('          When others block - '||x_msg_data ,3);
1309 
1310     l_dynamic_sql :=
1311       'SELECT TRANSACTION_ID
1312          FROM '||p_interface_table_name||' UAI1
1313         WHERE UAI1.DATA_SET_ID = :data_set_id
1314           AND ROWNUM = 1';
1315       EXECUTE IMMEDIATE l_dynamic_sql
1316       INTO l_dummy
1317       USING p_data_set_id;
1318 
1319     ERROR_HANDLER.Add_Error_Message(
1320         p_message_text                  => x_msg_data
1321        ,p_row_identifier                => l_dummy
1322        ,p_application_id                => 'EGO'
1323        ,p_message_type                  => FND_API.G_RET_STS_ERROR
1324        ,p_entity_id                     => G_ENTITY_ID
1325        ,p_table_name                    => p_interface_table_name
1326        ,p_entity_code                   => G_ENTITY_CODE
1327       );
1328       RAISE;
1329 END Prepare_Dynamic_Sqls_Clob;
1330 /* Bug 10151142 : End */
1331 
1332 
1333 ----------------------------------------------------------------------
1334 
1335 
1336                           ----------------
1337                           -- Procedures --
1338                           ----------------
1339 
1340 ----------------------------------------------------------------------
1341 
1342 PROCEDURE Bulk_Load_User_Attrs_Data (
1343      p_api_version                   IN   NUMBER
1344     ,p_application_id                IN   NUMBER
1345     ,p_attr_group_type               IN   VARCHAR2
1346     ,p_object_name                   IN   VARCHAR2
1347     ,p_hz_party_id                   IN   VARCHAR2
1348     ,p_interface_table_name          IN   VARCHAR2
1349     ,p_data_set_id                   IN   NUMBER
1350     ,p_entity_id                     IN   NUMBER     DEFAULT NULL
1351     ,p_entity_index                  IN   NUMBER     DEFAULT NULL
1352     ,p_entity_code                   IN   VARCHAR2   DEFAULT NULL
1353     ,p_debug_level                   IN   NUMBER     DEFAULT 0
1354     ,p_init_error_handler            IN   VARCHAR2   DEFAULT FND_API.G_TRUE
1355     ,p_init_fnd_msg_list             IN   VARCHAR2   DEFAULT FND_API.G_FALSE
1356     ,p_log_errors                    IN   VARCHAR2   DEFAULT FND_API.G_FALSE
1357     ,p_add_errors_to_fnd_stack       IN   VARCHAR2   DEFAULT FND_API.G_FALSE
1358     ,p_commit                        IN   VARCHAR2   DEFAULT FND_API.G_FALSE
1359     ,p_default_dl_view_priv_list     IN   EGO_COL_NAME_VALUE_PAIR_ARRAY DEFAULT NULL
1360     ,p_default_dl_edit_priv_list     IN   EGO_COL_NAME_VALUE_PAIR_ARRAY DEFAULT NULL
1361     ,p_default_view_privilege        IN   VARCHAR2   DEFAULT NULL
1362     ,p_default_edit_privilege        IN   VARCHAR2   DEFAULT NULL
1363     ,p_privilege_predicate_api_name  IN   VARCHAR2   DEFAULT NULL
1364     ,p_related_class_codes_query     IN   VARCHAR2   DEFAULT '-100'
1365     ,p_validate                      IN   BOOLEAN    DEFAULT TRUE
1366     ,p_do_dml                        IN   BOOLEAN    DEFAULT TRUE
1367     ,p_do_req_def_valiadtion         IN   BOOLEAN    DEFAULT TRUE
1368     ,x_return_status                 OUT NOCOPY VARCHAR2
1369     ,x_errorcode                     OUT NOCOPY NUMBER
1370     ,x_msg_count                     OUT NOCOPY NUMBER
1371     ,x_msg_data                      OUT NOCOPY VARCHAR2
1372 ) IS
1373 
1374     l_api_name               CONSTANT VARCHAR2(30) := 'Bulk_Load_User_Attrs_Data';
1375 
1376     --we don't use l_api_version yet, but eventually we might:
1377     --if we change required parameters, version goes FROM n.x to (n+1).x
1378     --if we change optional parameters, version goes FROM x.n to x.(n+1)
1379     l_api_version            CONSTANT NUMBER := 1.0;
1380 
1381     l_view_priv_to_check                FND_FORM_FUNCTIONS.FUNCTION_NAME%TYPE;  --4105308
1382     l_edit_priv_to_check                FND_FORM_FUNCTIONS.FUNCTION_NAME%TYPE;  --4105308
1383 
1384     l_class_blk_tbl_declare             VARCHAR2(1000);
1385     l_class_blk_tbl_list                VARCHAR2(100);
1386     l_class_blk_tbl_list_2              VARCHAR2(100);
1387 
1388     l_dl_blk_tbl_declare                VARCHAR2(1000);
1389     l_dl_blk_tbl_list                   VARCHAR2(100);
1390     l_dl_blk_tbl_list_2                 VARCHAR2(100);
1391 
1392     l_pk_blk_tbl_declare                VARCHAR2(1000);
1393     l_pk_blk_tbl_list                   VARCHAR2(100);
1394     l_pk_blk_tbl_list_2                 VARCHAR2(100);
1395     l_dynamic_sql                       VARCHAR2(32767);
1396     l_dynamic_query                     VARCHAR2(32767);
1397     l_dynamic_sql_clob                  CLOB; /** added to bug 14145164 */
1398     cur_l_dynamic_sql_clob              INTEGER;/** added to bug 14145164 */
1399     l_dummy_ret_val                     INTEGER;/** added to bug 14145164 */
1400     l_pre_event_failed_sql              VARCHAR2(5000);
1401     l_defaltening_sql                   VARCHAR2(20000);
1402     l_defaltening_sql_create            VARCHAR2(32767);
1403     l_dynamic_sql_delete_post           VARCHAR2(32767); /*Uncommeneted code for bug 8485287*/
1404     l_deflatening_sql_where             VARCHAR2(10000);
1405     l_dynamic_group_by                  VARCHAR2(2000);
1406     l_dynamic_sql_1                     VARCHAR2(32767);
1407     --Bug 13923293 /* We are going to use a new variable to avoid size issue,
1408     -- However for future perspective we will CLOB so that such issue does not occurs.*/
1409     l_dynamic_sql_2                     VARCHAR2(32767);
1410     l_ext_table_select                  VARCHAR2(32767);
1411     l_dummy                             NUMBER;
1412    l_priv_predicate                    VARCHAR2(32767);
1413 
1414     -- 6070367 this must be more than double fnd_form_functions.function_name
1415     l_prev_ag_id_priv                   VARCHAR2(1000);
1416     l_do_dml_for_this_ag                BOOLEAN;
1417 
1418     l_no_of_err_recs                    NUMBER;
1419 
1420     l_priv_func_cursor_id               NUMBER;
1421     l_ivs_num_cursor_id                 NUMBER;
1422     l_ivs_date_cursor_id                NUMBER;
1423     l_ivs_date_time_cursor_id           NUMBER;
1424     l_ivs_char_cursor_id                NUMBER;
1425     l_nvs_num_cursor_id                 NUMBER;
1426     l_nvs_date_cursor_id                NUMBER;
1427     l_nvs_datetime_cursor_id            NUMBER;
1428     l_nvs_char_cursor_id                NUMBER;
1429     l_req_num_cursor_id                 NUMBER;
1430     l_req_char_cursor_id                NUMBER;
1431     l_req_date_cursor_id                NUMBER;
1432     l_default_num_cursor_id             NUMBER;
1433     l_default_date_cursor_id            NUMBER;
1434     l_default_char_cursor_id            NUMBER;
1435     l_max_size_char_cursor              NUMBER;
1436     l_max_size_num_cursor               NUMBER;
1437     l_colcheck_num_cursor_id            NUMBER;
1438     l_colcheck_char_cursor_id           NUMBER;
1439     l_colcheck_date_cursor_id           NUMBER;
1440     l_bad_tvs_sql_cursor_id             NUMBER;
1441     l_sr_tvs_num_cursor_id1             NUMBER;
1442     l_sr_tvs_num_cursor_id2             NUMBER;
1443     l_sr_tvs_date_cursor_id1            NUMBER;
1444     l_sr_tvs_date_cursor_id2            NUMBER;
1445     l_sr_tvs_str_cursor_id1             NUMBER;
1446     l_sr_tvs_str_cursor_id2             NUMBER;
1447     l_tvs_char_cursor_id                NUMBER;
1448     l_tvs_num_cursor_id                 NUMBER;
1449     l_tvs_date_cursor_id                NUMBER;
1450     l_bad_bindattrs_tvs_cursor_id       NUMBER;
1451     l_pre_event_failed_cursor_id        NUMBER;
1452 
1453     wierd_constant                      VARCHAR2(100);
1454     wierd_constant_2                    VARCHAR2(100);
1455 
1456     l_attr_group_metadata_obj           EGO_ATTR_GROUP_METADATA_OBJ;
1457     l_attr_metadata_table               EGO_ATTR_METADATA_TABLE;
1458     l_attr_metadata_table_sr            EGO_ATTR_METADATA_TABLE;
1459     l_attr_metadata_table_1             EGO_ATTR_METADATA_TABLE;
1460     l_add_all_to_cm            VARCHAR2(1); --added by Maychen for ER 9489112
1461     l_item_rev_dl_id           NUMBER := 43106;
1462 
1463 /*
1464 DYLAN: Gaurav, why do we have three Attr metadata table variables?  Surely we only need one...?
1465 */
1466 
1467     l_intf_tbl_select                   VARCHAR2(32767);
1468     l_intf_column_name                  VARCHAR2(50);
1469 
1470     l_ext_b_table_name                  VARCHAR2(30);
1471     l_ext_tl_table_name                 VARCHAR2(30);
1472     l_ext_vl_name                       VARCHAR2(30);
1473 
1474     l_num_data_level_columns            NUMBER := 0;
1475     l_class_code_column_name            VARCHAR2(30);
1476     l_class_code_column_type            VARCHAR2(30);
1477 
1478     l_data_level_1                      VARCHAR2(30);
1479     l_data_level_column_1               VARCHAR2(150);
1480     l_dl_col_data_type_1                VARCHAR2(150);
1481     l_data_level_1_disp_name            VARCHAR2(80);
1482 
1483     l_data_level_2                      VARCHAR2(30);
1484     l_data_level_column_2               VARCHAR2(150);
1485     l_dl_col_data_type_2                VARCHAR2(150);
1486     l_data_level_2_disp_name            VARCHAR2(80);
1487 
1488     l_data_level_3                      VARCHAR2(30);
1489     l_data_level_column_3               VARCHAR2(150);
1490     l_dl_col_data_type_3                VARCHAR2(150);
1491     l_data_level_3_disp_name            VARCHAR2(80);
1492 
1493     l_pk1_column_name                   VARCHAR2(30);
1494     l_pk2_column_name                   VARCHAR2(30);
1495     l_pk3_column_name                   VARCHAR2(30);
1496     l_pk4_column_name                   VARCHAR2(30);
1497     l_pk5_column_name                   VARCHAR2(30);
1498     l_pk1_column_type                   VARCHAR2(8);
1499     l_pk2_column_type                   VARCHAR2(8);
1500     l_pk3_column_type                   VARCHAR2(8);
1501     l_pk4_column_type                   VARCHAR2(8);
1502     l_pk5_column_type                   VARCHAR2(8);
1503     l_concat_pk_cols_sel                VARCHAR2(2000);
1504     l_concat_pk_cols_UAI2               VARCHAR2(32767);
1505 /*
1506 DYLAN: perhaps at some point we can consolidate and re-use
1507 variables wherever possible to reduce the memory footprint
1508 of this procedure.  But for now, let's leave it.
1509 */
1510 
1511  --
1512  -- Bug 12765998. Making the size of variables to MAX.
1513  -- For TL cols with decoded statements, the size
1514  -- of SELECT and WHERE clause can easily surpass
1515  -- existing values.
1516  -- sreharih. Mon Sep 26 12:58:32 PDT 2011
1517  --
1518     l_rtcq_alias_cc_pk_dl_list          VARCHAR2(32767);
1519     l_rtcq_alias_b_cols_list            VARCHAR2(32767);
1520     l_rtcq_alias_b_cols_list_1          VARCHAR2(32767);
1521     l_final_b_col_list                  VARCHAR2(32767);
1522     l_final_tl_col_list                 VARCHAR2(32767);
1523     l_rtcq_alias_tl_cols_list           VARCHAR2(32767);
1524     l_rtcq_alias_tl_cols_list_1         VARCHAR2(32767);
1525     l_no_alias_cc_pk_dl_list            VARCHAR2(32767);
1526     l_no_alias_b_values_list            VARCHAR2(32767);
1527     l_no_alias_b_cols_list              VARCHAR2(32767);
1528     l_no_alias_tl_cols_list             VARCHAR2(32767);
1529     l_no_alias_tl_cols_sel_list         VARCHAR2(32767);
1530     l_row_to_column_query_base          VARCHAR2(32767);
1531     l_row_to_column_query_ag_part       VARCHAR2(32767);
1532     l_row_to_column_attr_decode         VARCHAR2(32767);
1533     l_rtcq_to_ext_where_base            VARCHAR2(32767);
1534     l_rtcq_to_ext_where_uks             VARCHAR2(32767);
1535     l_rtcq_to_ext_whr_uks_idnt_chk      VARCHAR2(32767);
1536     l_row_to_column_query               VARCHAR2(32767);
1537     l_rn_index_for_ag                   NUMBER;
1538     l_uom_column                        VARCHAR2(30);
1539     l_uom_column1                       VARCHAR2(30);
1540     l_db_col_tbl_declare_ext_id         VARCHAR2(400);
1541     l_db_col_tbl_declare_attrs          VARCHAR2(8000);
1542     l_db_col_tbl_collect_ext_id         VARCHAR2(20);
1543     l_db_col_tbl_collect_b_attrs        VARCHAR2(1400);
1544     l_db_col_tbl_collect_tl_attrs       VARCHAR2(800);
1545     l_db_col_tbl_set_b_attrs            VARCHAR2(10000);
1546     l_db_col_tbl_set_tl_attrs           VARCHAR2(5000);
1547     l_db_col_tbl_where_ext_id           VARCHAR2(80);
1548 
1549     l_tvs_table_name                    VARCHAR2(240);
1550     l_tvs_val_col                       VARCHAR2(240);
1551     l_tvs_id_col                        VARCHAR2(240);
1552     l_tvs_mean_col                      VARCHAR2(240);
1553     l_tvs_where_clause                  VARCHAR2(32767);
1554     l_tvs_select                        VARCHAR2(32767);
1555     l_tvs_num_val_check_select          VARCHAR2(32767);
1556     l_tvs_date_val_check_select         VARCHAR2(32767);
1557     l_tvs_str_val_check_select          VARCHAR2(32767);
1558 
1559     l_attrname_start_index              NUMBER;
1560     l_attrname_end_index                NUMBER;
1561     l_tvs_col                           VARCHAR2(240);
1562     l_bind_attr_name                    VARCHAR2(30);
1563     l_ext_attr_col_name                 VARCHAR2(1000);
1564     l_bind_attr_data_type               VARCHAR2(30);
1565     --bug 9952371  increasing the size of the two local varchar2 variable from 5000 to 32767
1566     l_value_from_ext_table              VARCHAR2(32767);
1567     l_value_from_intftbl                VARCHAR2(32767);
1568     l_tvs_metadata_fetched              BOOLEAN;
1569 
1570     l_attr_exists_in_intf               VARCHAR2(10);
1571     l_null_date_time_value              VARCHAR2(100);
1572     l_null_date_value                   VARCHAR2(100);
1573     l_ag_id_col_exists                  BOOLEAN;
1574 
1575     l_dist_attr_in_data_set_rec         DIST_ATTR_IN_DATA_SET_REC;
1576     l_dist_attrs_in_data_set_table      DIST_ATTR_IN_DATA_SET_TABLE;
1577     --bug9846845 added one CLOB parameter
1578     l_tvs_where_clause_clob             CLOB;
1579     l_extra_column_str                  VARCHAR2(200);
1580     l_extra_column_val                  VARCHAR2(200); /*bug 14672950*/
1581 
1582     TYPE DYNAMIC_CUR IS REF CURSOR;
1583     l_dynamic_cursor                    DYNAMIC_CUR;
1584     l_dynamic_dist_ag_cursor            DYNAMIC_CUR;
1585     l_mr_dynamic_cursor                 DYNAMIC_CUR;
1586 
1587     TYPE ATTR_METADATA_RECORD IS RECORD
1588     (
1589       ATTR_ID                 NUMBER,
1590       ATTR_GROUP_ID           NUMBER,
1591       ATTR_GROUP_INT_NAME     VARCHAR2(30),
1592       MULTI_ROW_CODE          VARCHAR2(1),
1593       ATTR_INT_NAME           VARCHAR2(30),
1594       DATA_TYPE               VARCHAR2(30),
1595       UNIQUE_KEY_FLAG         VARCHAR2(1),
1596       DEFAULT_VALUE           VARCHAR2(2000) ,
1597       MAXIMUM_SIZE            NUMBER(4), --Bug12907500
1598       REQUIRED_FLAG           VARCHAR2(1),
1599       VALUE_SET_ID            NUMBER(10),
1600       VALIDATION_TYPE         VARCHAR2(1),
1601       MINIMUM_VALUE           VARCHAR2(150),
1602       MAXIMUM_VALUE           VARCHAR2(150),
1603       UOM_CODE                VARCHAR2(3),
1604       UOM_CLASS               VARCHAR2(10),
1605       DATA_LEVEL_ID           NUMBER,
1606       VIEW_PRIVILEGE          FND_FORM_FUNCTIONS.FUNCTION_NAME%TYPE, --4105308
1607       EDIT_PRIVILEGE          FND_FORM_FUNCTIONS.FUNCTION_NAME%TYPE --4105308
1608     );
1609 
1610     -- Fix for bug#9336604
1611     -- l_attr_metadata_rec                 ATTR_METADATA_RECORD;
1612     TYPE l_cursor  IS TABLE OF ATTR_METADATA_RECORD;
1613     l_attr_metadata_rec l_cursor;
1614 
1615     TYPE AG_RECORD IS RECORD
1616     (
1617       EXTENSION_ID           NUMBER,
1618       ATTR_GROUP_INT_NAME    VARCHAR2(30),
1619       TRANSACTION_TYPE       VARCHAR2(10),
1620       ROW_IDENTIFIER         NUMBER,
1621       PK1                    VARCHAR2(30),
1622       PK2                    VARCHAR2(30),
1623       PK3                    VARCHAR2(30),
1624       PK4                    VARCHAR2(30),
1625       PK5                    VARCHAR2(30),
1626       DATA_LEVEL_ID          NUMBER,
1627       DL1                    VARCHAR2(30),
1628       DL2                    VARCHAR2(30),
1629       DL3                    VARCHAR2(30),
1630       DL4                    VARCHAR2(30),
1631       DL5                    VARCHAR2(30),
1632       ATTR_NAME_VALUES       VARCHAR2(30000)
1633     );
1634 
1635     l_ag_deflatened_row            AG_RECORD;
1636 
1637     TYPE AG_RECORD_TABLE IS TABLE OF AG_RECORD;
1638     l_ag_deflatened_row_table      AG_RECORD_TABLE;
1639 
1640     l_attr_name                  VARCHAR2(30);
1641     l_old_value                  VARCHAR2(1000);
1642     l_new_value                  VARCHAR2(1000);
1643     l_attr_name_val_str          VARCHAR2(30000);
1644     l_event_name                 VARCHAR2(240);
1645     l_is_pre_event_enabled_flag  VARCHAR2(1);
1646     l_pre_event_name             VARCHAR2(240);
1647   /*code added for bug 8485287*/
1648     l_new_post_event_enabled_flag  VARCHAR2(1);
1649     l_new_post_event_name          VARCHAR2(240);
1650   /*end code added for bug 8485287*/
1651     attr_name_val_pair             EGO_ATTR_TABLE;
1652     l_event_key                  VARCHAR2(300);
1653     l_group_by_pre               VARCHAR2(200);
1654     l_successful_rowcount        NUMBER;
1655 
1656 /*
1657 DYLAN: There's no reason to have the following record type: just declare a variable:
1658 e.g., l_attr_group_int_name VARCHAR2(30);
1659 */
1660     TYPE DIST_MR_ATTR_GR_REC IS RECORD
1661     (
1662      ATTR_GROUP_INT_NAME      VARCHAR2(30)
1663     );
1664 
1665     l_attr_group_intf_rec               DIST_MR_ATTR_GR_REC;
1666 
1667     l_err_col_static_sql          VARCHAR2(32767);
1668     l_err_where_static_sql        VARCHAR2(32767);
1669 
1670     G_NO_ROWS_IN_INTF_TABLE       EXCEPTION;
1671 
1672     l_attr_base_uom_code          VARCHAR2(10);
1673 
1674     l_is_post_event_enabled_flag  VARCHAR2(1);
1675     l_is_second_post_event_flag   VARCHAR2(1);
1676 
1677     -- Bug 10097738 : Start
1678      l_column_exists               VARCHAR2(1);
1679      l_unique_value_col            VARCHAR2(20);
1680      l_unique_value                VARCHAR2(30);
1681      -- Bug 10097738 : End
1682 
1683     l_data_level_col_exists       BOOLEAN;
1684     l_object_id                   NUMBER;
1685     l_list_of_dl_for_ag_type      EGO_DATA_LEVEL_METADATA_TABLE;
1686 
1687     l_dl_pk_col1_sql              VARCHAR2(32000);
1688     l_dl_pk_col2_sql              VARCHAR2(32000);
1689     l_dl_pk_col3_sql              VARCHAR2(32000);
1690     l_dl_pk_col4_sql              VARCHAR2(32000);
1691     l_dl_pk_col5_sql              VARCHAR2(32000);
1692     l_dl_pk1_col_name             VARCHAR2(30);
1693     l_dl_pk2_col_name             VARCHAR2(30);
1694     l_dl_pk3_col_name             VARCHAR2(30);
1695     l_dl_pk4_col_name             VARCHAR2(30);
1696     l_dl_pk5_col_name             VARCHAR2(30);
1697 
1698     l_priv_attr_id                NUMBER := -1;
1699     l_correct_date_time_sql_uai      VARCHAR2(240); -- abedajna
1700     l_correct_date_time_sql_extvl    VARCHAR2(240); -- abedajna
1701     l_concat_pk_cols              VARCHAR2(32767);  -- Bug 9851212
1702 
1703     --bug 12397223 begin
1704     CURSOR enabled_data_level_cols(p_attr_group_id IN NUMBER)
1705     IS
1706     SELECT  DATA_LEVEL_ID
1707            ,DATA_LEVEL_NAME
1708            ,USER_DATA_LEVEL_NAME
1709            ,PK1_COLUMN_NAME
1710            ,PK2_COLUMN_NAME
1711            ,PK3_COLUMN_NAME
1712            ,PK4_COLUMN_NAME
1713            ,PK5_COLUMN_NAME
1714            ,PK1_COLUMN_TYPE
1715            ,PK2_COLUMN_TYPE
1716            ,PK3_COLUMN_TYPE
1717            ,PK4_COLUMN_TYPE
1718            ,PK5_COLUMN_TYPE
1719      FROM EGO_DATA_LEVEL_VL
1720     WHERE DATA_LEVEL_ID IN (    SELECT DATA_LEVEL_ID
1721     FROM EGO_ATTR_GROUP_DL
1722     WHERE ATTR_GROUP_ID = p_attr_group_id);
1723 
1724     l_data_level_cols_rec enabled_data_level_cols%ROWTYPE;
1725     --bug 12397223 end
1726 
1727     l_ext_table_select1           VARCHAR2(32767); -- Bug 13414358
1728 
1729     -- Bug 10151142 : Start
1730     l_buffer                    VARCHAR2(8191)  := '';
1731     l_tvs_where_clause_buffer   VARCHAR2(32767);
1732     l_return_status             VARCHAR2(1);
1733     l_msg_data                  VARCHAR2(4000);
1734 
1735     l_amount                    NUMBER;
1736     l_offset                    NUMBER  :=  1;
1737     l_dynamic_sql_1_cursor_id   NUMBER;
1738     l_dynamic_sql_cursor_id     NUMBER;
1739     l_clob_length               NUMBER;
1740     l_tvs_string_length         NUMBER;
1741     l_tvs_colb_length_diff      NUMBER;
1742     l_sql_1_ub                  NUMBER;
1743     l_sql_ub                    NUMBER;
1744 
1745     l_tvs_where_clause_clob1        CLOB;
1746     l_tvs_where_clause_clob2        CLOB;
1747     l_tvs_select_clob               CLOB;
1748     l_tvs_num_val_check_sel_clob    CLOB;
1749     l_tvs_date_val_check_sel_clob   CLOB;
1750     l_tvs_str_val_check_sel_clob    CLOB;
1751 
1752     l_dynamic_sql_v_type    dbms_sql.varchar2a;
1753     l_dynamic_sql_1_v_type  dbms_sql.varchar2a;
1754     -- Bug 10151142 : End
1755 
1756   BEGIN
1757     code_debug(l_api_name|| 'Starting  ');
1758 
1759     -- Standard start of API savepoint
1760     IF FND_API.To_Boolean(p_commit) THEN
1761       SAVEPOINT Bulk_Load_User_Attrs_Data_PVT;
1762     END IF;
1763 
1764     -- Check for call compatibility
1765     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version,
1766                                        l_api_name, G_PKG_NAME)
1767     THEN
1768       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1769     END IF;
1770 
1771     G_CURRENT_USER_ID  := FND_GLOBAL.User_Id;
1772     G_CURRENT_LOGIN_ID := FND_GLOBAL.Login_Id;
1773     G_USER_NAME        := FND_GLOBAL.USER_NAME;
1774 
1775     --ER 9489112, to get data_level_id for item revision level
1776     --and get 'Add All Imported Items to Change Order' option when change order option enabled
1777     l_add_all_to_cm := EGO_IMPORT_PVT.getAddAllToChangeFlag(p_batch_id => p_data_set_id);
1778 
1779     SELECT DATA_LEVEL_ID
1780     INTO  l_item_rev_dl_id
1781     FROM EGO_DATA_LEVEL_B
1782     WHERE ATTR_GROUP_TYPE = 'EGO_ITEMMGMT_GROUP'
1783       AND APPLICATION_ID = 431
1784       AND DATA_LEVEL_NAME = 'ITEM_REVISION_LEVEL';
1785     ---------------------------------
1786     -- Error Handler Initialization --
1787     ---------------------------------
1788     IF (FND_API.To_Boolean(p_add_errors_to_fnd_stack)) THEN
1789       G_ADD_ERRORS_TO_FND_STACK := 'Y';
1790     ELSE
1791       G_ADD_ERRORS_TO_FND_STACK := 'N';
1792     END IF;
1793     BEGIN
1794       SELECT application_short_name
1795       INTO  G_APPLICATION_CONTEXT
1796       FROM  fnd_application
1797       WHERE application_id = p_application_id;
1798     EXCEPTION
1799       WHEN OTHERS THEN
1800         G_APPLICATION_CONTEXT := p_application_id;
1801     END;
1802     -- Initialize message list even though we don't currently use it
1803     IF FND_API.To_Boolean(p_init_fnd_msg_list) THEN
1804       FND_MSG_PUB.Initialize;
1805     END IF;
1806 
1807     G_ENTITY_ID        := p_entity_id;
1808     -- entity code will take precedence over entity_id
1809     SELECT NVL(p_entity_code, DECODE(G_ENTITY_ID, NULL, G_APPLICATION_CONTEXT||'_EXTFWK_USER_ATTRS',NULL))
1810     INTO G_ENTITY_CODE
1811     FROM DUAL;
1812 
1813     -- Initialize error handler
1814     IF FND_API.To_Boolean(p_init_error_handler) THEN
1815       ERROR_HANDLER.Initialize;
1816       ERROR_HANDLER.Set_Bo_Identifier(EGO_USER_ATTRS_DATA_PVT.G_BO_IDENTIFIER);
1817       IF (p_debug_level > 0 AND ERROR_HANDLER.Get_Debug() = 'N') THEN
1818         EGO_USER_ATTRS_DATA_PVT.Set_Up_Debug_Session(G_ENTITY_ID, G_ENTITY_CODE, p_debug_level);
1819       END IF;
1820       -- test the message initialization.
1821       code_debug('Starting Bulk load concurrent program '||p_data_set_id, 0);
1822     END IF;
1823 
1824     -- select cols for
1825     l_err_col_static_sql := ' SELECT process_status, row_identifier, '
1826               ||' attr_group_int_name, attr_int_name, attr_value_str, '
1827               ||' attr_value_num, attr_value_date, attr_disp_value, '
1828               ||' transaction_type, transaction_id, attr_group_id ';
1829     l_err_where_static_sql := ' WHERE data_set_id = :data_set_id '  --||p_data_set_id /*Fix for bug#9678667. Literal to bind*/
1830               ||' AND process_status >= '||G_PS_BAD_ATTR_OR_AG_METADATA
1831     -- Bug 12895265
1832     --          ||' AND (process_status - '||G_PS_OTHER_ATTRS_INVALID ||') > '||G_PS_IN_PROCESS
1833               ||' AND attr_group_int_name = :attr_group_int_name ';
1834 
1835     l_no_of_err_recs := ERROR_HANDLER.Get_Message_Count ;
1836 
1837     ----------------------------------
1838     -- Fetching the object_id      --
1839     ----------------------------------
1840     SELECT OBJECT_ID
1841       INTO l_object_id
1842       FROM FND_OBJECTS
1843      WHERE OBJ_NAME = p_object_name;
1844 
1845     -----------------------------------------
1846     -- Fetch the PK column names and data  --
1847     -- types for the passed-in object name --
1848     -----------------------------------------
1849     SELECT PK1_COLUMN_NAME, PK1_COLUMN_TYPE,
1850            PK2_COLUMN_NAME, PK2_COLUMN_TYPE,
1851            PK3_COLUMN_NAME, PK3_COLUMN_TYPE,
1852            PK4_COLUMN_NAME, PK4_COLUMN_TYPE,
1853            PK5_COLUMN_NAME, PK5_COLUMN_TYPE
1854       INTO l_pk1_column_name, l_pk1_column_type,
1855            l_pk2_column_name, l_pk2_column_type,
1856            l_pk3_column_name, l_pk3_column_type,
1857            l_pk4_column_name, l_pk4_column_type,
1858            l_pk5_column_name, l_pk5_column_type
1859       FROM FND_OBJECTS
1860      WHERE OBJ_NAME = p_object_name;
1861 
1862     --------------------------------------
1863     -- Fetching the class code col name --
1864     --------------------------------------
1865     SELECT CLASSIFICATION_COL_NAME, CLASSIFICATION_COL_TYPE
1866       INTO l_class_code_column_name, l_class_code_column_type
1867       FROM EGO_FND_OBJECTS_EXT
1868      WHERE OBJECT_NAME = p_object_name;
1869 
1870     ----------------------------------------------------------
1871     -- Get the B, TL, and VL names for this Attr Group Type --
1872     ----------------------------------------------------------
1873     SELECT FLEX.APPLICATION_TABLE_NAME        EXT_TABLE_NAME,
1874            FLEX_EXT.APPLICATION_TL_TABLE_NAME EXT_TL_TABLE_NAME,
1875            FLEX_EXT.APPLICATION_VL_NAME       EXT_VL_NAME
1876       INTO l_ext_b_table_name,
1877            l_ext_tl_table_name,
1878            l_ext_vl_name
1879       FROM FND_DESCRIPTIVE_FLEXS              FLEX,
1880            EGO_FND_DESC_FLEXS_EXT             FLEX_EXT
1881      WHERE FLEX.APPLICATION_ID = FLEX_EXT.APPLICATION_ID(+)
1882        AND FLEX.DESCRIPTIVE_FLEXFIELD_NAME = FLEX_EXT.DESCRIPTIVE_FLEXFIELD_NAME(+)
1883        AND FLEX.APPLICATION_ID = p_application_id
1884        AND FLEX.DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type;
1885 
1886     -----------------------------------------------------------
1887     -- Some callers don't have TL tables (and hence no VLs); --
1888     -- in such cases we use the B table name instead         --
1889     -----------------------------------------------------------
1890     IF (l_ext_vl_name IS NULL) THEN
1891       l_ext_vl_name := l_ext_b_table_name;
1892     END IF;
1893 
1894     IF FND_API.TO_BOOLEAN(EGO_USER_ATTRS_COMMON_PVT.has_column_in_table(
1895               p_table_name => p_interface_table_name,
1896               p_column_name => 'DATA_LEVEL_ID')) THEN
1897       -------------------------------------------------------
1898       -- Populating the the data_level_id in case there is --
1899       -- only one enabled data level for it                --
1900       -------------------------------------------------------
1901       EXECUTE IMMEDIATE
1902       'UPDATE '||p_interface_table_name||' UAI1                          '||
1903       '   SET DATA_LEVEL_ID = (SELECT DATA_LEVEL_ID                      '||
1904       '                          FROM EGO_ATTR_GROUP_DL                  '||
1905       '                         WHERE ATTR_GROUP_ID = UAI1.ATTR_GROUP_ID '||
1906       '                        )                                         '||
1907       ' WHERE UAI1.DATA_SET_ID = :data_set_id                            '||
1908       '   AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||'                '||
1909       '   AND UAI1.ATTR_GROUP_TYPE = :attr_group_type                    '||
1910       '   AND (SELECT COUNT(*) FROM EGO_ATTR_GROUP_DL                    '||
1911       '         WHERE ATTR_GROUP_ID = UAI1.ATTR_GROUP_ID) < 2            '||
1912       '   AND DATA_LEVEL_ID IS NULL                                      '||
1913       '   AND DATA_LEVEL_NAME IS NULL                                    '||
1914       '   AND USER_DATA_LEVEL_NAME IS NULL                               '
1915       USING p_data_set_id, p_attr_group_type;
1916       ------------------------------------------------------
1917       -- Converting the data level internal name to id    --
1918       ------------------------------------------------------
1919       EXECUTE IMMEDIATE
1920       '  UPDATE '||p_interface_table_name||' UAI1                        '||
1921       '     SET DATA_LEVEL_ID = (SELECT DATA_LEVEL_ID                    '||
1922       '                         FROM EGO_DATA_LEVEL_VL                   '||
1923       '                        WHERE (DATA_LEVEL_NAME = NVL(UAI1.DATA_LEVEL_NAME, CHR(0)) '||
1924       '                               OR USER_DATA_LEVEL_NAME = NVL(UAI1.USER_DATA_LEVEL_NAME, CHR(0)))'||
1925       '                          AND APPLICATION_ID = :application_id    '||
1926       '                          AND ATTR_GROUP_TYPE = :attr_group_type  '||
1927       '                       )                                          '||
1928       '   WHERE UAI1.DATA_SET_ID = :data_set_id                          '||
1929       '     AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS                  ||
1930       '     AND UAI1.ATTR_GROUP_TYPE = :attr_group_type                  '||
1931       '     AND DATA_LEVEL_ID IS NULL                                    '||
1932       '     AND NOT( DATA_LEVEL_NAME IS NULL AND USER_DATA_LEVEL_NAME IS NULL) '
1933       USING p_application_id, p_attr_group_type, p_data_set_id, p_attr_group_type;
1934       ----------------------------------------------------------
1935       -- Erroring out the rows wid invalid/null data level id --
1936       ----------------------------------------------------------
1937 
1938       EXECUTE IMMEDIATE
1939       'UPDATE '||p_interface_table_name||' UAI1                          '||
1940       '   SET PROCESS_STATUS = PROCESS_STATUS +'||G_PS_INVALID_DATA_LEVEL ||
1941       ' WHERE UAI1.DATA_SET_ID = :data_set_id                            '||
1942       '   AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||'                '||
1943       '   AND UAI1.ATTR_GROUP_TYPE = :attr_group_type                    '||
1944       '   AND (   DATA_LEVEL_ID IS NULL                                  '||
1945       '         OR NOT EXISTS(SELECT NULL                                '||
1946       '                        FROM EGO_ATTR_GROUP_DL                    '||
1947       '                       WHERE ATTR_GROUP_ID = UAI1.ATTR_GROUP_ID   '||
1948       '                         AND DATA_LEVEL_ID = UAI1.DATA_LEVEL_ID) )'
1949       USING p_data_set_id, p_attr_group_type;
1950     END IF;
1951 
1952     -------------------------------------------------------
1953     -- Checking weather the ext table has data_level_id  --
1954     -- column or not.                                    --
1955     -------------------------------------------------------
1956 
1957     l_data_level_col_exists :=  FND_API.TO_BOOLEAN(
1958             EGO_USER_ATTRS_COMMON_PVT.has_column_in_table(
1959               p_table_name => l_ext_b_table_name,
1960               p_column_name => 'DATA_LEVEL_ID'));
1961 
1962     l_list_of_dl_for_ag_type := EGO_USER_ATTRS_COMMON_PVT.Get_Data_Levels_For_AGType( p_application_id  => p_application_id
1963                                                                                      ,p_attr_group_type => p_attr_group_type);
1964 
1965     ------------------------------------------------------------
1966     -- Get data level information for the given object name   --
1967     -- R12C onwards the data level info wud not be stored in  --
1968     -- lookups table. Hence we get it from the dl meta data   --
1969     -- table fetched. We assume here that there can be only 3 --
1970     -- data levels with only one pk column. This assumption is -
1971     -- as per the support offered prior to R12C               --
1972     ------------------------------------------------------------
1973     l_dummy := 0;
1974     FOR i IN l_list_of_dl_for_ag_type.FIRST .. l_list_of_dl_for_ag_type.LAST
1975     LOOP
1976 
1977       IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 <> 'NONE'
1978          AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 IS NOT NULL) THEN
1979 
1980           l_dummy := l_dummy + 1;
1981 
1982           IF (l_dummy = 1) THEN
1983 
1984             l_data_level_1           := l_list_of_dl_for_ag_type(i).DATA_LEVEL_NAME;
1985             l_data_level_column_1    := l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1;
1986             l_dl_col_data_type_1     := l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE1;
1987             l_data_level_1_disp_name := l_list_of_dl_for_ag_type(i).USER_DATA_LEVEL_NAME;
1988             l_num_data_level_columns := 1;
1989 
1990           ELSIF (l_dummy = 2) THEN
1991 
1992             l_data_level_2           := l_list_of_dl_for_ag_type(i).DATA_LEVEL_NAME;
1993             l_data_level_column_2    := l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1;
1994             l_dl_col_data_type_2     := l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE1;
1995             l_data_level_2_disp_name := l_list_of_dl_for_ag_type(i).USER_DATA_LEVEL_NAME;
1996             l_num_data_level_columns := 2;
1997 
1998           ELSIF (l_dummy = 3) THEN
1999             l_data_level_3           := l_list_of_dl_for_ag_type(i).DATA_LEVEL_NAME;
2000             l_data_level_column_3    := l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1;
2001             l_dl_col_data_type_3     := l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE1;
2002             l_data_level_3_disp_name := l_list_of_dl_for_ag_type(i).USER_DATA_LEVEL_NAME;
2003             l_num_data_level_columns := 3;
2004 
2005           END IF;
2006 
2007       END IF;
2008 
2009     END LOOP;
2010 
2011     -------------------------------------------------------------
2012     -- Find out weather the ATTR_GROUP_ID column exists in the --
2013     -- table where attribute data is to be uploaded or not     --
2014     -------------------------------------------------------------
2015 
2016     l_ag_id_col_exists :=  FND_API.TO_BOOLEAN(
2017             EGO_USER_ATTRS_COMMON_PVT.has_column_in_table(
2018               p_table_name => l_ext_b_table_name,
2019               p_column_name => 'ATTR_GROUP_ID'));
2020 
2021     l_pk_blk_tbl_declare := '';
2022     l_pk_blk_tbl_list := '';
2023     ---------------------------------------------------------
2024     --Building the concatenated pks for select and where   --
2025     ---------------------------------------------------------
2026     IF (l_pk1_column_name IS NOT NULL) THEN
2027        l_concat_pk_cols_sel := l_concat_pk_cols_sel||l_pk1_column_name||',';
2028        l_concat_pk_cols_UAI2 := l_concat_pk_cols_UAI2 || ' AND '||l_pk1_column_name||' = UAI2.'||l_pk1_column_name;
2029        l_pk_blk_tbl_list := l_pk_blk_tbl_list || '  pk_1_tbl ';
2030        l_pk_blk_tbl_list_2 := l_pk_blk_tbl_list_2 || '  pk_1_tbl(i) ';
2031        IF(l_pk1_column_type = 'INTEGER') THEN
2032           l_pk_blk_tbl_declare := l_pk_blk_tbl_declare || ' pk_1_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_NUM_TBL; ';
2033        ELSE
2034           l_pk_blk_tbl_declare := l_pk_blk_tbl_declare || ' pk_1_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_STR_TBL; ';
2035        END IF;
2036     END IF;
2037 
2038     IF (l_pk2_column_name IS NOT NULL) THEN
2039        l_concat_pk_cols_sel := l_concat_pk_cols_sel ||l_pk2_column_name||',';
2040        l_concat_pk_cols_UAI2 := l_concat_pk_cols_UAI2 || ' AND '||l_pk2_column_name||' = UAI2.'||l_pk2_column_name;
2041        l_pk_blk_tbl_list := l_pk_blk_tbl_list || ' ,pk_2_tbl ';
2042        l_pk_blk_tbl_list_2 := l_pk_blk_tbl_list_2 || '  ,pk_2_tbl(i) ';
2043        IF(l_pk2_column_type = 'INTEGER') THEN
2044           l_pk_blk_tbl_declare := l_pk_blk_tbl_declare || ' pk_2_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_NUM_TBL; ';
2045        ELSE
2046           l_pk_blk_tbl_declare := l_pk_blk_tbl_declare || ' pk_2_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_STR_TBL; ';
2047        END IF;
2048     END IF;
2049 
2050     IF (l_pk3_column_name IS NOT NULL) THEN
2051       l_concat_pk_cols_sel := l_concat_pk_cols_sel ||l_pk3_column_name||',';
2052       l_concat_pk_cols_UAI2 := l_concat_pk_cols_UAI2 || ' AND '||l_pk3_column_name||' = UAI2.'||l_pk3_column_name;
2053       l_pk_blk_tbl_list := l_pk_blk_tbl_list || ' ,pk_3_tbl ';
2054       l_pk_blk_tbl_list_2 := l_pk_blk_tbl_list_2 || '  ,pk_3_tbl(i) ';
2055       IF(l_pk3_column_type = 'INTEGER') THEN
2056          l_pk_blk_tbl_declare := l_pk_blk_tbl_declare || ' pk_3_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_NUM_TBL; ';
2057       ELSE
2058         l_pk_blk_tbl_declare := l_pk_blk_tbl_declare || ' pk_3_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_STR_TBL; ';
2059       END IF;
2060     END IF;
2061 
2062     IF (l_pk4_column_name IS NOT NULL) THEN
2063       l_concat_pk_cols_sel := l_concat_pk_cols_sel ||l_pk4_column_name||',';
2064       l_concat_pk_cols_UAI2 := l_concat_pk_cols_UAI2 || ' AND '||l_pk4_column_name||' = UAI2.'||l_pk4_column_name;
2065       l_pk_blk_tbl_list := l_pk_blk_tbl_list || ' ,pk_4_tbl ';
2066       l_pk_blk_tbl_list_2 := l_pk_blk_tbl_list_2 || '  ,pk_4_tbl(i) ';
2067       IF(l_pk4_column_type = 'INTEGER') THEN
2068          l_pk_blk_tbl_declare := l_pk_blk_tbl_declare || ' pk_4_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_NUM_TBL; ';
2069       ELSE
2070          l_pk_blk_tbl_declare := l_pk_blk_tbl_declare || ' pk_4_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_STR_TBL; ';
2071       END IF;
2072     END IF;
2073     IF (l_pk5_column_name IS NOT NULL) THEN
2074       l_concat_pk_cols_sel := l_concat_pk_cols_sel ||l_pk5_column_name||',';
2075       l_concat_pk_cols_UAI2 := l_concat_pk_cols_UAI2 || ' AND '||l_pk5_column_name||' = UAI2.'||l_pk5_column_name;
2076       l_pk_blk_tbl_list := l_pk_blk_tbl_list || ' ,pk_5_tbl ';
2077       l_pk_blk_tbl_list_2 := l_pk_blk_tbl_list_2 || '  ,pk_5_tbl(i) ';
2078       IF(l_pk5_column_type = 'INTEGER') THEN
2079         l_pk_blk_tbl_declare := l_pk_blk_tbl_declare || ' pk_5_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_NUM_TBL; ';
2080       ELSE
2081         l_pk_blk_tbl_declare := l_pk_blk_tbl_declare || ' pk_5_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_STR_TBL; ';
2082       END IF;
2083     END IF;
2084     ---------------------------------------------
2085     -- adding datalevel columns   --
2086     ---------------------------------------------
2087     IF(l_data_level_col_exists) THEN
2088 
2089       l_concat_pk_cols_sel := l_concat_pk_cols_sel||' DATA_LEVEL_ID , ';
2090       l_concat_pk_cols_UAI2 := l_concat_pk_cols_UAI2 || ' AND NVL(DATA_LEVEL_ID,'||G_NULL_TOKEN_NUM||') '||
2091                                                         '   = NVL(UAI2.DATA_LEVEL_ID,'||G_NULL_TOKEN_NUM||')';
2092 
2093       FOR i IN l_list_of_dl_for_ag_type.FIRST .. l_list_of_dl_for_ag_type.LAST
2094       LOOP
2095 
2096          IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 <> 'NONE'
2097             AND INSTR(l_concat_pk_cols_sel,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1) = 0) THEN
2098 
2099                  IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE1 = 'NUMBER') THEN
2100                    wierd_constant := G_NULL_TOKEN_NUM;
2101                  ELSIF (l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE1 = 'DATE' OR l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE1 = 'DATETIME') THEN
2102                    wierd_constant := G_NULL_TOKEN_DATE;
2103                  ELSE
2104                    wierd_constant := G_NULL_TOKEN_STR;
2105                  END IF;
2106                  l_concat_pk_cols_sel := l_concat_pk_cols_sel||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1||' , ';
2107 
2108                  l_concat_pk_cols_UAI2 := l_concat_pk_cols_UAI2 || ' AND NVL('||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1||','||wierd_constant||') '||
2109                                                                    '   = NVL(UAI2.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1||','||wierd_constant||')';
2110          END IF;
2111          IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2 <> 'NONE'
2112             AND INSTR(l_concat_pk_cols_sel,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2) = 0) THEN
2113                  IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE2 = 'NUMBER') THEN
2114                    wierd_constant := G_NULL_TOKEN_NUM;
2115                  ELSIF (l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE2 = 'DATE' OR l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE2 = 'DATETIME') THEN
2116                    wierd_constant := G_NULL_TOKEN_DATE;
2117                  ELSE
2118                    wierd_constant := G_NULL_TOKEN_STR;
2119                  END IF;
2120                  l_concat_pk_cols_sel := l_concat_pk_cols_sel||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2||' , ';
2121                  l_concat_pk_cols_UAI2 := l_concat_pk_cols_UAI2 || ' AND NVL('||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2||','||wierd_constant||') '||
2122                                                                    '   = NVL(UAI2.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2||','||wierd_constant||')';
2123          END IF;
2124          IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3 <> 'NONE'
2125             AND INSTR(l_concat_pk_cols_sel,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3) = 0) THEN
2126                  IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE3 = 'NUMBER') THEN
2127                    wierd_constant := G_NULL_TOKEN_NUM;
2128                  ELSIF (l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE3 = 'DATE' OR l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE3 = 'DATETIME') THEN
2129                    wierd_constant := G_NULL_TOKEN_DATE;
2130                  ELSE
2131                    wierd_constant := G_NULL_TOKEN_STR;
2132                  END IF;
2133                  l_concat_pk_cols_sel := l_concat_pk_cols_sel||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3||' , ';
2134                  l_concat_pk_cols_UAI2 := l_concat_pk_cols_UAI2 || ' AND NVL('||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3||','||wierd_constant||') '||
2135                                                                    '   = NVL(UAI2.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3||','||wierd_constant||')';
2136          END IF;
2137          IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4 <> 'NONE'
2138             AND INSTR(l_concat_pk_cols_sel,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4) = 0) THEN
2139                  IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE4 = 'NUMBER') THEN
2140                    wierd_constant := G_NULL_TOKEN_NUM;
2141                  ELSIF (l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE4 = 'DATE' OR l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE4 = 'DATETIME') THEN
2142                    wierd_constant := G_NULL_TOKEN_DATE;
2143                  ELSE
2144                    wierd_constant := G_NULL_TOKEN_STR;
2145                  END IF;
2146                  l_concat_pk_cols_sel := l_concat_pk_cols_sel||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4||' , ';
2147                  l_concat_pk_cols_UAI2 := l_concat_pk_cols_UAI2 || ' AND NVL('||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4||','||wierd_constant||') '||
2148                                                                    '   = NVL(UAI2.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4||','||wierd_constant||')';
2149          END IF;
2150          IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5 <> 'NONE'
2151             AND INSTR(l_concat_pk_cols_sel,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5) = 0) THEN
2152                  IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE5 = 'NUMBER') THEN
2153                    wierd_constant := G_NULL_TOKEN_NUM;
2154                  ELSIF (l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE5 = 'DATE' OR l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE5 = 'DATETIME') THEN
2155                    wierd_constant := G_NULL_TOKEN_DATE;
2156                  ELSE
2157                    wierd_constant := G_NULL_TOKEN_STR;
2158                  END IF;
2159                  l_concat_pk_cols_sel := l_concat_pk_cols_sel||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5||' , ';
2160                  l_concat_pk_cols_UAI2 := l_concat_pk_cols_UAI2 || ' AND NVL('||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5||','||wierd_constant||') '||
2161                                                                    '   = NVL(UAI2.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5||','||wierd_constant||')';
2162          END IF;
2163       END LOOP;
2164     ELSE
2165        IF (l_num_data_level_columns = 1) THEN
2166           l_concat_pk_cols_sel := l_concat_pk_cols_sel ||l_data_level_column_1||' , ';
2167           l_concat_pk_cols_UAI2 := l_concat_pk_cols_UAI2 || ' AND NVL('||l_data_level_column_1||',-1) = NVL(UAI2.'||l_data_level_column_1||',-1 )';
2168        ELSIF (l_num_data_level_columns = 2) THEN
2169          l_concat_pk_cols_sel := l_concat_pk_cols_sel ||l_data_level_column_1||' , '||l_data_level_column_2||',';
2170          l_concat_pk_cols_UAI2 := l_concat_pk_cols_UAI2 || ' AND NVL('||l_data_level_column_1||',-1) = NVL(UAI2.'||l_data_level_column_1||',-1 )'||
2171                                 ' AND NVL('||l_data_level_column_2||',-1) = NVL(UAI2.'||l_data_level_column_2||',-1 )';
2172 
2173        ELSIF (l_num_data_level_columns = 3) THEN
2174          l_concat_pk_cols_sel := l_concat_pk_cols_sel ||l_data_level_column_1||' , '||l_data_level_column_2||','||l_data_level_column_3||',';
2175          l_concat_pk_cols_UAI2 := l_concat_pk_cols_UAI2 || ' AND NVL('||l_data_level_column_1||',-1) = NVL(UAI2.'||l_data_level_column_1||',-1 )'||
2176                                ' AND NVL('||l_data_level_column_2||',-1) = NVL(UAI2.'||l_data_level_column_2||',-1 ) AND NVL('||l_data_level_column_3||',-1) = NVL(UAI2.'
2177                                  ||l_data_level_column_3||',-1 )';
2178        END IF;
2179     END IF;
2180 
2181     ---------------------------------------------------------------
2182     -- Constructing the sql code snippets for dl's and class code
2183     ---------------------------------------------------------------
2184     IF (l_data_level_column_1 IS NOT NULL AND l_data_level_column_1 <> 'NONE') THEN
2185       l_dl_blk_tbl_list := l_dl_blk_tbl_list || '  ,dl_1_tbl ';
2186       l_dl_blk_tbl_list_2 := l_dl_blk_tbl_list_2 || '  ,dl_1_tbl(i) ';
2187       IF(l_dl_col_data_type_1 = 'NUMBER') THEN
2188          l_dl_blk_tbl_declare := l_dl_blk_tbl_declare || ' dl_1_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_NUM_TBL; ';
2189       ELSE
2190          l_dl_blk_tbl_declare := l_dl_blk_tbl_declare || ' dl_1_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_STR_TBL; ';
2191       END IF;
2192     END IF;
2193 
2194     IF (l_data_level_column_2 IS NOT NULL AND l_data_level_column_2 <> 'NONE') THEN
2195       l_dl_blk_tbl_list := l_dl_blk_tbl_list || '  dl_2_tbl ';
2196       l_dl_blk_tbl_list_2 := l_dl_blk_tbl_list_2 || '  dl_2_tbl(i) ';
2197       IF(l_dl_col_data_type_2 = 'NUMBER') THEN
2198          l_dl_blk_tbl_declare := l_dl_blk_tbl_declare || ' dl_2_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_NUM_TBL; ';
2199       ELSE
2200          l_dl_blk_tbl_declare := l_dl_blk_tbl_declare || ' dl_2_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_STR_TBL; ';
2201       END IF;
2202     END IF;
2203 
2204     IF (l_data_level_column_3 IS NOT NULL AND l_data_level_column_3 <> 'NONE') THEN
2205       l_dl_blk_tbl_list := l_dl_blk_tbl_list || '  dl_3_tbl ';
2206       l_dl_blk_tbl_list_2 := l_dl_blk_tbl_list_2 || '  dl_3_tbl(i) ';
2207       IF(l_dl_col_data_type_3 = 'NUMBER') THEN
2208          l_dl_blk_tbl_declare := l_dl_blk_tbl_declare || ' dl_3_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_NUM_TBL; ';
2209       ELSE
2210          l_dl_blk_tbl_declare := l_dl_blk_tbl_declare || ' dl_3_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_STR_TBL; ';
2211       END IF;
2212     END IF;
2213 
2214     IF (l_class_code_column_name IS NOT NULL ) THEN
2215       l_class_blk_tbl_list := l_class_blk_tbl_list || '  class_tbl ';
2216       l_class_blk_tbl_list_2 := l_class_blk_tbl_list_2 || '  class_tbl(i) ';
2217       IF(l_class_code_column_type = 'NUMBER') THEN
2218          l_class_blk_tbl_declare := l_class_blk_tbl_declare || ' class_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_NUM_TBL; ';
2219       ELSE
2220          l_class_blk_tbl_declare := l_class_blk_tbl_declare || ' class_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_STR_TBL; ';
2221       END IF;
2222     END IF;
2223 
2224 
2225 /*
2226 DYLAN: why are we selecting this?  We don't treat CC as a constraint;
2227 do we need it for any purpose in the query that's being built here?
2228 (I can't tell.)
2229 */
2230     IF l_class_code_column_name IS NOT NULL THEN
2231       l_concat_pk_cols_sel := l_concat_pk_cols_sel ||l_class_code_column_name||',';
2232     END IF;
2233 
2234     IF (G_HZ_PARTY_ID IS NULL) THEN
2235       G_HZ_PARTY_ID := p_hz_party_id;
2236     END IF;
2237 
2238 /*
2239     -----------------------------------------------
2240     -- Set this global variable once per session --
2241     -----------------------------------------------
2242     IF (G_HZ_PARTY_ID IS NULL) THEN
2243       IF (G_USER_NAME IS NOT NULL) THEN
2244 
2245         SELECT 'HZ_PARTY:'||TO_CHAR(PERSON_ID)
2246           INTO G_HZ_PARTY_ID
2247           FROM EGO_PEOPLE_V
2248          WHERE USER_NAME = G_USER_NAME;
2249 
2250       ELSE
2251          RAISE G_NO_USER_NAME_TO_VALIDATE;
2252       END IF;
2253     END IF;
2254 */
2255 
2256 /*
2257 DYLAN: we need to remember to confirm whether ERROR_HANDLER
2258 init is required or will be taken care of by calling APIs
2259 */
2260 
2261 /***
2262                      --======================--
2263                      -- ERROR_HANDLER SET-UP --
2264                      --======================--
2265 
2266     IF (FND_API.To_Boolean(p_init_error_handler)) THEN
2267 
2268       ERROR_HANDLER.Initialize();
2269       ERROR_HANDLER.Set_Bo_Identifier(EGO_USER_ATTRS_DATA_PVT.G_BO_IDENTIFIER);
2270 
2271       ---------------------------------------------------
2272       -- If we're debugging, we have to set up a Debug --
2273       -- session (unless our caller already did so)    --
2274       ---------------------------------------------------
2275       IF (p_debug_level > 0 AND ERROR_HANDLER.Get_Debug() = 'N') THEN
2276 
2277         EGO_USER_ATTRS_DATA_PVT.Set_Up_Debug_Session(p_entity_id
2278                                                     ,p_entity_code
2279                                                     ,p_debug_level);
2280 
2281       END IF;
2282       code_debug('Starting Bulk Load for data set ID: '||p_data_set_id, 1);
2283 
2284     END IF;
2285 ***/
2286 
2287 code_debug(' Starting non-loop validations ',1);
2288 
2289   ---------------------------------------------------
2290   -- Validations are done only if the API has been --
2291   -- called with the parameter p_validate as TRUE  --
2292   -- This IF would end after the attr level validation loop --
2293   ------------------------------------------------------------
2294   IF (p_validate) THEN   -- Search for    *p_validate-IF-1* to find the END IF for this one.
2295                      --======================--
2296                      -- NON-LOOP VALIDATIONS --
2297                      --======================--
2298 
2299     -----------------------------------------------
2300     -- Update the interface table populating the --
2301     -- attribute group id for the given data     --
2302     -----------------------------------------------
2303 
2304     EXECUTE IMMEDIATE
2305       'UPDATE '||p_interface_table_name||' UAI1
2306        SET PROCESS_STATUS  =  PROCESS_STATUS + '||G_PS_BAD_ATTR_GRP_ID||'
2307      WHERE UAI1.DATA_SET_ID = :data_set_id
2308        AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
2309        AND ATTR_GROUP_ID IS NOT NULL
2310        AND NVL(UAI1.ATTR_GROUP_TYPE,:attr_group_type)=:attr_group_type
2311        AND ATTR_GROUP_ID <> ( SELECT ATTR_GROUP_ID
2312                                 FROM EGO_FND_DSC_FLX_CTX_EXT FLX_EXT
2313                                WHERE APPLICATION_ID = :application_id
2314                                  AND DESCRIPTIVE_FLEXFIELD_NAME = :attr_group_type
2315                                  AND DESCRIPTIVE_FLEX_CONTEXT_CODE = UAI1.ATTR_GROUP_INT_NAME) '
2316     USING  p_data_set_id, p_attr_group_type, p_attr_group_type, p_application_id, p_attr_group_type ;
2317 
2318     EXECUTE IMMEDIATE
2319       'UPDATE '||p_interface_table_name||' UAI1
2320        SET ATTR_GROUP_ID =   (SELECT ATTR_GROUP_ID
2321                                 FROM EGO_FND_DSC_FLX_CTX_EXT FLX_EXT
2322                                WHERE APPLICATION_ID = :application_id
2323                                  AND DESCRIPTIVE_FLEXFIELD_NAME = :attr_group_type
2324                                  AND DESCRIPTIVE_FLEX_CONTEXT_CODE = UAI1.ATTR_GROUP_INT_NAME)
2325      WHERE UAI1.DATA_SET_ID = :data_set_id
2326        AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
2327        AND ATTR_GROUP_ID IS NULL '
2328     USING p_application_id, p_attr_group_type, p_data_set_id;
2329 
2330     -----------------------------------------------
2331     -- Update the interface table populating the --
2332     -- attribute group type for the given data   --
2333     -----------------------------------------------
2334 
2335     EXECUTE IMMEDIATE
2336       'UPDATE '||p_interface_table_name||' UAI1
2337        SET ATTR_GROUP_TYPE = (SELECT DESCRIPTIVE_FLEXFIELD_NAME
2338                                 FROM EGO_FND_DSC_FLX_CTX_EXT FLX_EXT
2339                                WHERE APPLICATION_ID = :application_id
2340                                  AND ATTR_GROUP_ID = UAI1.ATTR_GROUP_ID)
2341      WHERE UAI1.DATA_SET_ID = :data_set_id
2342        AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
2343        AND UAI1.ATTR_GROUP_TYPE IS NULL '
2344     USING p_application_id, p_data_set_id;
2345 
2346   END IF;
2347 
2348     -------------------------------------------------
2349     -- We would not go any further if we dont have --
2350     -- any rows to process in this call.           --
2351     -------------------------------------------------
2352 
2353     BEGIN
2354       EXECUTE IMMEDIATE ' SELECT DATA_SET_ID FROM '||p_interface_table_name||
2355                         '  WHERE DATA_SET_ID = :data_set_id
2356                              AND ROWNUM = 1
2357                              AND PROCESS_STATUS = '||G_PS_IN_PROCESS||'
2358                              AND ATTR_GROUP_TYPE = :attr_group_type '
2359                   INTO l_dummy
2360                  USING p_data_set_id, p_attr_group_type;
2361     EXCEPTION
2362       WHEN NO_DATA_FOUND THEN
2363       ----------------------------------------------
2364       -- There are no rows in the attr intf table --
2365       -- lets push off ...                        --
2366       ----------------------------------------------
2367         RAISE G_NO_ROWS_IN_INTF_TABLE;
2368     END;
2369 
2370   -------------------------------------------
2371   -- The above validations should be there --
2372   -- for dml mode and validate mode        --
2373   -------------------------------------------
2374   IF (p_validate) THEN
2375     ------------------------------------------------
2376     -- Mark as errors all logical Attribute Group --
2377     -- rows for which we cannot find metadata     --
2378     ------------------------------------------------
2379     -- Fix for bug#9336604
2380     -- Added no_unnest hint
2381     -- Changed bind variable p_data_set_id to literal
2382     EXECUTE IMMEDIATE
2383     'UPDATE '||p_interface_table_name||' UAI1
2384         SET UAI1.PROCESS_STATUS = UAI1.PROCESS_STATUS + '||G_PS_BAD_ATTR_OR_AG_METADATA||'
2385       WHERE UAI1.DATA_SET_ID = :p_data_set_id
2386         AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
2387         AND UAI1.ATTR_GROUP_TYPE = :attr_group_type
2388         AND UAI1.ROW_IDENTIFIER IN
2389             (SELECT DISTINCT UAI2.ROW_IDENTIFIER
2390                FROM '||p_interface_table_name||' UAI2
2391               WHERE UAI2.DATA_SET_ID = :p_data_set_id
2392                 AND UAI2.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
2393                 AND NOT EXISTS (SELECT /*+ no_unnest */ NULL
2394                                   FROM EGO_FND_DSC_FLX_CTX_EXT AG,
2395                                        FND_DESCR_FLEX_COLUMN_USAGES A
2396                                  WHERE AG.ATTR_GROUP_ID = UAI2.ATTR_GROUP_ID
2397                                    AND A.DESCRIPTIVE_FLEX_CONTEXT_CODE = AG.DESCRIPTIVE_FLEX_CONTEXT_CODE
2398                                    AND A.APPLICATION_ID =  :p_application_id
2399                                    AND A.DESCRIPTIVE_FLEXFIELD_NAME = :p_attr_group_type
2400                                    AND A.END_USER_COLUMN_NAME = UAI2.ATTR_INT_NAME
2401                                    AND A.ENABLED_FLAG = ''Y''))'
2402     USING p_data_set_id, p_attr_group_type, p_data_set_id, p_application_id, p_attr_group_type;
2403 
2404 code_debug(' After validations for G_PS_BAD_ATTR_OR_AG_METADATA',1);
2405 
2406 
2407 /*
2408 DYLAN: I need to check--is the multiple entries validation step required
2409 if intf_U1 is unique?
2410 */
2411 /*
2412 Gaurav: we dont need this check since we have a unique index
2413         which wont allow duplicate rows
2414     ------------------------------------------------------------------
2415     -- Mark as errors all logical Attribute Group rows that contain --
2416     -- multiple interface table rows for any single Attribute       --
2417     ------------------------------------------------------------------
2418     EXECUTE IMMEDIATE
2419     'UPDATE '||p_interface_table_name||' UAI1
2420         SET UAI1.PROCESS_STATUS = UAI1.PROCESS_STATUS + '||G_PS_MULTIPLE_ENTRIES||'
2421       WHERE UAI1.DATA_SET_ID = :p_data_set_id
2422         AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
2423         AND UAI1.ROW_IDENTIFIER IN
2424             (SELECT ROW_IDENTIFIER
2425                FROM (SELECT UAI2.ROW_IDENTIFIER
2426                            ,UAI2.ATTR_INT_NAME
2427                            ,COUNT(*) NUMBER_OF_ENTRIES
2428                        FROM '||p_interface_table_name||' UAI2
2429                       WHERE UAI2.DATA_SET_ID = :p_data_set_id
2430                         AND UAI2.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
2431                    GROUP BY UAI2.ROW_IDENTIFIER, UAI2.ATTR_INT_NAME)
2432               WHERE NUMBER_OF_ENTRIES > 1)'
2433     USING p_data_set_id, p_data_set_id;
2434 */
2435 
2436     --------------------------------------------------------------------
2437     -- Mark as errors all logical Attribute Group rows that contain   --
2438     -- any interface table rows with multiple values for an Attribute --
2439     --------------------------------------------------------------------
2440     EXECUTE IMMEDIATE
2441     'UPDATE '||p_interface_table_name||' UAI1
2442         SET UAI1.PROCESS_STATUS = UAI1.PROCESS_STATUS + '||G_PS_MULTIPLE_VALUES||'
2443       WHERE UAI1.DATA_SET_ID = :p_data_set_id
2444         AND UAI1.ATTR_GROUP_TYPE = :attr_group_type
2445         AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
2446         AND UAI1.ROW_IDENTIFIER IN
2447             (SELECT /*+ UNNEST HASH_SJ */ DISTINCT UAI2.ROW_IDENTIFIER  /* bug#9678667 Change apr30 */
2448                FROM '||p_interface_table_name||' UAI2
2449               WHERE UAI2.DATA_SET_ID = :p_data_set_id
2450                 AND UAI2.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
2451                 AND ((UAI2.ATTR_VALUE_STR IS NOT NULL AND
2452                       (UAI2.ATTR_VALUE_NUM IS NOT NULL OR
2453                        UAI2.ATTR_VALUE_DATE IS NOT NULL))
2454                      OR
2455                      (UAI2.ATTR_VALUE_NUM IS NOT NULL AND
2456                       (UAI2.ATTR_VALUE_STR IS NOT NULL OR
2457                        UAI2.ATTR_VALUE_DATE IS NOT NULL))
2458                      OR
2459                      (UAI2.ATTR_VALUE_DATE IS NOT NULL AND
2460                       (UAI2.ATTR_VALUE_NUM IS NOT NULL OR
2461                        UAI2.ATTR_VALUE_STR IS NOT NULL))))'
2462     USING p_data_set_id, p_attr_group_type, p_data_set_id;
2463 
2464     code_debug(' After validations for G_PS_MULTIPLE_VALUES',1);
2465 
2466     ---------------------------------------------------------------------
2467     -- Mark as errors all logical Attribute Group rows for which there --
2468     -- is no association of the Attribute Group to any of the related  --
2469     -- classification codes (as defined by the passed-in query), or    --
2470     -- for which the logical Attribute Group row is not passed in at   --
2471     -- the correct data level for the association (e.g., if the object --
2472     -- is 'EGO_ITEM' and the row is being passed in with a REVISION_ID --
2473     -- value for an Attribute Group associated at the Item level)      --
2474     ---------------------------------------------------------------------
2475     l_dynamic_sql :=
2476     'UPDATE '||p_interface_table_name||' UAI1
2477         SET UAI1.PROCESS_STATUS = UAI1.PROCESS_STATUS + '||G_PS_AG_NOT_ASSOCIATED||'
2478       WHERE UAI1.DATA_SET_ID = :data_set_id
2479         AND UAI1.ATTR_GROUP_TYPE = :attr_group_type
2480         AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
2481         AND UAI1.ROW_IDENTIFIER IN
2482             (SELECT DISTINCT UAI2.ROW_IDENTIFIER
2483                FROM '||p_interface_table_name||' UAI2
2484               WHERE UAI2.DATA_SET_ID = :data_set_id
2485                 -- AND UAI2.DATA_SET_ID = UAI1.DATA_SET_ID -- Commenting for Bug 9336604
2486                 AND UAI2.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
2487                 AND NOT EXISTS (SELECT NULL
2488                                   FROM EGO_OBJ_AG_ASSOCS_B      A
2489                                  WHERE A.ATTR_GROUP_ID = UAI2.ATTR_GROUP_ID
2490                                    AND A.OBJECT_ID =  '||l_object_id||'
2491                                    AND A.CLASSIFICATION_CODE IN ('||p_related_class_codes_query||')';
2492 --R12C
2493 
2494     IF(l_data_level_col_exists) THEN
2495 
2496       l_dynamic_sql := l_dynamic_sql||' AND NVL(A.DATA_LEVEL_ID,-1) = NVL(UAI2.DATA_LEVEL_ID,-1) ';
2497 
2498       l_dummy := 0;
2499       FOR i IN l_list_of_dl_for_ag_type.FIRST .. l_list_of_dl_for_ag_type.LAST
2500       LOOP
2501         IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 <> 'NONE') THEN
2502 
2503           l_dummy := l_dummy+1;
2504           IF(l_dummy = 1) THEN
2505             l_dynamic_sql := l_dynamic_sql ||' AND (( ';
2506           ELSE
2507             l_dynamic_sql := l_dynamic_sql ||' OR  (  ';
2508           END IF;
2509           l_dynamic_sql := l_dynamic_sql || '           UAI2.DATA_LEVEL_ID = '||l_list_of_dl_for_ag_type(i).DATA_LEVEL_ID
2510                                          || '           AND UAI2.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1||' IS NOT NULL ';
2511         ELSE
2512           l_dummy := l_dummy+1;
2513           IF(l_dummy = 1) THEN
2514             l_dynamic_sql := l_dynamic_sql ||' AND (( ';
2515           ELSE
2516             l_dynamic_sql := l_dynamic_sql ||' OR  (  ';
2517           END IF;
2518             l_dynamic_sql := l_dynamic_sql || '           UAI2.DATA_LEVEL_ID = '||l_list_of_dl_for_ag_type(i).DATA_LEVEL_ID||'  ';
2519 
2520         END IF;
2521 
2522         IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2 <> 'NONE') THEN
2523              l_dynamic_sql := l_dynamic_sql || '          AND UAI2.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2||' IS NOT NULL ';
2524         END IF;
2525 
2526         IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3 <> 'NONE') THEN
2527              l_dynamic_sql := l_dynamic_sql || '          AND UAI2.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3||' IS NOT NULL ';
2528         END IF;
2529         IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4 <> 'NONE') THEN
2530              l_dynamic_sql := l_dynamic_sql || '          AND UAI2.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4||' IS NOT NULL ';
2531         END IF;
2532         IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5 <> 'NONE') THEN
2533              l_dynamic_sql := l_dynamic_sql || '          AND UAI2.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5||' IS NOT NULL ';
2534         END IF;
2535 
2536         --IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 <> 'NONE') THEN
2537            l_dynamic_sql := l_dynamic_sql ||' ) ';
2538         --END IF;
2539 
2540       END LOOP;
2541 
2542         l_dynamic_sql := l_dynamic_sql ||' ) ';
2543     END IF;
2544 --R12C end
2545 
2546     IF (l_num_data_level_columns = 1 AND NOT l_data_level_col_exists) THEN
2547       l_dynamic_sql := l_dynamic_sql||
2548                        ' AND  ((A.DATA_LEVEL = '''||l_data_level_1||'''
2549                                     AND UAI2.'||l_data_level_column_1||' IS NOT NULL )
2550                                OR
2551                                    (     A.DATA_LEVEL <> '''||l_data_level_1||'''
2552                                      AND UAI2.'||l_data_level_column_1||' IS NULL) )';
2553 
2554     ELSIF (l_num_data_level_columns = 2 AND NOT l_data_level_col_exists) THEN
2555       l_dynamic_sql := l_dynamic_sql||
2556                        ' AND  (   (     A.DATA_LEVEL = '''||l_data_level_2||'''
2557                                     AND UAI2.'||l_data_level_column_1||' IS NOT NULL
2558                                     AND UAI2.'||l_data_level_column_2||' IS NOT NULL )
2559                                OR
2560                                   (     A.DATA_LEVEL = '''||l_data_level_1||'''
2561                                     AND UAI2.'||l_data_level_column_1||' IS NOT NULL
2562                                     AND UAI2.'||l_data_level_column_2||' IS NULL )
2563                                OR
2564                                   (     A.DATA_LEVEL <> '''||l_data_level_1||'''
2565                                     AND A.DATA_LEVEL <> '''||l_data_level_2||'''
2566                                     AND UAI2.'||l_data_level_column_1||' IS NULL
2567                                     AND UAI2.'||l_data_level_column_2||' IS NULL ))';
2568 
2569     ELSIF (l_num_data_level_columns = 3 AND NOT l_data_level_col_exists) THEN
2570       l_dynamic_sql := l_dynamic_sql||
2571 
2572                        ' AND  (   (     A.DATA_LEVEL = '''||l_data_level_3||'''
2573                                     AND UAI2.'||l_data_level_column_1||' IS NOT NULL
2574                                     AND UAI2.'||l_data_level_column_2||' IS NOT NULL
2575                                     AND UAI2.'||l_data_level_column_3||' IS NOT NULL )
2576                                OR
2577                                   (     A.DATA_LEVEL = '''||l_data_level_2||'''
2578                                     AND UAI2.'||l_data_level_column_1||' IS NOT NULL
2579                                     AND UAI2.'||l_data_level_column_2||' IS NOT NULL
2580                                     AND UAI2.'||l_data_level_column_3||' IS NULL )
2581                                OR
2582                                   (     A.DATA_LEVEL = '''||l_data_level_1||'''
2583                                     AND UAI2.'||l_data_level_column_1||' IS NOT NULL
2584                                     AND UAI2.'||l_data_level_column_2||' IS NULL
2585                                     AND UAI2.'||l_data_level_column_3||' IS NULL )
2586 
2587                                OR
2588                                   (     A.DATA_LEVEL <> '''||l_data_level_1||'''
2589                                     AND A.DATA_LEVEL <> '''||l_data_level_2||'''
2590                                     AND A.DATA_LEVEL <> '''||l_data_level_3||'''
2591                                     AND UAI2.'||l_data_level_column_1||' IS NULL
2592                                     AND UAI2.'||l_data_level_column_2||' IS NULL
2593                                     AND UAI2.'||l_data_level_column_3||' IS NULL ))';
2594 
2595     END IF;
2596     IF(l_data_level_col_exists) THEN
2597       l_dynamic_sql := l_dynamic_sql||'))';
2598     ELSE
2599       l_dynamic_sql := l_dynamic_sql||'))';
2600     END IF;
2601     code_debug('before the assoc chk sql');
2602     code_debug(l_dynamic_sql);
2603 
2604     EXECUTE IMMEDIATE l_dynamic_sql
2605     USING p_data_set_id, p_attr_group_type, p_data_set_id;
2606 
2607     code_debug(' After validations for G_PS_AG_NOT_ASSOCIATED',1);
2608     code_debug(' The sql for validation for G_PS_AG_NOT_ASSOCIATED sql is :'||l_dynamic_sql,3);
2609     ---------------------------------------------------------------------
2610     -- Mark the rows having inappropriate non-SYNC transaction_types   --
2611     -- for that attr grp in the destination table as errored           --
2612     -- In the TRANSACTION_TYPE processing we assume that for multi-row --
2613     -- attr grps the user has provided all the necessary UK's and the  --
2614     -- user cannot update the UK values                                --
2615     ---------------------------------------------------------------------
2616 
2617     -- Bug 9336604 : Start - Commenting the below code
2618     /*
2619     l_dynamic_sql :=
2620     ' UPDATE '||p_interface_table_name||' UAI1
2621          SET UAI1.PROCESS_STATUS = PROCESS_STATUS +
2622                                    DECODE(UAI1.TRANSACTION_TYPE,
2623                                           '''||EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||''', '||G_PS_BAD_TTYPE_CREATE||',
2624                                           '''||EGO_USER_ATTRS_DATA_PVT.G_UPDATE_MODE||''', '||G_PS_BAD_TTYPE_UPDATE||',
2625                                           '''||EGO_USER_ATTRS_DATA_PVT.G_DELETE_MODE||''', '||G_PS_BAD_TTYPE_DELETE||')
2626        WHERE UAI1.DATA_SET_ID = :data_set_id
2627          AND UAI1.ATTR_GROUP_TYPE = :attr_group_type
2628          AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
2629          AND UAI1.TRANSACTION_TYPE <> '''||EGO_USER_ATTRS_DATA_PVT.G_SYNC_MODE||'''
2630          AND (SELECT MULTI_ROW FROM EGO_FND_DSC_FLX_CTX_EXT FLX_EXT
2631               WHERE DESCRIPTIVE_FLEX_CONTEXT_CODE = UAI1.ATTR_GROUP_INT_NAME
2632                 AND APPLICATION_ID = '||p_application_id||'
2633                 AND DESCRIPTIVE_FLEXFIELD_NAME = '''||p_attr_group_type||''') <> ''Y''
2634      AND UAI1.ROW_IDENTIFIER IN (
2635              SELECT DISTINCT UAI2.ROW_IDENTIFIER
2636                FROM '||p_interface_table_name||' UAI2
2637               WHERE UAI2.DATA_SET_ID = :data_set_id
2638                 AND UAI2.PROCESS_STATUS = '||G_PS_IN_PROCESS;
2639 
2640     */ -- Bug 9336604 : End
2641 
2642     l_ext_table_select :=
2643     '(SELECT COUNT(*)
2644         FROM '||l_ext_vl_name||'
2645        WHERE ATTR_GROUP_ID = UAI2.ATTR_GROUP_ID
2646          AND ROWNUM < 2 ';
2647 
2648     l_ext_table_select := l_ext_table_select ||l_concat_pk_cols_UAI2;
2649 
2650     /*
2651     IF (l_pk1_column_name IS NOT NULL) THEN
2652       l_ext_table_select := l_ext_table_select || ' AND '||l_pk1_column_name||' = UAI2.'||l_pk1_column_name;
2653     END IF;
2654     IF (l_pk2_column_name IS NOT NULL) THEN
2655       l_ext_table_select := l_ext_table_select || ' AND '||l_pk2_column_name||' = UAI2.'||l_pk2_column_name;
2656     END IF;
2657     IF (l_pk3_column_name IS NOT NULL) THEN
2658       l_ext_table_select := l_ext_table_select || ' AND '||l_pk3_column_name||' = UAI2.'||l_pk3_column_name;
2659     END IF;
2660     IF (l_pk4_column_name IS NOT NULL) THEN
2661       l_ext_table_select := l_ext_table_select || ' AND '||l_pk4_column_name||' = UAI2.'||l_pk4_column_name;
2662     END IF;
2663     IF (l_pk5_column_name IS NOT NULL) THEN
2664       l_ext_table_select := l_ext_table_select || ' AND '||l_pk5_column_name||' = UAI2.'||l_pk5_column_name;
2665     END IF;
2666 
2667     --add dl check to the sql
2668 --R12C
2669     IF(l_data_level_col_exists) THEN
2670 
2671       l_ext_table_select := l_ext_table_select||' AND NVL(DATA_LEVEL_ID,-1) = NVL(UAI2.DATA_LEVEL_ID,-1) ';
2672       l_dummy := 0;
2673       FOR i IN l_list_of_dl_for_ag_type.FIRST .. l_list_of_dl_for_ag_type.LAST
2674       LOOP
2675         IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 <> 'NONE') THEN
2676           l_dummy := l_dummy+1;
2677           IF(l_dummy = 1) THEN
2678             l_ext_table_select := l_ext_table_select ||' AND (( ';
2679           ELSE
2680           l_ext_table_select := l_ext_table_select ||' OR  (  ';
2681           END IF;
2682           l_ext_table_select := l_ext_table_select || '           UAI2.DATA_LEVEL_ID = '||l_list_of_dl_for_ag_type(i).DATA_LEVEL_ID
2683                                            || '          AND '||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1||' = UAI2.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1;
2684         END IF;
2685 
2686         IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2 <> 'NONE') THEN
2687              l_ext_table_select := l_ext_table_select || '          AND '||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2||' = UAI2.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2;
2688         END IF;
2689 
2690         IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3 <> 'NONE') THEN
2691              l_ext_table_select := l_ext_table_select ||'           AND '||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3||' = UAI2.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3;
2692         END IF;
2693         IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4 <> 'NONE') THEN
2694              l_ext_table_select := l_ext_table_select || '          AND '||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4||' = UAI2.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4;
2695         END IF;
2696         IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5 <> 'NONE') THEN
2697              l_ext_table_select := l_ext_table_select || '          AND '||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5||' = UAI2.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5;
2698         END IF;
2699 
2700         IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 <> 'NONE') THEN
2701            l_ext_table_select := l_ext_table_select ||' ) ';
2702         END IF;
2703       END LOOP;
2704       l_ext_table_select := l_ext_table_select ||' ) ';
2705       --R12C end
2706     ELSE
2707 
2708       IF (l_num_data_level_columns = 1) THEN
2709         l_ext_table_select := l_ext_table_select || ' AND NVL('||l_data_level_column_1||',-1) = NVL(UAI2.'||l_data_level_column_1||',-1 )';
2710 
2711       ELSIF (l_num_data_level_columns = 2) THEN
2712         l_ext_table_select := l_ext_table_select || ' AND NVL('||l_data_level_column_1||',-1) = NVL(UAI2.'||l_data_level_column_1||',-1 )';
2713         l_ext_table_select := l_ext_table_select || ' AND NVL('||l_data_level_column_2||',-1) = NVL(UAI2.'||l_data_level_column_2||',-1 )';
2714 
2715       ELSIF (l_num_data_level_columns = 3) THEN
2716         l_ext_table_select := l_ext_table_select || ' AND NVL('||l_data_level_column_1||',-1) = NVL(UAI2.'||l_data_level_column_1||',-1 )';
2717         l_ext_table_select := l_ext_table_select || ' AND NVL('||l_data_level_column_2||',-1) = NVL(UAI2.'||l_data_level_column_2||',-1 )';
2718         l_ext_table_select := l_ext_table_select || ' AND NVL('||l_data_level_column_3||',-1) = NVL(UAI2.'||l_data_level_column_3||',-1 )';
2719       END IF;
2720     END IF; --l_data_level_col_exists
2721     */
2722     l_ext_table_select := l_ext_table_select||')';
2723 
2724     -- Bug 9336604 : Start
2725     l_dynamic_sql :=
2726     'DECLARE
2727       l_row_ids   dbms_sql.number_table;
2728       BEGIN
2729         SELECT DISTINCT UAI2.ROW_IDENTIFIER
2730         BULK COLLECT INTO l_row_ids
2731       FROM '||p_interface_table_name||' UAI2
2732       WHERE UAI2.DATA_SET_ID = :data_set_id
2733         AND UAI2.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
2734         AND '||l_ext_table_select||'
2735                   = DECODE(UAI2.TRANSACTION_TYPE,
2736                           '''||EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||''', 1,
2737                           '''||EGO_USER_ATTRS_DATA_PVT.G_UPDATE_MODE||''', 0,
2738                           '''||EGO_USER_ATTRS_DATA_PVT.G_DELETE_MODE||''', 0); '||
2739       '
2740       IF (l_row_ids.Count > 0) THEN
2741         FORALL i in l_row_ids.FIRST .. l_row_ids.LAST
2742           UPDATE '||p_interface_table_name||' UAI1
2743             SET UAI1.PROCESS_STATUS = PROCESS_STATUS +
2744                                     DECODE(UAI1.TRANSACTION_TYPE,
2745                                             '''||EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||''', '||G_PS_BAD_TTYPE_CREATE||',
2746                                             '''||EGO_USER_ATTRS_DATA_PVT.G_UPDATE_MODE||''', '||G_PS_BAD_TTYPE_UPDATE||',
2747                                             '''||EGO_USER_ATTRS_DATA_PVT.G_DELETE_MODE||''', '||G_PS_BAD_TTYPE_DELETE||')
2748           WHERE UAI1.DATA_SET_ID = '||p_data_set_id||'
2749             AND UAI1.ATTR_GROUP_TYPE = '''||p_attr_group_type||'''
2750             AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
2751             AND UAI1.TRANSACTION_TYPE <> '''||EGO_USER_ATTRS_DATA_PVT.G_SYNC_MODE||'''
2752             AND (SELECT MULTI_ROW FROM EGO_FND_DSC_FLX_CTX_EXT FLX_EXT
2753                 WHERE DESCRIPTIVE_FLEX_CONTEXT_CODE = UAI1.ATTR_GROUP_INT_NAME
2754                   AND APPLICATION_ID = '||p_application_id||'
2755                   AND DESCRIPTIVE_FLEXFIELD_NAME = '''||p_attr_group_type||''') <> ''Y''
2756           AND UAI1.ROW_IDENTIFIER = l_row_ids(i) AND (UAI1.ATTR_GROUP_TYPE <> '''||INV_EBI_UTIL.G_BOM_COMPONENTMGMT_GROUP||''' OR (UAI1.ATTR_GROUP_TYPE = '''||INV_EBI_UTIL.G_BOM_COMPONENTMGMT_GROUP||''' AND UAI1.TRANSACTION_TYPE <> '''||'CREATE'||'''));
2757       END IF;
2758     END;';
2759     -- Bug 14805652: In the upload phase for bom structure upload and the transaction type is CREATE, then will not update the UDA record as BAD_CREATE, because the UDA row will be inserted into database before this validation.
2760     -- Bug 9336604 : End
2761 
2762     -- Bug 9336604 : Start - Commenting
2763     /*
2764     l_dynamic_sql := l_dynamic_sql||' AND '||l_ext_table_select||
2765                      ' = DECODE(UAI2.TRANSACTION_TYPE,
2766                          '''||EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||''', 1,
2767                          '''||EGO_USER_ATTRS_DATA_PVT.G_UPDATE_MODE||''', 0,
2768                          '''||EGO_USER_ATTRS_DATA_PVT.G_DELETE_MODE||''', 0))';
2769     */
2770     -- Bug 9336604 : End - Commenting
2771 
2772     --------------------------------------------------------------------------
2773     -- We do the transaction_type validation only for user defined attributes,
2774     -- for developer defined attributes the trans type is updated to UPDATE
2775     -- and a dummy row is created in the production table before doing the DML.
2776     -- i.e., if l_ag_id_col_exists is FALSE
2777     -- For all developer defined attr rows the transaction type is updated to
2778     -- UPDATE.
2779     --------------------------------------------------------------------------
2780     IF (l_ag_id_col_exists) THEN
2781 
2782       -- Bug 9336604 : Start
2783       code_debug(l_dynamic_sql);
2784       EXECUTE IMMEDIATE l_dynamic_sql
2785       USING p_data_set_id;/*Fix for bug#9678667. Literal to bind*/
2786       -- Bug 9336604 : End
2787 
2788       -- Bug 9336604 : Start - Commenting
2789       /*
2790       code_debug(l_dynamic_sql);
2791 
2792       EXECUTE IMMEDIATE l_dynamic_sql
2793       USING p_data_set_id, p_attr_group_type, p_data_set_id;
2794       */
2795       -- Bug 9336604 : End - Commenting
2796 
2797       code_debug(' After validating the transaction type for Single Row AGs ',1);
2798       code_debug(' The sql for validating transaction type for SR AGs is :'||l_dynamic_sql,3);
2799 
2800     ELSE
2801 
2802      l_dynamic_sql :=
2803     ' UPDATE '||p_interface_table_name||' UAI1
2804          SET UAI1.PROCESS_STATUS = PROCESS_STATUS +
2805                                    DECODE(UAI1.TRANSACTION_TYPE,
2806                                           '''||EGO_USER_ATTRS_DATA_PVT.G_UPDATE_MODE||''', '||G_PS_BAD_TTYPE_UPDATE||',
2807                                           '''||EGO_USER_ATTRS_DATA_PVT.G_DELETE_MODE||''', '||G_PS_BAD_TTYPE_DELETE||')
2808        WHERE UAI1.DATA_SET_ID = :data_set_id
2809          AND UAI1.ATTR_GROUP_TYPE = :attr_group_type
2810          AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
2811          AND UAI1.TRANSACTION_TYPE <> '''||EGO_USER_ATTRS_DATA_PVT.G_SYNC_MODE||'''
2812          AND UAI1.TRANSACTION_TYPE <> '''||EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||'''
2813          AND (SELECT MULTI_ROW FROM EGO_FND_DSC_FLX_CTX_EXT FLX_EXT
2814               WHERE DESCRIPTIVE_FLEX_CONTEXT_CODE = UAI1.ATTR_GROUP_INT_NAME
2815                 AND APPLICATION_ID = '||p_application_id||'
2816                 AND DESCRIPTIVE_FLEXFIELD_NAME = :attr_group_type) <> ''Y''
2817          AND UAI1.ROW_IDENTIFIER IN (
2818              SELECT DISTINCT UAI2.ROW_IDENTIFIER
2819                FROM '||p_interface_table_name||' UAI2
2820               WHERE UAI2.DATA_SET_ID = :data_set_id
2821                 AND UAI2.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
2822                 AND (SELECT COUNT(*) FROM '|| l_ext_vl_name||'
2823                                     WHERE 1=1 '||l_concat_pk_cols_UAI2||'
2824                                       AND ROWNUM <2 ) =  DECODE(UAI2.TRANSACTION_TYPE,
2825                                                            '''||EGO_USER_ATTRS_DATA_PVT.G_UPDATE_MODE||''', 0,
2826                                                            '''||EGO_USER_ATTRS_DATA_PVT.G_DELETE_MODE||''', 0)
2827                                     )';
2828       EXECUTE IMMEDIATE l_dynamic_sql
2829       USING p_data_Set_id, p_attr_group_type, p_attr_group_type, p_data_Set_id ;
2830 
2831     END IF;
2832 
2833 /*
2834 DYLAN: is there a reason we need to do this SYNC -> CREATE/UPDATE switch
2835 here rather than after our initial validation loop?  If we did it there,
2836 we could use UKs and go for SR and MR all together.  Let's talk about
2837 this.
2838 */
2839     -------------------------------------------------------
2840     -- Update the transaction type column for single-row --
2841     -- Attr Group rows from SYNC to UPDATE or CREATE     --
2842     -------------------------------------------------------
2843 
2844     /* Bug 13414358 - Start */
2845     -- Modifed the query to use exists caluse for performance bug 13414358.
2846     l_ext_table_select1 :=
2847     '(SELECT 1
2848         FROM '||l_ext_b_table_name||'
2849        WHERE ATTR_GROUP_ID = UAI2.ATTR_GROUP_ID
2850          AND ROWNUM < 2 ';
2851 
2852     l_ext_table_select1 := l_ext_table_select1 ||l_concat_pk_cols_UAI2;
2853     l_ext_table_select1 := l_ext_table_select1||')';
2854     /* Bug 13414358 - End */
2855 
2856     IF (l_ag_id_col_exists) THEN
2857 
2858       l_dynamic_sql :=
2859       /* Bug 13414358 - Bug commenting the below query and modifying as below */
2860       /*
2861       ' UPDATE '||p_interface_table_name||' UAI2
2862           SET UAI2.TRANSACTION_TYPE = DECODE('||l_ext_table_select||
2863                                              ',0,'''||
2864                                              EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||''','''||
2865                                              EGO_USER_ATTRS_DATA_PVT.G_UPDATE_MODE||''')
2866         WHERE UAI2.DATA_SET_ID = :data_set_id
2867           AND UAI2.ATTR_GROUP_TYPE = :attr_group_type
2868           AND UAI2.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
2869           AND UAI2.TRANSACTION_TYPE = '''||EGO_USER_ATTRS_DATA_PVT.G_SYNC_MODE||'''
2870           AND (SELECT MULTI_ROW FROM EGO_FND_DSC_FLX_CTX_EXT FLX_EXT
2871                 WHERE DESCRIPTIVE_FLEX_CONTEXT_CODE = UAI2.ATTR_GROUP_INT_NAME
2872                   AND APPLICATION_ID = :application_id
2873                   AND DESCRIPTIVE_FLEXFIELD_NAME = :attr_group_type) <> ''Y'' ';
2874       */ -- Tesco - Bug Commenting Done
2875 
2876       /* Bug 13414358 - Start */
2877       ' UPDATE '||p_interface_table_name||' UAI2
2878           SET UAI2.TRANSACTION_TYPE = Nvl(( SELECT '''||EGO_USER_ATTRS_DATA_PVT.G_UPDATE_MODE||'''
2879                                             FROM   DUAL
2880                                             WHERE EXISTS '||l_ext_table_select1||
2881                                            '), '''||EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||''')
2882         WHERE UAI2.DATA_SET_ID = :data_set_id
2883           AND UAI2.ATTR_GROUP_TYPE = :attr_group_type
2884           AND UAI2.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
2885           AND UAI2.TRANSACTION_TYPE = '''||EGO_USER_ATTRS_DATA_PVT.G_SYNC_MODE||'''
2886           AND (SELECT MULTI_ROW FROM EGO_FND_DSC_FLX_CTX_EXT FLX_EXT
2887                 WHERE DESCRIPTIVE_FLEX_CONTEXT_CODE = UAI2.ATTR_GROUP_INT_NAME
2888                   AND APPLICATION_ID = :application_id
2889                   AND DESCRIPTIVE_FLEXFIELD_NAME = :attr_group_type) <> ''Y'' ';
2890       /* Bug 13414358 - End */
2891 
2892       --ER 9489112, do not convert SYNC to CREATE/UPDATE for item rev level Single Row UDA when change order be created
2893       --Current UDA chanage be put in change order controll since rev level UDA will defaulted from
2894       --current revision when new revision created in java code. For this case, rev level UDA defauled when the new revision
2895       --is created by change Service ChangeImportManager.createItemRevChangeMethodRequests.
2896       IF  l_data_level_col_exists  AND l_add_all_to_cm = 'Y' THEN
2897         l_dynamic_sql := l_dynamic_sql || ' AND NVL(UAI2.DATA_LEVEL_ID,'||G_NULL_TOKEN_NUM||') <> ' ||l_item_rev_dl_id ;
2898       END IF;
2899     ELSE
2900 
2901       l_dynamic_sql :=
2902       ' UPDATE '||p_interface_table_name||' UAI2
2903           SET UAI2.TRANSACTION_TYPE = DECODE((SELECT COUNT(*) FROM '|| l_ext_vl_name ||' WHERE 1=1 '||l_concat_pk_cols_UAI2||' AND ROWNUM<2 )'||
2904                                              ',0,'''||
2905                                              EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||''','''||
2906                                              EGO_USER_ATTRS_DATA_PVT.G_UPDATE_MODE||''')
2907         WHERE UAI2.DATA_SET_ID = :data_set_id
2908           AND UAI2.ATTR_GROUP_TYPE = :attr_group_type
2909           AND UAI2.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
2910           AND UAI2.TRANSACTION_TYPE = '''||EGO_USER_ATTRS_DATA_PVT.G_SYNC_MODE||'''
2911           AND (SELECT MULTI_ROW FROM EGO_FND_DSC_FLX_CTX_EXT FLX_EXT
2912                 WHERE DESCRIPTIVE_FLEX_CONTEXT_CODE = UAI2.ATTR_GROUP_INT_NAME
2913                   AND APPLICATION_ID = :application_id
2914                   AND DESCRIPTIVE_FLEXFIELD_NAME = :attr_group_type) <> ''Y'' ';
2915 
2916     END IF;
2917     code_debug(' After updating the transaction type for Single Row AGs ');
2918     code_debug(l_dynamic_sql);
2919    EXECUTE IMMEDIATE l_dynamic_sql
2920     USING p_data_set_id, p_attr_group_type, p_application_id, p_attr_group_type;
2921     l_dynamic_sql := ' ';
2922 
2923     code_debug(' After updating the transaction type for Single Row AGs ',1);
2924     code_debug(' The sql for updating transaction type for SR AGs is :'||l_dynamic_sql,3);
2925 
2926     -------------------------------------------------------------------------
2927     -- Update other attributes if at least one attribute is failed for
2928     -- all attr group
2929     -------------------------------------------------------------------------
2930      -- considering the G_PS_BAD_ATTR_OR_AG_METADATA is the starting point
2931      -- for the intermittent errors.
2932 
2933      /* Fix for bug#9678667 - Start */
2934      /*
2935       EXECUTE IMMEDIATE
2936             'UPDATE '||p_interface_table_name||' UAI1' ||
2937                 ' SET UAI1.PROCESS_STATUS = UAI1.PROCESS_STATUS + '||G_PS_OTHER_ATTRS_INVALID||
2938                 ' WHERE UAI1.DATA_SET_ID = '||p_data_set_id||
2939                 ' AND BITAND(PROCESS_STATUS,'||G_PS_OTHER_ATTRS_INVALID||') = 0'||
2940                 ' AND UAI1.ROW_IDENTIFIER  IN'||
2941                 '     (SELECT DISTINCT UAI2.ROW_IDENTIFIER'||
2942                 '        FROM '||p_interface_table_name||' UAI2'||
2943                 '        WHERE UAI2.DATA_SET_ID = '||p_data_set_id||
2944                 '         AND UAI2.PROCESS_STATUS >= '||G_PS_BAD_ATTR_OR_AG_METADATA ||
2945                 '         AND UAI2.ATTR_GROUP_INT_NAME = UAI1.ATTR_GROUP_INT_NAME)';
2946       */
2947 
2948       EXECUTE IMMEDIATE
2949             'UPDATE '||p_interface_table_name||' UAI1' ||
2950                 ' SET UAI1.PROCESS_STATUS = UAI1.PROCESS_STATUS + '||G_PS_OTHER_ATTRS_INVALID||
2951                 ' WHERE UAI1.DATA_SET_ID = :data_set_id '||
2952                 ' AND BITAND(PROCESS_STATUS,'||G_PS_OTHER_ATTRS_INVALID||') = 0'||
2953                 ' AND (UAI1.ROW_IDENTIFIER, UAI1.ATTR_GROUP_INT_NAME)  IN '||
2954                 '       (SELECT /*+ UNNEST CARDINALITY(UAI2,10) INDEX(UAI2,EGO_ITM_USR_ATTR_INTRFC_N3) */ '|| /* Bug 9678667 */
2955                 '           UAI2.ROW_IDENTIFIER, UAI2.ATTR_GROUP_INT_NAME '||
2956                 '        FROM '||p_interface_table_name||' UAI2'||
2957                 '        WHERE UAI2.DATA_SET_ID = :data_set_id '||
2958                 '           AND UAI2.PROCESS_STATUS >= '||G_PS_BAD_ATTR_OR_AG_METADATA ||
2959                 '      )'
2960       USING p_data_set_id, p_data_set_id;
2961       /* Fix for bug#9678667 - End */
2962 
2963 
2964 
2965                  --=============================--
2966                  -- ERRORING OUT OF FAILED ROWS --
2967                  --=============================--
2968 
2969     OPEN l_dynamic_dist_ag_cursor FOR
2970         ' SELECT /*+ use_concat index(UAI1,EGO_ITM_USR_ATTR_INTRFC_N3) */ /* Bug 9678667 */
2971             DISTINCT ATTR_GROUP_INT_NAME
2972             FROM '||p_interface_table_name||' UAI1
2973            WHERE DATA_SET_ID = :data_set_id
2974              AND (UAI1.PROCESS_STATUS < '||G_PS_IN_PROCESS||' OR UAI1.PROCESS_STATUS > '||G_PS_IN_PROCESS||')'  /* Bug 9678667 */
2975     USING p_data_set_id;
2976     LOOP
2977       FETCH l_dynamic_dist_ag_cursor INTO l_attr_group_intf_rec;
2978       EXIT WHEN l_dynamic_dist_ag_cursor%NOTFOUND;
2979 
2980       l_attr_group_metadata_obj := EGO_USER_ATTRS_COMMON_PVT.Get_Attr_Group_Metadata(
2981                                      p_attr_group_id   => NULL
2982                                     ,p_application_id  => p_application_id
2983                                     ,p_attr_group_type => p_attr_group_type
2984                                     ,p_attr_group_name => l_attr_group_intf_rec.ATTR_GROUP_INT_NAME
2985                                    );
2986 
2987       ----------------------------------------------------
2988       -- reporting of errors for all failed rows belonging
2989       -- to this attr grp.
2990       ----------------------------------------------------
2991       Log_Errors_Now(
2992         p_entity_id               => p_entity_id
2993        ,p_entity_index            => p_entity_index
2994        ,p_entity_code             => p_entity_code
2995        ,p_object_name             => p_object_name
2996        ,p_pk1_column_name         => l_pk1_column_name
2997        ,p_pk2_column_name         => l_pk2_column_name
2998        ,p_pk3_column_name         => l_pk3_column_name
2999        ,p_pk4_column_name         => l_pk4_column_name
3000        ,p_pk5_column_name         => l_pk5_column_name
3001        ,p_classification_col_name => l_class_code_column_name
3002        ,p_interface_table_name    => p_interface_table_name
3003        ,p_err_col_static_sql      => l_err_col_static_sql
3004        ,p_err_where_static_sql    => l_err_where_static_sql
3005        ,p_attr_grp_meta_obj       => l_attr_group_metadata_obj
3006        ,p_data_set_id             => p_data_set_id /*Fix for bug#9678667. Literal to bind*/
3007       );
3008 
3009     END LOOP;
3010     -- Bug : 4099546
3011     CLOSE l_dynamic_dist_ag_cursor;
3012     --------------------------------------------------
3013     -- MARKING ALL THE ROWS AS 3 WHICH HAVE ERRORED --
3014     --------------------------------------------------
3015     --considering the G_PS_BAD_ATTR_OR_AG_METADATA is the starting point for the intermittent errors.
3016     l_dynamic_sql :=
3017         'UPDATE /*+ INDEX(UAI1,EGO_ITM_USR_ATTR_INTRFC_N3) */ '||p_interface_table_name||' UAI1 '||
3018  /* Bug 9678667 */
3019         ' SET UAI1.PROCESS_STATUS =  '||G_PS_GENERIC_ERROR||
3020         ' WHERE UAI1.DATA_SET_ID = :data_set_id '||--p_data_set_id||
3021         ' AND UAI1.ROW_IDENTIFIER  IN '||
3022         '         (SELECT DISTINCT UAI2.ROW_IDENTIFIER'||
3023         '            FROM '||p_interface_table_name||' UAI2 '||
3024         '        WHERE UAI2.DATA_SET_ID = :data_set_id '||--p_data_set_id||
3025         '        AND UAI2.PROCESS_STATUS >= '||G_PS_BAD_ATTR_OR_AG_METADATA ||')';
3026     EXECUTE IMMEDIATE l_dynamic_sql
3027       USING p_data_set_id, p_data_set_id;/*Fix for bug#9678667. Literal to bind*/
3028 
3029     code_debug(' After error reporting and status updation of rows failed till now and before entering the attr levle validation loop',1);
3030 
3031   END IF; --*p_validate-IF-1*   Ending the IF for p_validate
3032                  --=============================--
3033                  -- ATTR-LEVEL LOOP VALIDATIONS --
3034                  --=============================--
3035 
3036     ----------------------------------------------------------------
3037     -- We will perform subsequent validations on a per-Attribute  --
3038     -- basis, so we open a dynamic cursor to process all still-   --
3039     -- valid lines in the data set; this cursor will have as many --
3040     -- rows as there are distinct Attributes in the data set      --
3041     ----------------------------------------------------------------
3042     -- Fix for bug#9336604
3043     -- Changed the index hint
3044     --bug 13873323, improve performance
3045     OPEN l_dynamic_cursor FOR
3046     'SELECT -- /*+ LEADING(A, EXT, UOM, FLX_EXT, DISTINCT_ATTRS,AG_DL) INDEX(FLX_EXT EGO_FND_DSC_FLX_CTX_EXT_U2) INDEX(a  FND_DESCR_FLEX_COL_USAGES_U2) USE_HASH(DISTINCT_ATTRS)*/
3047             -- /*+ LEADING(DISTINCT_ATTRS, FLX_EXT, A, EXT) */
3048       EXT.ATTR_ID,
3049             FLX_EXT.ATTR_GROUP_ID,
3050             DISTINCT_ATTRS.ATTR_GROUP_INT_NAME,
3051             FLX_EXT.MULTI_ROW              MULTI_ROW_CODE,
3052             A.END_USER_COLUMN_NAME         ATTR_INT_NAME,
3053             EXT.DATA_TYPE,
3054             EXT.UNIQUE_KEY_FLAG,
3055             A.DEFAULT_VALUE,
3056             VS.MAXIMUM_SIZE,
3057             A.REQUIRED_FLAG,
3058             VS.FLEX_VALUE_SET_ID VALUE_SET_ID,
3059             VS.VALIDATION_TYPE,
3060             VS.MINIMUM_VALUE,
3061             VS.MAXIMUM_VALUE,
3062             UOM.UOM_CODE,
3063             UOM.UOM_CLASS,
3064             DISTINCT_ATTRS.DATA_LEVEL_ID,
3065             FNV.FUNCTION_NAME              VIEW_PRIVILEGE,
3066             FNE.FUNCTION_NAME              EDIT_PRIVILEGE
3067        FROM (SELECT /*+ NO_MERGE */
3068                 DISTINCT ATTR_GROUP_INT_NAME, ATTR_GROUP_ID
3069                             ,ATTR_INT_NAME
3070                             ,DATA_LEVEL_ID
3071                FROM '||p_interface_table_name||'
3072               WHERE DATA_SET_ID = :data_set_id
3073                     AND ATTR_GROUP_TYPE = :attr_group_type
3074                     AND PROCESS_STATUS = '||G_PS_IN_PROCESS||') DISTINCT_ATTRS,
3075       EGO_FND_DSC_FLX_CTX_EXT        FLX_EXT,
3076             (SELECT application_id, descriptive_flexfield_name, descriptive_flex_context_code,
3077                  application_column_name, end_user_column_name, DEFAULT_VALUE,
3078                  required_flag, flex_value_set_id, column_seq_num
3079             FROM fnd_descr_flex_column_usages
3080            WHERE ''Y'' = enabled_flag
3081                  AND application_id IN (SELECT DISTINCT application_id
3082                                           FROM ego_fnd_dsc_flx_ctx_ext)) a,
3083             EGO_FND_DF_COL_USGS_EXT        EXT,
3084             EGO_ATTR_GROUP_DL              AG_DL,
3085             FND_FLEX_VALUE_SETS            VS,
3086             MTL_UNITS_OF_MEASURE           UOM,
3087             FND_FORM_FUNCTIONS             FNV,
3088             FND_FORM_FUNCTIONS             FNE
3089       WHERE DISTINCT_ATTRS.ATTR_GROUP_ID = FLX_EXT.ATTR_GROUP_ID
3090       AND flx_ext.application_id = ext.application_id
3091       AND flx_ext.descriptive_flexfield_name = ext.descriptive_flexfield_name
3092       AND flx_ext.descriptive_flex_context_code = ext.descriptive_flex_context_code
3093       --AND ''Y'' = a.enabled_flag
3094       AND a.application_id = flx_ext.application_id
3095       AND a.descriptive_flexfield_name = flx_ext.descriptive_flexfield_name
3096       AND a.descriptive_flex_context_code = flx_ext.descriptive_flex_context_code
3097       AND a.application_column_name = ext.application_column_name
3098       AND a.end_user_column_name = distinct_attrs.attr_int_name
3099       AND A.FLEX_VALUE_SET_ID = VS.FLEX_VALUE_SET_ID(+)
3100       AND EXT.UOM_CLASS = UOM.UOM_CLASS(+)
3101       AND ''Y'' = UOM.BASE_UOM_FLAG(+)
3102       AND AG_DL.ATTR_GROUP_ID = FLX_EXT.ATTR_GROUP_ID
3103       AND AG_DL.DATA_LEVEL_ID = DISTINCT_ATTRS.DATA_LEVEL_ID
3104       AND AG_DL.VIEW_PRIVILEGE_ID = FNV.FUNCTION_ID(+)
3105       AND AG_DL.EDIT_PRIVILEGE_ID = FNE.FUNCTION_ID(+)
3106       ORDER BY FLX_EXT.ATTR_GROUP_ID, A.COLUMN_SEQ_NUM'
3107     USING p_data_set_id, p_attr_group_type;
3108 
3109     -- Fix for bug#9336604
3110     --LOOP
3111     --  FETCH l_dynamic_cursor INTO l_attr_metadata_rec;
3112     --  EXIT WHEN l_dynamic_cursor%NOTFOUND;
3113     FETCH l_dynamic_cursor BULK COLLECT INTO l_attr_metadata_rec;
3114     CLOSE l_dynamic_cursor;
3115 
3116     /* bug 14672950 collection.FIRST will leads to an  exception when collection does not have
3117        records in it. It is safe to validate the size of the collection before
3118        traversing through it.*/
3119     IF l_attr_metadata_rec.Count > 0 THEN
3120     FOR l_var IN l_attr_metadata_rec.FIRST .. l_attr_metadata_rec.LAST
3121     LOOP
3122 
3123       code_debug('---------Inside the ATTR-LEVEL Validation loop: processing the attribute '||l_attr_metadata_rec(l_var).ATTR_INT_NAME||' in attribute group '||l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME,2);
3124 
3125       ------------------------------------------------------------
3126       -- First, we add this Attribute to our list of distinct   --
3127       -- Attributes in the data set for use in later processing --
3128       ------------------------------------------------------------
3129       l_dist_attr_in_data_set_rec.ATTR_GROUP_ID :=
3130         l_attr_metadata_rec(l_var).ATTR_GROUP_ID;
3131       l_dist_attr_in_data_set_rec.ATTR_INT_NAME :=
3132         l_attr_metadata_rec(l_var).ATTR_INT_NAME;
3133       l_dist_attr_in_data_set_rec.ATTR_GROUP_INT_NAME :=
3134         l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME;
3135       l_dist_attrs_in_data_set_table(l_dist_attrs_in_data_set_table.COUNT+1) :=
3136         l_dist_attr_in_data_set_rec;
3137 
3138       ------------------------------------------------------
3139       -- We do all the validations only if p_validate has --
3140       -- been passed as true to the API                   --
3141       ------------------------------------------------------
3142       IF (p_validate) THEN -- search for --*p_validate-IF-1.5*
3143 
3144         ------------------------------------------------
3145         -- We only want to check privileges for each  --
3146         -- Attribute Group when we first encounter it --
3147         ------------------------------------------------
3148         IF (l_prev_ag_id_priv IS NULL OR
3149             l_prev_ag_id_priv <> (l_attr_metadata_rec(l_var).ATTR_GROUP_ID||l_attr_metadata_rec(l_var).VIEW_PRIVILEGE||l_attr_metadata_rec(l_var).EDIT_PRIVILEGE)) THEN
3150 
3151           -------------------------------------------------------------
3152           -- We update this so that the check above won't pass again --
3153           -- until we begin processing for another attribute group   --
3154           -------------------------------------------------------------
3155           l_prev_ag_id_priv := l_attr_metadata_rec(l_var).ATTR_GROUP_ID||l_attr_metadata_rec(l_var).VIEW_PRIVILEGE||l_attr_metadata_rec(l_var).EDIT_PRIVILEGE;
3156 
3157           ---------------------------------------------------------
3158           -- If the caller passed a predicate API name, we will  --
3159           -- mark as errors all logical Attribute Group rows for --
3160           -- which the user does not have sufficient privileges  --
3161           ---------------------------------------------------------
3162           IF (p_privilege_predicate_api_name IS NOT NULL) THEN
3163             --Bug NO :6433569 start
3164       --Getting the view privilege corresponding to the data level Id, if tha array is not null
3165             IF ( p_default_dl_view_priv_list IS NOT NULL AND p_default_dl_view_priv_list.COUNT <>0) THEN
3166         FOR i IN 1 .. p_default_dl_view_priv_list.COUNT
3167         LOOP
3168           IF (p_default_dl_view_priv_list(i).NAME = l_attr_metadata_rec(l_var).DATA_LEVEL_ID)  THEN
3169             l_view_priv_to_check := NVL(l_attr_metadata_rec(l_var).VIEW_PRIVILEGE, p_default_dl_view_priv_list(i).VALUE);
3170           END IF;
3171         END LOOP;
3172       ELSE -- if the array is null or count is 0 then take the passed in view privilege.
3173               l_view_priv_to_check := NVL(l_attr_metadata_rec(l_var).VIEW_PRIVILEGE, p_default_view_privilege);
3174             END IF;
3175 
3176             --Getting the edit privilege corresponding to the data level Id, if tha array is not null
3177             IF ( p_default_dl_edit_priv_list IS NOT NULL AND p_default_dl_edit_priv_list.COUNT <>0) THEN
3178        FOR i IN 1 .. p_default_dl_edit_priv_list.COUNT
3179        LOOP
3180          IF (p_default_dl_edit_priv_list(i).NAME = l_attr_metadata_rec(l_var).DATA_LEVEL_ID)  THEN
3181            l_edit_priv_to_check := NVL(l_attr_metadata_rec(l_var).EDIT_PRIVILEGE, p_default_dl_edit_priv_list(i).VALUE);
3182          END IF;
3183        END LOOP;
3184       ELSE -- if the array is null or count is 0 then take the passed in edit privilege.
3185               l_edit_priv_to_check := NVL(l_attr_metadata_rec(l_var).EDIT_PRIVILEGE, p_default_edit_privilege);
3186             END IF;
3187 
3188             --shifting them to the else condition above.
3189             --l_view_priv_to_check := NVL(l_attr_metadata_rec(l_var).VIEW_PRIVILEGE, p_default_view_privilege);
3190             --l_edit_priv_to_check := NVL(l_attr_metadata_rec(l_var).EDIT_PRIVILEGE, p_default_edit_privilege);
3191             --Bug NO :6433569 end
3192 
3193             IF (l_view_priv_to_check IS NOT NULL OR
3194                 l_edit_priv_to_check IS NOT NULL) THEN
3195 
3196               -----------------------------------------------------------
3197               -- If we have not yet parsed the statement, we do so now --
3198               -- and keep the cursor open throughout our processing    --
3199               -----------------------------------------------------------
3200               IF (l_priv_func_cursor_id IS NULL) THEN
3201 
3202                 l_priv_func_cursor_id := DBMS_SQL.Open_Cursor;
3203                 l_dynamic_sql :=
3204                   'BEGIN '||
3205                   p_privilege_predicate_api_name||
3206                   '(:obj_name, :party_id, :priv_name, :table_alias, :predicate); END;';
3207 
3208                 DBMS_SQL.Parse(l_priv_func_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
3209 
3210                 --------------------------------------------------------------
3211                 -- These variables will not change across calls, so we only --
3212                 -- need to bind them the first time we parse the statement  --
3213                 --------------------------------------------------------------
3214                 DBMS_SQL.Bind_Variable(l_priv_func_cursor_id, ':obj_name', p_object_name);
3215                 DBMS_SQL.Bind_Variable(l_priv_func_cursor_id, ':party_id', G_HZ_PARTY_ID);
3216                 DBMS_SQL.Bind_Variable(l_priv_func_cursor_id, ':table_alias', 'UAI2');
3217                 DBMS_SQL.Bind_Variable(l_priv_func_cursor_id, ':predicate', l_priv_predicate, 32767);
3218 
3219               END IF;
3220 
3221               IF (l_view_priv_to_check IS NOT NULL) THEN
3222 
3223                 code_debug('          Checking for View privelege '||l_view_priv_to_check,2);
3224 
3225                 DBMS_SQL.Bind_Variable(l_priv_func_cursor_id, ':priv_name', l_view_priv_to_check);
3226                 l_dummy := DBMS_SQL.Execute(l_priv_func_cursor_id);
3227 
3228                 DBMS_SQL.Variable_Value(l_priv_func_cursor_id, ':predicate', l_priv_predicate);
3229 
3230                 code_debug('          The View privlege predicate is :'||l_priv_predicate,3);
3231 
3232                 ----------------------------------------------------------
3233                 -- We interpret a NULL predicate as a pass for the user --
3234                 ----------------------------------------------------------
3235                 IF (l_priv_predicate IS NULL) THEN
3236                   l_priv_predicate := '1=1';
3237                 END IF;
3238                 --------------------------------------------------------------
3239                 -- We needn't use DBMS_SQL here because this statement will --
3240                 -- change too much in each loop (because of the predicate)  --
3241                 -- for us to gain anything by keeping the cursor open       --
3242                 --------------------------------------------------------------
3243                 EXECUTE IMMEDIATE
3244                 'UPDATE '||p_interface_table_name||' UAI1
3245                     SET UAI1.PROCESS_STATUS = '||G_PS_NO_PRIVILEGES||'
3246                   WHERE UAI1.DATA_SET_ID = :p_data_set_id
3247                     AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
3248                     AND UAI1.ROW_IDENTIFIER IN
3249                         (
3250                          /* Fix for bug#9678667 - added below hint */
3251                          SELECT /*+ index(UAI2,EGO_ITM_USR_ATTR_INTRFC_N1) */
3252                                 DISTINCT UAI2.ROW_IDENTIFIER
3253                            FROM '||p_interface_table_name||' UAI2
3254                           WHERE UAI2.DATA_SET_ID = :p_data_set_id
3255                             AND UAI2.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
3256                             AND (UAI2.ATTR_GROUP_INT_NAME = :attr_group_name OR
3257                                  UAI2.ATTR_GROUP_ID = :attr_group_id)
3258                             AND NVL(UAI2.DATA_LEVEL_ID,-1) = NVL(:data_level_id,-1)
3259                             AND NOT '||l_priv_predicate||'
3260                         )'
3261                 USING p_data_set_id, p_data_set_id,
3262                       l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME,
3263                       l_attr_metadata_rec(l_var).ATTR_GROUP_ID,
3264                       l_attr_metadata_rec(l_var).DATA_LEVEL_ID;
3265 
3266               code_debug('          After validation for view privilege ',2);
3267               END IF;
3268 
3269               IF (l_edit_priv_to_check IS NOT NULL) THEN
3270 
3271                 code_debug('          Checking for Edit privelege '||l_edit_priv_to_check,2);
3272 
3273                 DBMS_SQL.Bind_Variable(l_priv_func_cursor_id, ':priv_name', l_edit_priv_to_check);
3274                 l_dummy := DBMS_SQL.Execute(l_priv_func_cursor_id);
3275                 DBMS_SQL.Variable_Value(l_priv_func_cursor_id, ':predicate', l_priv_predicate);
3276 
3277                 code_debug('          The Edit privlege predicate is :'||l_priv_predicate,3);
3278 
3279                 --------------------------------------------------------------
3280                 -- As above, we needn't use DBMS_SQL because the statement  --
3281                 -- changes too much in each loop (because of the predicate) --
3282                 -- for us to gain anything by keeping the cursor open       --
3283                 --------------------------------------------------------------
3284 
3285                 EXECUTE IMMEDIATE
3286                 'UPDATE '||p_interface_table_name||' UAI1
3287                     SET UAI1.PROCESS_STATUS = '||G_PS_NO_PRIVILEGES||'
3288                   WHERE UAI1.DATA_SET_ID = :p_data_set_id
3289                     AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
3290                     AND UAI1.ROW_IDENTIFIER IN
3291                         (
3292                          /* Fix for bug#9678667 - added below hint */
3293                          SELECT /*+ index(UAI2,EGO_ITM_USR_ATTR_INTRFC_N1) */
3294                                 DISTINCT UAI2.ROW_IDENTIFIER
3295                            FROM '||p_interface_table_name||' UAI2
3296                           WHERE UAI2.DATA_SET_ID = :p_data_set_id
3297                             AND UAI2.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
3298                             AND (UAI2.ATTR_GROUP_INT_NAME = :attr_group_name OR
3299                                  UAI2.ATTR_GROUP_ID = :attr_group_id)
3300                             AND NVL(UAI2.DATA_LEVEL_ID,-1) = NVL(:data_level_id,-1)
3301                             AND NOT '||l_priv_predicate||'
3302                         )'
3303                 USING p_data_set_id, p_data_set_id,
3304                       l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME,
3305                       l_attr_metadata_rec(l_var).ATTR_GROUP_ID,
3306                       l_attr_metadata_rec(l_var).DATA_LEVEL_ID;
3307 
3308                 code_debug('          After validation for edit privilege ',2);
3309 
3310               END IF;
3311             END IF;
3312           END IF;
3313         END IF;
3314 
3315 
3316         ------------------------------------------------------------------
3317         -- We would do rest of the validations only once per attribute  --
3318         -- It should not be repeated for every data level.              --
3319         ------------------------------------------------------------------
3320         IF(l_priv_attr_id <> l_attr_metadata_rec(l_var).ATTR_ID) THEN -- if not previously processed
3321 
3322            -----------------------------------------------------
3323            -- Validating, replacing the NULL characters here.
3324            -----------------------------------------------------
3325 
3326            EXECUTE IMMEDIATE 'SELECT TO_CHAR('||G_NULL_DATE_VAL||','''||EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT||'''), TO_CHAR('||G_NULL_DATE_VAL||', ''SYYYY-MM-DD'')  FROM DUAL '
3327            INTO l_null_date_time_value,l_null_date_value;
3328 
3329            l_dynamic_sql := 'UPDATE ';
3330            IF (l_attr_metadata_rec(l_var).DATA_TYPE = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
3331              l_dynamic_sql := l_dynamic_sql ||p_interface_table_name||' SET '||' ATTR_VALUE_NUM = DECODE(ATTR_DISP_VALUE, '''||G_NULL_NUM_VAL_STR||''', NULL, '''||G_NULL_CHAR_VAL||''', NULL, NULL, NULL, ATTR_VALUE_NUM) '||
3332                               ' ,ATTR_DISP_VALUE = DECODE(ATTR_DISP_VALUE, '''||G_NULL_NUM_VAL_STR||''', NULL, '''||G_NULL_CHAR_VAL||''', NULL, NULL, NULL, ATTR_DISP_VALUE) '||
3333                               ' ,PROCESS_STATUS = PROCESS_STATUS + DECODE (ATTR_DISP_VALUE,'''||G_NULL_NUM_VAL_STR||''', 0 , '''||G_NULL_CHAR_VAL||''', 0 , '||
3334                                                                                           ' NULL, 0 , '||G_PS_INVALID_NUMBER_DATA||' )'||
3335                               ' WHERE  DATA_SET_ID = :data_set_id              '||
3336                               ' AND PROCESS_STATUS = '||G_PS_IN_PROCESS||'     '||
3337                               ' AND ATTR_INT_NAME = :attr_int_name             '||
3338                               ' AND ATTR_GROUP_INT_NAME = :attr_group_int_name '||
3339                               ' AND ATTR_GROUP_TYPE = :attr_group_type         '||
3340                               ' AND ( ATTR_VALUE_NUM = :null_num               '||
3341                               '      OR ATTR_DISP_VALUE = :null_num_val_disp   '||
3342                               '      OR ATTR_DISP_VALUE = :null_num_disp       '||
3343                               '      OR ATTR_DISP_VALUE = :null_date_disp      '||
3344                               '      OR ATTR_DISP_VALUE = :null_date_val_disp  '||
3345                               '      OR ATTR_DISP_VALUE = :null_char_val)       ';
3346              EXECUTE IMMEDIATE l_dynamic_sql
3347              USING p_data_set_id, l_attr_metadata_rec(l_var).ATTR_INT_NAME, l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME,
3348                    p_attr_group_type, TO_NUMBER(G_NULL_NUM_VAL_STR),--bugFix:5297926
3349                    G_NULL_NUM_VAL_STR , G_NULL_NUM_VAL, G_NULL_DATE_VAL,l_null_date_time_value, G_NULL_CHAR_VAL;
3350 
3351            ELSIF (l_attr_metadata_rec(l_var).DATA_TYPE = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE
3352                   OR l_attr_metadata_rec(l_var).DATA_TYPE = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE) THEN
3353              l_dynamic_sql :=  l_dynamic_sql ||p_interface_table_name||' SET '||' ATTR_VALUE_DATE = DECODE(ATTR_DISP_VALUE, '''||l_null_date_time_value||''', NULL,'||
3354                               '                                            '''||l_null_date_value||''', NULL, '''||G_NULL_CHAR_VAL||''', NULL, NULL, NULL, ATTR_VALUE_DATE) '||
3355                               ' ,ATTR_DISP_VALUE = DECODE(ATTR_DISP_VALUE, '''||l_null_date_time_value||''', NULL, '||
3356                               '                                            '''||l_null_date_value||''',NULL, '''||G_NULL_CHAR_VAL||''', NULL, NULL, NULL, ATTR_DISP_VALUE) '||
3357                               ' ,PROCESS_STATUS = PROCESS_STATUS + DECODE (ATTR_DISP_VALUE,'''||l_null_date_time_value||''', 0 , '||
3358                                                                                           ' '''||l_null_date_value||''',0 , '''||G_NULL_CHAR_VAL||''', 0, '||
3359                                                                                           ' NULL, 0 , '||G_PS_INVALID_DATE_DATA||' )'||
3360                               ' WHERE  DATA_SET_ID = :data_set_id              '||
3361                               ' AND PROCESS_STATUS = '||G_PS_IN_PROCESS||'     '||
3362                               ' AND ATTR_INT_NAME = :attr_int_name             '||
3363                               ' AND ATTR_GROUP_INT_NAME = :attr_group_int_name '||
3364                               ' AND ATTR_GROUP_TYPE = :attr_group_type         '||
3365                               ' AND ( ATTR_VALUE_DATE = :null_date             '||
3366                               '      OR ATTR_DISP_VALUE = :null_num_val_disp   '||
3367                               '      OR ATTR_DISP_VALUE = :null_num_disp       '||
3368                               '      OR ATTR_DISP_VALUE = :null_date_disp      '||
3369                               '      OR ATTR_DISP_VALUE = :null_date_time_val_disp  '||
3370                               '      OR ATTR_DISP_VALUE = :null_date_val_disp  '||
3371                               '      OR ATTR_DISP_VALUE = :null_char_val)      ';
3372 
3373              EXECUTE IMMEDIATE l_dynamic_sql
3374              USING p_data_set_id, l_attr_metadata_rec(l_var).ATTR_INT_NAME, l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME,
3375                    p_attr_group_type, TO_DATE(l_null_date_time_value,EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT),
3376                    G_NULL_NUM_VAL_STR , G_NULL_NUM_VAL, G_NULL_DATE_VAL,l_null_date_time_value,l_null_date_value,G_NULL_CHAR_VAL;
3377 
3378            ELSE
3379               /* Fix for bug#9678667 - Added below hint */
3380              l_dynamic_sql := l_dynamic_sql ||' /*+ index(EGO_ITM_USR_ATTR_INTRFC, EGO_ITM_USR_ATTR_INTRFC_N1) */ ' ||p_interface_table_name||
3381                               ' SET '||' ATTR_VALUE_STR = NULL          '||
3382                               ' ,  ATTR_DISP_VALUE = NULL                      '||
3383                               ' WHERE  DATA_SET_ID = :data_set_id              '||
3384                               ' AND PROCESS_STATUS = '||G_PS_IN_PROCESS||'     '||
3385                               ' AND ATTR_INT_NAME = :attr_int_name             '||
3386                               ' AND ATTR_GROUP_INT_NAME = :attr_group_int_name '||
3387                               ' AND ATTR_GROUP_TYPE = :attr_group_type         '||
3388                               ' AND (ATTR_VALUE_STR = :null_str                '||
3389                               '     OR ATTR_DISP_VALUE = :null_char_val)       ';
3390 
3391              EXECUTE IMMEDIATE l_dynamic_sql
3392              USING p_data_set_id, l_attr_metadata_rec(l_var).ATTR_INT_NAME, l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME,
3393                    p_attr_group_type, G_NULL_CHAR_VAL,
3394                    G_NULL_CHAR_VAL;
3395 
3396            END IF;
3397 
3398 
3399 
3400 
3401            ----------------------------------------------------------------------------------
3402            -- UOM VALIDATIONS FOR NUMBER TYPE ATTRIBUTES HAVING A UOM CLASS DEFINED.
3403            ----------------------------------------------------------------------------------
3404            IF(l_attr_metadata_rec(l_var).UOM_CLASS IS NOT NULL) THEN
3405 
3406              ----------------------------------------------------------------------------------
3407              -- Here we validate the UOM column Display/internal value in the interface table
3408              ----------------------------------------------------------------------------------
3409              l_dynamic_sql :=
3410              'UPDATE '||p_interface_table_name||' INTF
3411                  SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_INVALID_UOM||'
3412                WHERE DATA_SET_ID = :data_set_id
3413                  AND PROCESS_STATUS = '||G_PS_IN_PROCESS||'
3414                  AND ATTR_INT_NAME = :attr_internal_name
3415                  AND ATTR_GROUP_INT_NAME = :attr_group_int_name
3416                  AND ( (ATTR_UOM_DISP_VALUE IS NOT NULL AND ATTR_VALUE_UOM IS NULL
3417                          AND NOT EXISTS (SELECT ''X'' FROM MTL_UNITS_OF_MEASURE_TL
3418                                           WHERE UOM_CLASS = :uom_class
3419                                             AND UNIT_OF_MEASURE_TL = INTF.ATTR_UOM_DISP_VALUE
3420                                             AND ROWNUM =1 ))
3421                       OR(ATTR_VALUE_UOM IS NOT NULL
3422                          AND NOT EXISTS (SELECT ''X'' FROM MTL_UNITS_OF_MEASURE_TL
3423                                           WHERE UOM_CLASS = :uom_class
3424                                             AND UOM_CODE = INTF.ATTR_VALUE_UOM
3425                                             AND ROWNUM =1 ))
3426                      )' ;
3427              EXECUTE IMMEDIATE l_dynamic_sql
3428              USING p_data_Set_id, l_attr_metadata_rec(l_var).ATTR_INT_NAME, l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME,
3429                    l_attr_metadata_rec(l_var).UOM_CLASS, l_attr_metadata_rec(l_var).UOM_CLASS;
3430 
3431              ----------------------------------------------
3432              -- Here we populate the internal UOM value
3433              ----------------------------------------------
3434              l_dynamic_sql :=
3435              'UPDATE '||p_interface_table_name||' INTF
3436                  SET ATTR_VALUE_UOM = NVL2(ATTR_UOM_DISP_VALUE,
3437                                            (SELECT UOM_CODE FROM MTL_UNITS_OF_MEASURE_TL
3438                                              WHERE UOM_CLASS = :uom_class
3439                                                AND UNIT_OF_MEASURE_TL = INTF.ATTR_UOM_DISP_VALUE
3440                                                AND LANGUAGE = USERENV(''LANG'')),null
3441                                           )
3442                WHERE DATA_SET_ID = :data_set_id
3443                  AND PROCESS_STATUS = '||G_PS_IN_PROCESS||'
3444                  AND ATTR_INT_NAME = :attr_internal_name
3445                  AND ATTR_GROUP_INT_NAME = :attr_group_int_name
3446                  AND ATTR_GROUP_TYPE = :attr_group_type
3447                  AND ATTR_VALUE_UOM IS NULL ';
3448 
3449              EXECUTE IMMEDIATE l_dynamic_sql
3450              USING l_attr_metadata_rec(l_var).UOM_CLASS, p_data_Set_id,
3451                    l_attr_metadata_rec(l_var).ATTR_INT_NAME, l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME,p_attr_group_type;
3452 
3453            END IF;
3454 
3455 
3456 
3457            -- 4043670 added for trans independent type value sets as well
3458            IF (l_attr_metadata_rec(l_var).VALIDATION_TYPE IN
3459                  (EGO_EXT_FWK_PUB.G_INDEPENDENT_VALIDATION_CODE, EGO_EXT_FWK_PUB.G_TRANS_IND_VALIDATION_CODE)
3460               ) THEN
3461 
3462            code_debug('          This attribute has an indipendednt value set, validating for value set id -'||l_attr_metadata_rec(l_var).VALUE_SET_ID ,2);
3463 
3464              IF (l_attr_metadata_rec(l_var).DATA_TYPE = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
3465                IF (l_ivs_num_cursor_id IS NULL) THEN
3466                  l_ivs_num_cursor_id := DBMS_SQL.Open_Cursor;
3467                  l_dynamic_sql :=
3468                  'UPDATE '||p_interface_table_name||'
3469                      SET ATTR_VALUE_NUM = TO_NUMBER((SELECT DISTINCT FLEX_VALUE
3470                                                            FROM FND_FLEX_VALUES_VL
3471                                                           WHERE ENABLED_FLAG = ''Y''
3472                                                             AND (NVL(START_DATE_ACTIVE, SYSDATE - 1) < SYSDATE)
3473                                                             AND (NVL(END_DATE_ACTIVE, SYSDATE + 1) > SYSDATE)
3474                                                             AND FLEX_VALUE_SET_ID = :value_set_id
3475                                                             AND (FLEX_VALUE_MEANING = ATTR_DISP_VALUE OR TO_NUMBER(FLEX_VALUE) = ATTR_VALUE_NUM))  /**bug 13589373**/
3476                                                          ),
3477                          PROCESS_STATUS = NVL2(ATTR_VALUE_NUM,-- IF THE ATTR VALUE IS NULL WE VALIDATE THE VS ACCORDING TO ATTR_DISP_VAL OTHERWISE VALIDATION IS AGAINST THE ATTR_VALUE_* TAKEN AS INTERNAL_NAME OF VS
3478                               (NVL2((SELECT DISTINCT FLEX_VALUE
3479                                        FROM FND_FLEX_VALUES_VL
3480                                       WHERE ENABLED_FLAG = ''Y''
3481                                         AND (NVL(START_DATE_ACTIVE, SYSDATE - 1) < SYSDATE)
3482                                         AND (NVL(END_DATE_ACTIVE, SYSDATE + 1) > SYSDATE)
3483                                         AND FLEX_VALUE_SET_ID = :value_set_id
3484                                         --AND FLEX_VALUE = TO_CHAR(ATTR_VALUE_NUM)),
3485                                         AND (TO_NUMBER(FLEX_VALUE) = ATTR_VALUE_NUM OR FLEX_VALUE_MEANING = ATTR_DISP_VALUE)),/*Bug:9735836,if number is decimal and less than 1,to char will remove "0" */
3486                                      (PROCESS_STATUS),
3487                                      (PROCESS_STATUS + '||G_PS_VALUE_NOT_IN_VS||'))
3488                               ),
3489                               (NVL2((SELECT DISTINCT FLEX_VALUE
3490                                        FROM FND_FLEX_VALUES_VL
3491                                       WHERE ENABLED_FLAG = ''Y''
3492                                         AND (NVL(START_DATE_ACTIVE, SYSDATE - 1) < SYSDATE)
3493                                         AND (NVL(END_DATE_ACTIVE, SYSDATE + 1) > SYSDATE)
3494                                         AND FLEX_VALUE_SET_ID = :value_set_id
3495                                         AND FLEX_VALUE_MEANING = ATTR_DISP_VALUE),
3496                                       (PROCESS_STATUS),
3497                                       (PROCESS_STATUS + '||G_PS_VALUE_NOT_IN_VS||'))
3498                               )
3499                              )
3500                    WHERE DATA_SET_ID = :data_set_id
3501                      AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
3502                      AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
3503                      AND ATTR_INT_NAME = :attr_int_name
3504                      AND (ATTR_DISP_VALUE IS NOT NULL OR ATTR_VALUE_NUM IS NOT NULL)
3505                      AND ATTR_GROUP_INT_NAME = :attr_group_int_name';
3506 
3507                  DBMS_SQL.Parse(l_ivs_num_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
3508 
3509                  -----------------------------------------------------------
3510                  -- Data set ID will not change across calls, so we only  --
3511                  -- need to bind it the first time we parse the statement --
3512                  -----------------------------------------------------------
3513                  DBMS_SQL.Bind_Variable(l_ivs_num_cursor_id, ':data_set_id', p_data_set_id);
3514 
3515                END IF;
3516                DBMS_SQL.Bind_Variable(l_ivs_num_cursor_id, ':value_set_id', l_attr_metadata_rec(l_var).VALUE_SET_ID);
3517                DBMS_SQL.Bind_Variable(l_ivs_num_cursor_id, ':attr_int_name', l_attr_metadata_rec(l_var).ATTR_INT_NAME);
3518                DBMS_SQL.Bind_Variable(l_ivs_num_cursor_id, ':attr_group_int_name', l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME);
3519                l_dummy := DBMS_SQL.Execute(l_ivs_num_cursor_id);
3520 
3521              ELSIF (l_attr_metadata_rec(l_var).DATA_TYPE = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE) THEN
3522                IF (l_ivs_date_cursor_id IS NULL) THEN
3523 
3524                  l_ivs_date_cursor_id := DBMS_SQL.Open_Cursor;
3525                  l_dynamic_sql :=
3526                  'UPDATE '||p_interface_table_name||'
3527                      SET ATTR_VALUE_DATE = (SELECT DISTINCT TRUNC(EGO_USER_ATTRS_BULK_PVT.Get_Date(FLEX_VALUE,'''||EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT||'''))
3528                                                               FROM FND_FLEX_VALUES_VL
3529                                                              WHERE ENABLED_FLAG = ''Y''
3530                                                                AND (NVL(START_DATE_ACTIVE, SYSDATE - 1) < SYSDATE)
3531                                                                AND (NVL(END_DATE_ACTIVE, SYSDATE + 1) > SYSDATE)
3532                                                                AND FLEX_VALUE_SET_ID = :value_set_id
3533                                                                AND (FLEX_VALUE_MEANING = ATTR_DISP_VALUE OR FLEX_VALUE = TO_CHAR(ATTR_VALUE_DATE,''YYYY-MM-DD HH24:MI:SS''))  /**bug 13589373**/
3534                                                             ),
3535                          PROCESS_STATUS = NVL2(ATTR_VALUE_DATE,-- IF THE ATTR VALUE IS NULL WE VALIDATE THE VS ACCORDING TO ATTR_DISP_VAL OTHERWISE VALIDATION IS AGAINST THE ATTR_VALUE_* TAKEN AS INTERNAL_NAME OF VS
3536                                                               (NVL2((SELECT DISTINCT FLEX_VALUE
3537                                                                      FROM FND_FLEX_VALUES_VL
3538                                                                      WHERE ENABLED_FLAG = ''Y''
3539                                                                      AND (NVL(START_DATE_ACTIVE, SYSDATE - 1) < SYSDATE)
3540                                                                      AND (NVL(END_DATE_ACTIVE, SYSDATE + 1) > SYSDATE)
3541                                                                      AND FLEX_VALUE_SET_ID = :value_set_id
3542                                                                      AND (FLEX_VALUE = TO_CHAR(ATTR_VALUE_DATE,''YYYY-MM-DD HH24:MI:SS'') OR FLEX_VALUE_MEANING = ATTR_DISP_VALUE)),
3543                                                                      (PROCESS_STATUS),
3544                                                                      (PROCESS_STATUS + '||G_PS_VALUE_NOT_IN_VS||'))
3545                                                               ),
3546                                                               (NVL2((SELECT DISTINCT FLEX_VALUE
3547                                                                      FROM FND_FLEX_VALUES_VL
3548                                                                      WHERE ENABLED_FLAG = ''Y''
3549                                                                      AND (NVL(START_DATE_ACTIVE, SYSDATE - 1) < SYSDATE)
3550                                                                      AND (NVL(END_DATE_ACTIVE, SYSDATE + 1) > SYSDATE)
3551                                                                      AND FLEX_VALUE_SET_ID = :value_set_id
3552                                                                      AND FLEX_VALUE_MEANING = ATTR_DISP_VALUE),
3553                                                                     (PROCESS_STATUS),
3554                                                                     (PROCESS_STATUS + '||G_PS_VALUE_NOT_IN_VS||'))
3555                                                               )
3556                                               )
3557                    WHERE DATA_SET_ID = :data_set_id
3558                      AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
3559                      AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
3560                      AND ATTR_INT_NAME = :attr_int_name
3561                      AND (ATTR_DISP_VALUE IS NOT NULL OR ATTR_VALUE_DATE IS NOT NULL)
3562                      AND ATTR_GROUP_INT_NAME = :attr_group_int_name';
3563 
3564                  DBMS_SQL.Parse(l_ivs_date_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
3565 
3566                  -----------------------------------------------------------
3567                  -- Data set ID will not change across calls, so we only  --
3568                  -- need to bind it the first time we parse the statement --
3569                  -----------------------------------------------------------
3570                  DBMS_SQL.Bind_Variable(l_ivs_date_cursor_id, ':data_set_id', p_data_set_id);
3571                END IF;
3572 
3573                DBMS_SQL.Bind_Variable(l_ivs_date_cursor_id, ':value_set_id', l_attr_metadata_rec(l_var).VALUE_SET_ID);
3574                DBMS_SQL.Bind_Variable(l_ivs_date_cursor_id, ':attr_int_name', l_attr_metadata_rec(l_var).ATTR_INT_NAME);
3575                DBMS_SQL.Bind_Variable(l_ivs_date_cursor_id, ':attr_group_int_name', l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME);
3576                l_dummy := DBMS_SQL.Execute(l_ivs_date_cursor_id);
3577 
3578              ELSIF (l_attr_metadata_rec(l_var).DATA_TYPE = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE) THEN
3579 
3580                IF (l_ivs_date_time_cursor_id IS NULL) THEN
3581 
3582                  l_ivs_date_time_cursor_id := DBMS_SQL.Open_Cursor;
3583                  l_dynamic_sql :=
3584                  'UPDATE '||p_interface_table_name||'
3585                      SET ATTR_VALUE_DATE = (EGO_USER_ATTRS_BULK_PVT.Get_Date(
3586                                                       (SELECT DISTINCT FLEX_VALUE
3587                                                          FROM FND_FLEX_VALUES_VL
3588                                                         WHERE ENABLED_FLAG = ''Y''
3589                                                           AND (NVL(START_DATE_ACTIVE, SYSDATE - 1) < SYSDATE)
3590                                                           AND (NVL(END_DATE_ACTIVE, SYSDATE + 1) > SYSDATE)
3591                                                           AND FLEX_VALUE_SET_ID = :value_set_id
3592                                                           AND (FLEX_VALUE_MEANING = ATTR_DISP_VALUE OR FLEX_VALUE = TO_CHAR(ATTR_VALUE_DATE,''YYYY-MM-DD HH24:MI:SS''))) /**bug 13589373**/
3593                                                      )
3594                                                  ),
3595                          PROCESS_STATUS = NVL2(ATTR_VALUE_DATE,-- IF THE ATTR VALUE IS NULL WE VALIDATE THE VS ACCORDING TO ATTR_DISP_VAL OTHERWISE VALIDATION IS AGAINST THE ATTR_VALUE_* TAKEN AS INTERNAL_NAME OF VS
3596                                                               (NVL2((SELECT DISTINCT FLEX_VALUE
3597                                                                      FROM FND_FLEX_VALUES_VL
3598                                                                      WHERE ENABLED_FLAG = ''Y''
3599                                                                      AND (NVL(START_DATE_ACTIVE, SYSDATE - 1) < SYSDATE)
3600                                                                      AND (NVL(END_DATE_ACTIVE, SYSDATE + 1) > SYSDATE)
3601                                                                      AND FLEX_VALUE_SET_ID = :value_set_id
3602                                                                      AND (FLEX_VALUE = TO_CHAR(ATTR_VALUE_DATE,''YYYY-MM-DD HH24:MI:SS'') OR FLEX_VALUE_MEANING = ATTR_DISP_VALUE)),
3603                                                                      (PROCESS_STATUS),
3604                                                                      (PROCESS_STATUS + '||G_PS_VALUE_NOT_IN_VS||'))
3605                                                               ),
3606                                                               (NVL2((SELECT DISTINCT FLEX_VALUE
3607                                                                      FROM FND_FLEX_VALUES_VL
3608                                                                      WHERE ENABLED_FLAG = ''Y''
3609                                                                      AND (NVL(START_DATE_ACTIVE, SYSDATE - 1) < SYSDATE)
3610                                                                      AND (NVL(END_DATE_ACTIVE, SYSDATE + 1) > SYSDATE)
3611                                                                      AND FLEX_VALUE_SET_ID = :value_set_id
3612                                                                      AND FLEX_VALUE_MEANING = ATTR_DISP_VALUE),
3613                                                                     (PROCESS_STATUS),
3614                                                                     (PROCESS_STATUS + '||G_PS_VALUE_NOT_IN_VS||'))
3615                                                               )
3616                                               )
3617                    WHERE DATA_SET_ID = :data_set_id
3618                      AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
3619                      AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
3620                      AND ATTR_INT_NAME = :attr_int_name
3621                      AND (ATTR_DISP_VALUE IS NOT NULL OR ATTR_VALUE_DATE IS NOT NULL)
3622                      AND ATTR_GROUP_INT_NAME = :attr_group_int_name';
3623 
3624                  DBMS_SQL.Parse(l_ivs_date_time_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
3625 
3626                  -----------------------------------------------------------
3627                  -- Data set ID will not change across calls, so we only  --
3628                  -- need to bind it the first time we parse the statement --
3629                  -----------------------------------------------------------
3630                  DBMS_SQL.Bind_Variable(l_ivs_date_time_cursor_id, ':data_set_id', p_data_set_id);
3631 
3632                END IF;
3633 
3634                DBMS_SQL.Bind_Variable(l_ivs_date_time_cursor_id, ':value_set_id', l_attr_metadata_rec(l_var).VALUE_SET_ID);
3635                DBMS_SQL.Bind_Variable(l_ivs_date_time_cursor_id, ':attr_int_name', l_attr_metadata_rec(l_var).ATTR_INT_NAME);
3636                DBMS_SQL.Bind_Variable(l_ivs_date_time_cursor_id, ':attr_group_int_name', l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME);
3637                l_dummy := DBMS_SQL.Execute(l_ivs_date_time_cursor_id);
3638 
3639              ELSE -- must be Char or Trans Text
3640 
3641                IF (l_ivs_char_cursor_id IS NULL) THEN
3642 
3643                  l_ivs_char_cursor_id := DBMS_SQL.Open_Cursor;
3644                  l_dynamic_sql :=
3645                  'UPDATE '||p_interface_table_name||'
3646                     SET ATTR_VALUE_STR =           (SELECT DISTINCT FLEX_VALUE
3647                                                            FROM FND_FLEX_VALUES_VL
3648                                                           WHERE ENABLED_FLAG = ''Y''
3649                                                             AND (NVL(START_DATE_ACTIVE, SYSDATE - 1) < SYSDATE)
3650                                                             AND (NVL(END_DATE_ACTIVE, SYSDATE + 1) > SYSDATE)
3651                                                             AND FLEX_VALUE_SET_ID = :value_set_id
3652                                                             AND (FLEX_VALUE_MEANING = ATTR_DISP_VALUE OR FLEX_VALUE = ATTR_VALUE_STR)  /**bug 13589373**/
3653                                                          ),
3654                          PROCESS_STATUS = NVL2(ATTR_VALUE_STR,-- IF THE ATTR VALUE IS NULL WE VALIDATE THE VS ACCORDING TO ATTR_DISP_VAL OTHERWISE VALIDATION IS AGAINST THE ATTR_VALUE_* TAKEN AS FLEX_VALUE OF VS
3655                                                               (NVL2((SELECT DISTINCT FLEX_VALUE
3656                                                                      FROM FND_FLEX_VALUES_VL
3657                                                                      WHERE ENABLED_FLAG = ''Y''
3658                                                                      AND (NVL(START_DATE_ACTIVE, SYSDATE - 1) < SYSDATE)
3659                                                                      AND (NVL(END_DATE_ACTIVE, SYSDATE + 1) > SYSDATE)
3660                                                                      AND FLEX_VALUE_SET_ID = :value_set_id
3661                                                                      AND (FLEX_VALUE = ATTR_VALUE_STR OR FLEX_VALUE_MEANING = ATTR_DISP_VALUE)),
3662                                                                      (PROCESS_STATUS),
3663                                                                      (PROCESS_STATUS + '||G_PS_VALUE_NOT_IN_VS||'))
3664                                                               ),
3665                                                               (NVL2((SELECT DISTINCT FLEX_VALUE
3666                                                                      FROM FND_FLEX_VALUES_VL
3667                                                                      WHERE ENABLED_FLAG = ''Y''
3668                                                                      AND (NVL(START_DATE_ACTIVE, SYSDATE - 1) < SYSDATE)
3669                                                                      AND (NVL(END_DATE_ACTIVE, SYSDATE + 1) > SYSDATE)
3670                                                                      AND FLEX_VALUE_SET_ID = :value_set_id
3671                                                                      AND FLEX_VALUE_MEANING = ATTR_DISP_VALUE),
3672                                                                     (PROCESS_STATUS),
3673                                                                     (PROCESS_STATUS + '||G_PS_VALUE_NOT_IN_VS||'))
3674                                                               )
3675                                               )
3676                    WHERE DATA_SET_ID = :data_set_id
3677                      AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
3678                      AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
3679                      AND ATTR_INT_NAME = :attr_int_name
3680                      AND (ATTR_DISP_VALUE IS NOT NULL OR ATTR_VALUE_STR IS NOT NULL)
3681                      AND ATTR_GROUP_INT_NAME = :attr_group_int_name';
3682 
3683                  DBMS_SQL.Parse(l_ivs_char_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
3684 
3685                  -----------------------------------------------------------
3686                  -- Data set ID will not change across calls, so we only  --
3687                  -- need to bind it the first time we parse the statement --
3688                  -----------------------------------------------------------
3689                  DBMS_SQL.Bind_Variable(l_ivs_char_cursor_id, ':data_set_id', p_data_set_id);
3690 
3691                END IF;
3692 
3693                DBMS_SQL.Bind_Variable(l_ivs_char_cursor_id, ':value_set_id', l_attr_metadata_rec(l_var).VALUE_SET_ID);
3694                DBMS_SQL.Bind_Variable(l_ivs_char_cursor_id, ':attr_int_name', l_attr_metadata_rec(l_var).ATTR_INT_NAME);
3695                DBMS_SQL.Bind_Variable(l_ivs_char_cursor_id, ':attr_group_int_name', l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME);
3696                l_dummy := DBMS_SQL.Execute(l_ivs_char_cursor_id);
3697 
3698              END IF;
3699            ELSIF (l_attr_metadata_rec(l_var).VALIDATION_TYPE = EGO_EXT_FWK_PUB.G_TABLE_VALIDATION_CODE) THEN
3700 
3701              ------------------------------------------------------------------------------------
3702              -- HERE WE UPDATE THE INTERFACE TABLE SETTING THE ATTR_VAL_(NUM/STR/DATE) COLUMNS --
3703              -- WITH VALUES FETCHED FROM THE TABLE FOR THE VALUE ENTERED AS DISPLAY VALUE i.e. --
3704              -- VALIDATION_TYPE='F' and logging errors for all logical AG rows that don't pass --
3705              ------------------------------------------------------------------------------------
3706              /*
3707                The TVS validation is shifted in the second loop
3708                do nothing over here
3709              */
3710              l_dynamic_sql := ' ';
3711 
3712            ELSE
3713 
3714            code_debug('          This attribute has a none value set, validating for before populating the attr_Value* columns from attr_disp_value column' ,2);
3715              ------------------------------------------------------------------------------------
3716              -- HERE WE UPDATE THE INTERFACE TABLE SETTING THE ATTR_VAL_(NUM/STR/DATE) COLUMNS --
3717              -- FROM ATTR_DISP_VALUE FOR ATTRS WITHOUT ANY VALUE SET *OR* WITH VALIDATION TYPE --
3718              -- ='N' (i.e., EGO_EXT_FWK_PUB.G_NONE_VALIDATION_CODE)                            --
3719              -- WE ALSO DO THE MAX/MIN VALIDATION IN THIS SEGMENT                              --
3720              ------------------------------------------------------------------------------------
3721              IF (l_attr_metadata_rec(l_var).DATA_TYPE = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
3722 
3723                IF (l_nvs_num_cursor_id is NULL) THEN
3724                  l_nvs_num_cursor_id := DBMS_SQL.Open_Cursor;
3725                  l_dynamic_sql :=
3726                  'UPDATE '||p_interface_table_name||'
3727                      SET ATTR_VALUE_NUM = DECODE(EGO_USER_ATTRS_BULK_PVT.Get_Datatype_Error_Val(ATTR_DISP_VALUE, :attr_datatype),0,NVL(TO_NUMBER(ATTR_DISP_VALUE),ATTR_VALUE_NUM),NULL),
3728                          PROCESS_STATUS = PROCESS_STATUS +
3729                                           EGO_USER_ATTRS_BULK_PVT.Get_Datatype_Error_Val(ATTR_DISP_VALUE, :attr_datatype) + --returns 0 if datatype conversion happens correctly
3730                                           EGO_USER_ATTRS_BULK_PVT.Get_Max_Min_Error_Val( NVL(ATTR_DISP_VALUE,ATTR_VALUE_NUM) * NVL((SELECT CONVERSION_RATE FROM MTL_UOM_CONVERSIONS
3731                                                                                                                                      WHERE UOM_CLASS = :uom_class AND UOM_CODE = ATTR_VALUE_UOM AND ROWNUM = 1),1),
3732                                                                                          :attr_datatype,
3733                                                                                          :attr_min_allowed_val,
3734                                                                                          :attr_max_allowed_val) --returns 0 if max/min is honoured or datatype conversion fails
3735                    WHERE DATA_SET_ID = :data_set_id
3736                      AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
3737                      AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
3738                      AND ATTR_INT_NAME = :attr_internal_name
3739                      AND ATTR_GROUP_INT_NAME = :attr_group_int_name
3740                      AND (ATTR_DISP_VALUE IS NOT NULL OR ATTR_VALUE_NUM IS NOT NULL)';
3741 
3742                  DBMS_SQL.Parse(l_nvs_num_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
3743                  DBMS_SQL.Bind_Variable(l_nvs_num_cursor_id, ':data_set_id', p_data_set_id);
3744 
3745                END IF;
3746                DBMS_SQL.Bind_Variable(l_nvs_num_cursor_id, ':uom_class', l_attr_metadata_rec(l_var).UOM_CLASS);
3747                DBMS_SQL.Bind_Variable(l_nvs_num_cursor_id, ':attr_datatype', l_attr_metadata_rec(l_var).DATA_TYPE);
3748                DBMS_SQL.Bind_Variable(l_nvs_num_cursor_id, ':attr_min_allowed_val', l_attr_metadata_rec(l_var).MINIMUM_VALUE);
3749                DBMS_SQL.Bind_Variable(l_nvs_num_cursor_id, ':attr_max_allowed_val', l_attr_metadata_rec(l_var).MAXIMUM_VALUE);
3750                DBMS_SQL.Bind_Variable(l_nvs_num_cursor_id, ':attr_internal_name', l_attr_metadata_rec(l_var).ATTR_INT_NAME);
3751                DBMS_SQL.Bind_Variable(l_nvs_num_cursor_id, ':attr_group_int_name', l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME);
3752 
3753                l_dummy := DBMS_SQL.Execute(l_nvs_num_cursor_id);
3754 
3755              ELSIF(l_attr_metadata_rec(l_var).DATA_TYPE = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE) THEN
3756 
3757                IF (l_nvs_date_cursor_id IS NULL) THEN
3758                  l_nvs_date_cursor_id := DBMS_SQL.Open_Cursor;
3759                  l_dynamic_sql :=
3760                  'UPDATE '||p_interface_table_name||'
3761                      SET ATTR_VALUE_DATE = TRUNC(NVL(EGO_USER_ATTRS_BULK_PVT.Get_Date(ATTR_DISP_VALUE),ATTR_VALUE_DATE)),--WE SHOULD REMOVE THE TIME PART FROM THE DATE IF DATATYPE IS NOT DATE TIME
3762                          PROCESS_STATUS = PROCESS_STATUS +
3763                                           EGO_USER_ATTRS_BULK_PVT.Get_Datatype_Error_Val(ATTR_DISP_VALUE, :attr_datatype) + --returns 0 if datatype conversion happens correctly
3764                                           EGO_USER_ATTRS_BULK_PVT.Get_Max_Min_Error_Val(NVL(ATTR_DISP_VALUE,ATTR_VALUE_DATE), :attr_datatype, :attr_min_allowed_val, :attr_max_allowed_val) --returns 0 if max/min is honoured or datatype conv fails
3765                    WHERE DATA_SET_ID = :data_set_id
3766                      AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
3767                      AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
3768                      AND ATTR_INT_NAME = :attr_internal_name
3769                      AND ATTR_GROUP_INT_NAME = :attr_group_int_name
3770                      AND (ATTR_DISP_VALUE IS NOT NULL OR ATTR_VALUE_DATE IS NOT NULL)';
3771 
3772                  DBMS_SQL.Parse(l_nvs_date_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
3773                  DBMS_SQL.Bind_Variable(l_nvs_date_cursor_id, ':data_set_id', p_data_set_id);
3774 
3775                END IF;
3776 
3777                DBMS_SQL.Bind_Variable(l_nvs_date_cursor_id, ':attr_datatype', l_attr_metadata_rec(l_var).DATA_TYPE);
3778                DBMS_SQL.Bind_Variable(l_nvs_date_cursor_id, ':attr_group_int_name', l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME);
3779                DBMS_SQL.Bind_Variable(l_nvs_date_cursor_id, ':attr_internal_name', l_attr_metadata_rec(l_var).ATTR_INT_NAME);
3780                DBMS_SQL.Bind_Variable(l_nvs_date_cursor_id, ':attr_min_allowed_val', l_attr_metadata_rec(l_var).MINIMUM_VALUE);
3781                DBMS_SQL.Bind_Variable(l_nvs_date_cursor_id, ':attr_max_allowed_val', l_attr_metadata_rec(l_var).MAXIMUM_VALUE);
3782                l_dummy := DBMS_SQL.Execute(l_nvs_date_cursor_id);
3783 
3784              ELSIF(l_attr_metadata_rec(l_var).DATA_TYPE = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE) THEN
3785 
3786                IF (l_nvs_datetime_cursor_id is NULL) THEN
3787                  l_nvs_datetime_cursor_id := DBMS_SQL.Open_Cursor;
3788                  l_dynamic_sql :=
3789                  'UPDATE '||p_interface_table_name||'
3790                      SET ATTR_VALUE_DATE = NVL(EGO_USER_ATTRS_BULK_PVT.Get_Date(ATTR_DISP_VALUE,'''||EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT||'''),ATTR_VALUE_DATE),
3791                          PROCESS_STATUS = PROCESS_STATUS +
3792                                           EGO_USER_ATTRS_BULK_PVT.Get_Datatype_Error_Val(ATTR_DISP_VALUE, :attr_datatype) + --returns 0 if datatype conversion happens correctly
3793                                           EGO_USER_ATTRS_BULK_PVT.Get_Max_Min_Error_Val(NVL(ATTR_DISP_VALUE,ATTR_VALUE_DATE), :attr_datatype, :attr_min_allowed_val, :attr_max_allowed_val) --returns 0 if max/min is honoured or datatype conv fails
3794                    WHERE DATA_SET_ID = :data_set_id
3795                      AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
3796                      AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
3797                      AND ATTR_INT_NAME = :attr_internal_name
3798                      AND ATTR_GROUP_INT_NAME = :attr_group_int_name
3799                      AND (ATTR_DISP_VALUE IS NOT NULL OR ATTR_VALUE_DATE IS NOT NULL)';
3800 
3801                  DBMS_SQL.Parse(l_nvs_datetime_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
3802                  DBMS_SQL.Bind_Variable(l_nvs_datetime_cursor_id, ':data_set_id', p_data_set_id);
3803 
3804                END IF;
3805 
3806                DBMS_SQL.Bind_Variable(l_nvs_datetime_cursor_id, ':attr_datatype', l_attr_metadata_rec(l_var).DATA_TYPE);
3807                DBMS_SQL.Bind_Variable(l_nvs_datetime_cursor_id, ':attr_group_int_name', l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME);
3808                DBMS_SQL.Bind_Variable(l_nvs_datetime_cursor_id, ':attr_internal_name', l_attr_metadata_rec(l_var).ATTR_INT_NAME);
3809                DBMS_SQL.Bind_Variable(l_nvs_datetime_cursor_id, ':attr_min_allowed_val', l_attr_metadata_rec(l_var).MINIMUM_VALUE);
3810                DBMS_SQL.Bind_Variable(l_nvs_datetime_cursor_id, ':attr_max_allowed_val', l_attr_metadata_rec(l_var).MAXIMUM_VALUE);
3811 
3812                l_dummy := DBMS_SQL.Execute(l_nvs_datetime_cursor_id);
3813 
3814              ELSE -- must be char and translateble text
3815                IF (l_nvs_char_cursor_id is NULL) THEN
3816 
3817                  l_nvs_char_cursor_id := DBMS_SQL.Open_Cursor;
3818                  /* Fix for bug#9678667 : Added the below hint */
3819                  l_dynamic_sql :=
3820                  'UPDATE /*+ index(EGO_ITM_USR_ATTR_INTRFC, EGO_ITM_USR_ATTR_INTRFC_N1) */ '||p_interface_table_name||'
3821                      SET ATTR_VALUE_STR = ATTR_DISP_VALUE
3822                    WHERE DATA_SET_ID = :data_set_id
3823                      AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
3824                      AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
3825                      AND ATTR_INT_NAME = :attr_internal_name
3826                      AND ATTR_GROUP_INT_NAME = :attr_group_int_name
3827                      AND ATTR_DISP_VALUE IS NOT NULL';
3828 
3829                  DBMS_SQL.Parse(l_nvs_char_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
3830                  DBMS_SQL.Bind_Variable(l_nvs_char_cursor_id, ':data_set_id', p_data_set_id);
3831 
3832                END IF;
3833 
3834                DBMS_SQL.Bind_Variable(l_nvs_char_cursor_id, ':attr_group_int_name', l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME);
3835                DBMS_SQL.Bind_Variable(l_nvs_char_cursor_id, ':attr_internal_name', l_attr_metadata_rec(l_var).ATTR_INT_NAME);
3836 
3837                l_dummy := DBMS_SQL.Execute(l_nvs_char_cursor_id);
3838 
3839              END IF;
3840            END IF;
3841 
3842            --------------------------------------------------------------------------
3843            -- HERE WE UPDATE THE INTERFACE TABLE ERRORING OUT ALL THE ROWS HAVING  --
3844            -- ATTRIBUTE DATA HAVING LENGTH GREATER THAN THE MAXIMUM ALLOWED LENGTH --
3845            -- WE DO THIS CHECK ONLY FOR NUMBER, CHAR AND DATE/DATETIME DATA TYPE   --
3846            --------------------------------------------------------------------------
3847 
3848                  -- swuppala: START : bug fix 12907500 There is no validation  on data type before setting the maximum value. Hence transalatable text which execeeds 150 size is erroring out.
3849       -- with ora-06502: pl/sql: numeric or value error: character string
3850         IF (l_attr_metadata_rec(l_var).MAXIMUM_SIZE IS NULL OR l_attr_metadata_rec(l_var).MAXIMUM_SIZE = 0) THEN
3851           IF(l_attr_metadata_rec(l_var).DATA_TYPE = EGO_EXT_FWK_PUB.G_CHAR_DATA_TYPE) THEN
3852             l_attr_metadata_rec(l_var).MAXIMUM_SIZE := 150;  -- 150 is the default Max length of UDA per functional design
3853           ELSIF(l_attr_metadata_rec(l_var).DATA_TYPE = EGO_EXT_FWK_PUB.G_TRANS_TEXT_DATA_TYPE) THEN
3854             l_attr_metadata_rec(l_var).MAXIMUM_SIZE := 1000;  -- 1000 is the default Max length of Translatable text type UDA.
3855           END IF;
3856         END IF;
3857 
3858       -- swuppala : END :  bug fix 12907500
3859 
3860            IF (l_attr_metadata_rec(l_var).MAXIMUM_SIZE > 0) THEN
3861 
3862              code_debug('          This attribute has a maximum size of '||l_attr_metadata_rec(l_var).MAXIMUM_SIZE,2);
3863 
3864              --------- FOR NUMBER DATATYPE
3865              IF (l_attr_metadata_rec(l_var).DATA_TYPE = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
3866                IF (l_max_size_num_cursor IS NULL) THEN
3867                  l_max_size_num_cursor := DBMS_SQL.Open_Cursor;
3868                  l_dynamic_sql :=
3869                  'UPDATE '||p_interface_table_name||'
3870                      SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_MAX_LENGTH_VIOLATION||'
3871                      WHERE DATA_SET_ID = :data_set_id
3872                        AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
3873                        AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
3874                        AND ATTR_INT_NAME = :attr_internal_name
3875                        AND ATTR_GROUP_INT_NAME = :attr_group_int_name
3876                        AND ATTR_VALUE_NUM IS NOT NULL
3877                        AND LENGTH(ATTR_VALUE_NUM) > :max_allowed_size';
3878                    DBMS_SQL.Parse(l_max_size_num_cursor, l_dynamic_sql, DBMS_SQL.NATIVE);
3879                    DBMS_SQL.Bind_Variable(l_max_size_num_cursor, ':data_set_id', p_data_set_id);
3880 
3881                END IF;
3882 
3883                DBMS_SQL.Bind_Variable(l_max_size_num_cursor, ':attr_group_int_name', l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME);
3884                DBMS_SQL.Bind_Variable(l_max_size_num_cursor, ':attr_internal_name', l_attr_metadata_rec(l_var).ATTR_INT_NAME);
3885                DBMS_SQL.Bind_Variable(l_max_size_num_cursor, ':max_allowed_size', l_attr_metadata_rec(l_var).MAXIMUM_SIZE);
3886                l_dummy := DBMS_SQL.Execute(l_max_size_num_cursor);
3887              --------- FOR CHAR OR TRANSLATEBLE TEXT DATATYPE
3888              ELSIF(l_attr_metadata_rec(l_var).DATA_TYPE = EGO_EXT_FWK_PUB.G_CHAR_DATA_TYPE OR
3889                    l_attr_metadata_rec(l_var).DATA_TYPE = EGO_EXT_FWK_PUB.G_TRANS_TEXT_DATA_TYPE) THEN
3890 
3891                IF ( l_max_size_char_cursor IS NULL) THEN
3892                  l_max_size_char_cursor := DBMS_SQL.Open_Cursor;
3893                  l_dynamic_sql :=
3894                  'UPDATE '||p_interface_table_name||'
3895                      SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_MAX_LENGTH_VIOLATION||'
3896                      WHERE DATA_SET_ID = :data_set_id
3897                        AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
3898                        AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
3899                        AND ATTR_INT_NAME = :attr_internal_name
3900                        AND ATTR_GROUP_INT_NAME = :attr_group_int_name
3901                        AND ATTR_VALUE_STR IS NOT NULL
3902                        AND LENGTHB(ATTR_VALUE_STR) > :max_allowed_size'; --for bug 9748517, use byte size to determin size for multi-byte language
3903                    DBMS_SQL.Parse(l_max_size_char_cursor, l_dynamic_sql, DBMS_SQL.NATIVE);
3904                    DBMS_SQL.Bind_Variable(l_max_size_char_cursor, ':data_set_id', p_data_set_id);
3905 
3906                END IF;
3907                DBMS_SQL.Bind_Variable(l_max_size_char_cursor, ':attr_group_int_name', l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME);
3908                DBMS_SQL.Bind_Variable(l_max_size_char_cursor, ':attr_internal_name', l_attr_metadata_rec(l_var).ATTR_INT_NAME);
3909                DBMS_SQL.Bind_Variable(l_max_size_char_cursor, ':max_allowed_size', l_attr_metadata_rec(l_var).MAXIMUM_SIZE);
3910 
3911                l_dummy := DBMS_SQL.Execute(l_max_size_char_cursor);
3912 
3913              END IF;
3914            END IF;
3915 
3916            --------------------------------------------------------------------------
3917            -- We need to see that the user has not entered data in a wrong column  --
3918            -- for an attribute. e.g for a number type attribute the data should    --
3919            -- only be in ATT_VALUE_NUM or ATTR_DISP_VALUE                          --
3920            --------------------------------------------------------------------------
3921 
3922            code_debug('          Before validating the rows for data in wrong column ' ,2);
3923 
3924            --------- FOR NUMBER DATATYPE
3925            IF(l_attr_metadata_rec(l_var).DATA_TYPE = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
3926              IF (l_colcheck_num_cursor_id IS NULL) THEN
3927                l_colcheck_num_cursor_id := DBMS_SQL.Open_Cursor;
3928                l_dynamic_sql :=
3929                'UPDATE '||p_interface_table_name||'
3930                    SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_DATA_IN_WRONG_COL||'
3931                  WHERE DATA_SET_ID = :data_set_id
3932                    AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
3933                    AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
3934                    AND ATTR_INT_NAME = :attr_internal_name
3935                    AND ATTR_GROUP_INT_NAME = :attr_group_int_name
3936                    AND ATTR_VALUE_NUM IS NULL
3937                    AND ATTR_DISP_VALUE IS NULL
3938                    AND (ATTR_VALUE_STR IS NOT NULL OR ATTR_VALUE_DATE IS NOT NULL)' ;
3939                DBMS_SQL.Parse(l_colcheck_num_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
3940                DBMS_SQL.Bind_Variable(l_colcheck_num_cursor_id, ':data_set_id', p_data_set_id);
3941              END IF;
3942 
3943              DBMS_SQL.Bind_Variable(l_colcheck_num_cursor_id, ':attr_group_int_name', l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME);
3944              DBMS_SQL.Bind_Variable(l_colcheck_num_cursor_id, ':attr_internal_name', l_attr_metadata_rec(l_var).ATTR_INT_NAME);
3945 
3946              l_dummy := DBMS_SQL.Execute(l_colcheck_num_cursor_id);
3947 
3948            --------- FOR DATE/DATETIME DATATYPE
3949            ELSIF (l_attr_metadata_rec(l_var).DATA_TYPE = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE OR l_attr_metadata_rec(l_var).DATA_TYPE = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE) THEN
3950              IF (l_colcheck_date_cursor_id IS NULL) THEN
3951                l_colcheck_date_cursor_id := DBMS_SQL.Open_Cursor;
3952                l_dynamic_sql :=
3953                'UPDATE '||p_interface_table_name||'
3954                    SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_DATA_IN_WRONG_COL||'
3955                  WHERE DATA_SET_ID = :data_set_id
3956                    AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
3957                    AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
3958                    AND ATTR_INT_NAME = :attr_internal_name
3959                    AND ATTR_GROUP_INT_NAME = :attr_group_int_name
3960                    AND ATTR_VALUE_DATE IS NULL
3961                    AND ATTR_DISP_VALUE IS NULL
3962                    AND (ATTR_VALUE_STR IS NOT NULL OR ATTR_VALUE_NUM IS NOT NULL)' ;
3963                DBMS_SQL.Parse(l_colcheck_date_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
3964                DBMS_SQL.Bind_Variable(l_colcheck_date_cursor_id, ':data_set_id', p_data_set_id);
3965              END IF;
3966 
3967              DBMS_SQL.Bind_Variable(l_colcheck_date_cursor_id, ':attr_group_int_name', l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME);
3968              DBMS_SQL.Bind_Variable(l_colcheck_date_cursor_id, ':attr_internal_name', l_attr_metadata_rec(l_var).ATTR_INT_NAME);
3969 
3970              l_dummy := DBMS_SQL.Execute(l_colcheck_date_cursor_id);
3971            --------- FOR CHAR/TRANSLATEBLE TEXT DATATYPE
3972            ELSE
3973              IF (l_colcheck_char_cursor_id IS NULL) THEN
3974                l_colcheck_char_cursor_id := DBMS_SQL.Open_Cursor;
3975                /* Fix for bug#9678667 - Added below hint */
3976                l_dynamic_sql :=
3977                'UPDATE /*+ index(EGO_ITM_USR_ATTR_INTRFC, EGO_ITM_USR_ATTR_INTRFC_N1) NO_EXPAND */ '||p_interface_table_name||'
3978                    SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_DATA_IN_WRONG_COL||'
3979                  WHERE DATA_SET_ID = :data_set_id
3980                    AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
3981                    AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
3982                    AND ATTR_INT_NAME = :attr_internal_name
3983                    AND ATTR_GROUP_INT_NAME = :attr_group_int_name
3984                    AND ATTR_VALUE_STR IS NULL
3985                    AND ATTR_DISP_VALUE IS NULL
3986                    AND (ATTR_VALUE_NUM IS NOT NULL OR ATTR_VALUE_DATE IS NOT NULL)' ;
3987                DBMS_SQL.Parse(l_colcheck_char_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
3988                DBMS_SQL.Bind_Variable(l_colcheck_char_cursor_id, ':data_set_id', p_data_set_id);
3989              END IF;
3990 
3991              DBMS_SQL.Bind_Variable(l_colcheck_char_cursor_id, ':attr_group_int_name', l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME);
3992              DBMS_SQL.Bind_Variable(l_colcheck_char_cursor_id, ':attr_internal_name', l_attr_metadata_rec(l_var).ATTR_INT_NAME);
3993 
3994              l_dummy := DBMS_SQL.Execute(l_colcheck_char_cursor_id);
3995 
3996            END IF;
3997 
3998         END IF; -- if not previously processed
3999       END IF; --*p_validate-IF-1.5*   Ending the IF for p_validate
4000 
4001       IF (p_do_dml AND l_priv_attr_id <> l_attr_metadata_rec(l_var).ATTR_ID) THEN
4002         IF(l_attr_metadata_rec(l_var).UOM_CLASS IS NOT NULL) THEN
4003           ----------------------------------------------
4004           -- Converting the attr value to base UOM
4005           ----------------------------------------------
4006 
4007           l_dynamic_sql :=
4008           'UPDATE '||p_interface_table_name||' INTF
4009               SET ATTR_VALUE_NUM = ATTR_VALUE_NUM * NVL((SELECT CONVERSION_RATE FROM MTL_UOM_CONVERSIONS
4010                                                       WHERE UOM_CLASS = :uom_class
4011                                                         AND UOM_CODE = INTF.ATTR_VALUE_UOM
4012                                                         AND ROWNUM = 1),1)
4013             WHERE DATA_SET_ID = :data_set_id
4014               AND PROCESS_STATUS = '||G_PS_IN_PROCESS||'
4015               AND ATTR_INT_NAME = :attr_internal_name
4016               AND ATTR_GROUP_INT_NAME = :attr_group_int_name
4017               AND ATTR_VALUE_UOM <> :base_uom ';
4018 
4019           EXECUTE IMMEDIATE l_dynamic_sql
4020           USING l_attr_metadata_rec(l_var).UOM_CLASS, p_data_Set_id,l_attr_metadata_rec(l_var).ATTR_INT_NAME,
4021                 l_attr_metadata_rec(l_var).ATTR_GROUP_INT_NAME,l_attr_metadata_rec(l_var).UOM_CODE;
4022         END IF;
4023       END IF;
4024       l_priv_attr_id := l_attr_metadata_rec(l_var).ATTR_ID;
4025 
4026     END LOOP;--End 1st loop
4027     -- Fix for bug#9336604
4028     -- CLOSE l_dynamic_cursor;
4029     END IF; -- bug 14672950
4030 
4031     code_debug('          After the ATTR LEVEL validation loop ' ,1);
4032 
4033     -- CLOSING ALL OPEN CURSORS
4034     IF (l_priv_func_cursor_id IS NOT NULL) THEN
4035       DBMS_SQL.Close_Cursor(l_priv_func_cursor_id);
4036     END IF;
4037     IF (l_ivs_num_cursor_id IS NOT NULL) THEN
4038       DBMS_SQL.Close_Cursor(l_ivs_num_cursor_id);
4039     END IF;
4040     IF (l_ivs_date_cursor_id IS NOT NULL) THEN
4041       DBMS_SQL.Close_Cursor(l_ivs_date_cursor_id);
4042     END IF;
4043     IF (l_ivs_date_time_cursor_id IS NOT NULL) THEN
4044       DBMS_SQL.Close_Cursor(l_ivs_date_time_cursor_id);
4045     END IF;
4046     IF (l_ivs_char_cursor_id IS NOT NULL) THEN
4047       DBMS_SQL.Close_Cursor(l_ivs_char_cursor_id);
4048     END IF;
4049     IF (l_nvs_num_cursor_id IS NOT NULL) THEN
4050       DBMS_SQL.Close_Cursor(l_nvs_num_cursor_id);
4051     END IF;
4052     IF (l_nvs_date_cursor_id IS NOT NULL) THEN
4053       DBMS_SQL.Close_Cursor(l_nvs_date_cursor_id);
4054     END IF;
4055     IF (l_nvs_datetime_cursor_id IS NOT NULL) THEN
4056       DBMS_SQL.Close_Cursor(l_nvs_datetime_cursor_id);
4057     END IF;
4058     IF (l_nvs_char_cursor_id IS NOT NULL) THEN
4059       DBMS_SQL.Close_Cursor(l_nvs_char_cursor_id);
4060     END IF;
4061     IF (l_max_size_char_cursor IS NOT NULL) THEN
4062       DBMS_SQL.Close_Cursor(l_max_size_char_cursor);
4063     END IF;
4064     IF (l_max_size_num_cursor IS NOT NULL) THEN
4065       DBMS_SQL.Close_Cursor(l_max_size_num_cursor);
4066     END IF;
4067     IF (l_colcheck_num_cursor_id IS NOT NULL) THEN
4068       DBMS_SQL.Close_Cursor(l_colcheck_num_cursor_id);
4069     END IF;
4070     IF (l_colcheck_char_cursor_id IS NOT NULL) THEN
4071       DBMS_SQL.Close_Cursor(l_colcheck_char_cursor_id);
4072     END IF;
4073     IF (l_colcheck_date_cursor_id IS NOT NULL) THEN
4074       DBMS_SQL.Close_Cursor(l_colcheck_date_cursor_id);
4075     END IF;
4076 
4077     IF (p_validate) THEN -- *p_validate-IF-1.75*
4078     -------------------------------------------------------------------------------------
4079     -- Update other attributes if at least one attribute is failed for all attr group
4080     -------------------------------------------------------------------------------------
4081      --considering the G_PS_BAD_ATTR_OR_AG_METADATA is the starting point for the intermittent errors.
4082 
4083      /* Fix for bug#9678667 - Start */
4084      /*
4085       EXECUTE IMMEDIATE
4086             'UPDATE '||p_interface_table_name||' UAI1' ||
4087                 ' SET UAI1.PROCESS_STATUS = UAI1.PROCESS_STATUS + '||G_PS_OTHER_ATTRS_INVALID||
4088                 ' WHERE UAI1.DATA_SET_ID = :data_set_id '||
4089                 ' AND BITAND(PROCESS_STATUS,'||G_PS_OTHER_ATTRS_INVALID||') = 0'||
4090                 ' AND UAI1.ROW_IDENTIFIER  IN'||
4091                 '     (SELECT DISTINCT UAI2.ROW_IDENTIFIER'||
4092                 '        FROM '||p_interface_table_name||' UAI2'||
4093                 '        WHERE UAI2.DATA_SET_ID = :data_set_id '||
4094                 '         AND UAI2.PROCESS_STATUS >= '||G_PS_BAD_ATTR_OR_AG_METADATA ||
4095                 '         AND UAI2.ATTR_GROUP_INT_NAME = UAI1.ATTR_GROUP_INT_NAME)'
4096       USING p_data_set_id, p_data_set_id;
4097       */
4098 
4099       EXECUTE IMMEDIATE
4100             'UPDATE '||p_interface_table_name||' UAI1' ||
4101                 ' SET UAI1.PROCESS_STATUS = UAI1.PROCESS_STATUS + '||G_PS_OTHER_ATTRS_INVALID||
4102                 ' WHERE UAI1.DATA_SET_ID = :data_set_id '||
4103                 ' AND BITAND(PROCESS_STATUS,'||G_PS_OTHER_ATTRS_INVALID||') = 0'||
4104                 ' AND (UAI1.ROW_IDENTIFIER, UAI1.ATTR_GROUP_INT_NAME)  IN '||
4105                 '       (SELECT /*+ UNNEST CARDINALITY(UAI2,10) INDEX(UAI2,EGO_ITM_USR_ATTR_INTRFC_N3) */ '|| /* Bug 9678667 */
4106                 '           UAI2.ROW_IDENTIFIER, UAI2.ATTR_GROUP_INT_NAME '||
4107                 '        FROM '||p_interface_table_name||' UAI2'||
4108                 '        WHERE UAI2.DATA_SET_ID = :data_set_id '||
4109                 '           AND UAI2.PROCESS_STATUS >= '||G_PS_BAD_ATTR_OR_AG_METADATA ||
4110                 '      )'
4111       USING p_data_set_id, p_data_set_id;
4112       /* Fix for bug#9678667 - End */
4113 
4114     END IF; --*p_validate-IF-1.75*   Ending the IF for p_validate
4115 
4116 
4117                   --===========================--
4118                   -- AG-LEVEL LOOP VALIDATIONS --
4119                   --===========================--
4120     code_debug(' Before entering the Attr Group Level Validation Loop ' ,1);
4121     ------------------------------------------------
4122     -- Now we fetch all distinct Attr Groups that --
4123     -- still have valid rows in the data set      --
4124     ------------------------------------------------
4125     OPEN l_dynamic_dist_ag_cursor FOR
4126         ' SELECT DISTINCT ATTR_GROUP_INT_NAME
4127             FROM '||p_interface_table_name||' UAI1
4128            WHERE DATA_SET_ID = :data_set_id
4129              AND ATTR_GROUP_TYPE = :attr_group_type
4130              AND (UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR UAI1.PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )'
4131     USING p_data_set_id, p_attr_group_type;
4132     LOOP
4133       FETCH l_dynamic_dist_ag_cursor INTO l_attr_group_intf_rec;
4134       EXIT WHEN l_dynamic_dist_ag_cursor%NOTFOUND;
4135 
4136       code_debug('----------Inside Attribute Group level validation loop: processing Attribute Group-'||l_attr_group_intf_rec.ATTR_GROUP_INT_NAME||'-'||p_attr_group_type ,2);
4137 
4138       l_do_dml_for_this_ag := true;
4139 
4140       l_attr_group_metadata_obj := EGO_USER_ATTRS_COMMON_PVT.Get_Attr_Group_Metadata(
4141                                      p_attr_group_id   => NULL
4142                                     ,p_application_id  => p_application_id
4143                                     ,p_attr_group_type => p_attr_group_type
4144                                     ,p_attr_group_name => l_attr_group_intf_rec.ATTR_GROUP_INT_NAME
4145                                    );
4146 
4147       l_attr_metadata_table := l_attr_group_metadata_obj.ATTR_METADATA_TABLE;
4148       l_attr_metadata_table_sr := l_attr_group_metadata_obj.ATTR_METADATA_TABLE;
4149       l_attr_metadata_table_1 := l_attr_group_metadata_obj.ATTR_METADATA_TABLE;
4150 
4151       code_debug('          After the required and defaulting validations ' ,2);
4152 
4153       --------------------------------------------------------
4154       -- in this loop we do the MR specific validations
4155       -- these are basically the ones which require UK's
4156       --------------------------------------------------------
4157       IF (l_attr_group_metadata_obj.MULTI_ROW_CODE = 'Y') THEN
4158 
4159         code_debug('          This attribute group is a multi-row attribute group, reached inside the MR specific validation loop ', 2);
4160         -------------------------------------------
4161         -- at the end of this loop we will get the query
4162         -- to identify a row in the EXT table
4163         -- with the UK's
4164         -------------------------------------------
4165         l_ext_table_select := '  '||l_ext_vl_name ||
4166         ' EXTVL1 WHERE EXTVL1.ATTR_GROUP_ID='||l_attr_group_metadata_obj.ATTR_GROUP_ID||' ';
4167 /*
4168 TO DO: Dylan hard-coded the AG ID, because there's already so much hard-coding
4169 going on.  But ultimately this is incorrect; everything needs to be bind variables.
4170 */
4171 
4172         --LOOP THROUGH ALL THE ATTRS METADATA FOR THIS AG
4173         FOR i IN l_attr_metadata_table.FIRST .. l_attr_metadata_table.LAST
4174         LOOP
4175           IF (l_attr_metadata_table(i).UNIQUE_KEY_FLAG = 'Y' ) THEN
4176 
4177             --IF ( l_attr_metadata_table(i).DATA_TYPE_CODE <> EGO_EXT_FWK_PUB.G_TRANS_TEXT_DATA_TYPE OR 1=1) THEN
4178               --GNANDA : Since now we are supporting TL UK's we do not need to error out the AG rows with
4179               --TL attrs as UK's in them.
4180               IF (l_attr_metadata_table(i).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE ) THEN
4181                 l_intf_column_name := ' ATTR_VALUE_NUM ';
4182                 wierd_constant := G_NULL_TOKEN_NUM;
4183               ELSIF (l_attr_metadata_table(i).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE OR l_attr_metadata_table(i).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE ) THEN
4184                 l_intf_column_name := ' ATTR_VALUE_DATE ';
4185                 wierd_constant := G_NULL_TOKEN_DATE;
4186               ELSE
4187                 l_intf_column_name := ' ATTR_VALUE_STR ';
4188                 wierd_constant := G_NULL_TOKEN_STR;
4189               END IF;
4190 
4191               l_intf_tbl_select :=
4192               ' (SELECT '||l_intf_column_name||' FROM '||p_interface_table_name||
4193                 ' WHERE DATA_SET_ID = '||p_data_set_id||
4194                   ' AND ATTR_GROUP_INT_NAME = '''||
4195                         l_attr_group_metadata_obj.ATTR_GROUP_NAME||
4196                 ''' AND ATTR_INT_NAME = '''||
4197                         l_attr_metadata_table(i).ATTR_NAME||
4198                 ''' AND ROW_IDENTIFIER = UAI1.ROW_IDENTIFIER';
4199 
4200               l_intf_tbl_select := l_intf_tbl_select || ')';
4201 
4202               l_ext_table_select := l_ext_table_select || ' AND NVL(EXTVL1.'||l_attr_metadata_table(i).DATABASE_COLUMN||','||wierd_constant||') = NVL('||l_intf_tbl_select||','||wierd_constant||')';
4203             /*
4204             ELSE
4205               l_dynamic_sql :=
4206                  'UPDATE '||p_interface_table_name||'
4207                   SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_TL_COL_IS_A_UK||'
4208                 WHERE DATA_SET_ID = :data_set_id
4209                   AND PROCESS_STATUS <> 3
4210                   AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
4211                   AND ATTR_GROUP_INT_NAME = :attr_group_int_name ';
4212 
4213               EXECUTE IMMEDIATE l_dynamic_sql
4214               USING p_data_set_id, l_attr_group_metadata_obj.ATTR_GROUP_NAME;
4215 
4216               l_do_dml_for_this_ag := false;
4217 
4218             END IF;
4219             */
4220           END IF;
4221         END LOOP;
4222 
4223         IF (l_pk1_column_name IS NOT NULL) THEN
4224           l_ext_table_select := l_ext_table_select || ' AND EXTVL1.'||l_pk1_column_name||' = UAI1.'||l_pk1_column_name;
4225         END IF;
4226         IF (l_pk2_column_name IS NOT NULL) THEN
4227           l_ext_table_select := l_ext_table_select || ' AND EXTVL1.'||l_pk2_column_name||' = UAI1.'||l_pk2_column_name;
4228         END IF;
4229         IF (l_pk3_column_name IS NOT NULL) THEN
4230           l_ext_table_select := l_ext_table_select || ' AND EXTVL1.'||l_pk3_column_name||' = UAI1.'||l_pk3_column_name;
4231         END IF;
4232         IF (l_pk4_column_name IS NOT NULL) THEN
4233           l_ext_table_select := l_ext_table_select || ' AND EXTVL1.'||l_pk4_column_name||' = UAI1.'||l_pk4_column_name;
4234         END IF;
4235         IF (l_pk5_column_name IS NOT NULL) THEN
4236           l_ext_table_select := l_ext_table_select || ' AND EXTVL1.'||l_pk5_column_name||' = UAI1.'||l_pk5_column_name;
4237         END IF;
4238 
4239         -- adding datalevel columns to the query
4240         IF(l_data_level_col_exists) THEN
4241           l_ext_table_select := l_ext_table_select || ' AND NVL(EXTVL1.DATA_LEVEL_ID,'||G_NULL_TOKEN_NUM||') '||
4242                                                             '   = NVL(UAI1.DATA_LEVEL_ID,'||G_NULL_TOKEN_NUM||')';
4243 
4244           FOR i IN l_list_of_dl_for_ag_type.FIRST .. l_list_of_dl_for_ag_type.LAST
4245           LOOP
4246 
4247              IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 <> 'NONE'
4248                 AND INSTR(l_ext_table_select,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1) = 0) THEN
4249 
4250                      IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE1 = 'NUMBER') THEN
4251                        wierd_constant := G_NULL_TOKEN_NUM;
4252                      ELSIF (l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE1 = 'DATE' OR l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE1 = 'DATETIME') THEN
4253                        wierd_constant := G_NULL_TOKEN_DATE;
4254                      ELSE
4255                        wierd_constant := G_NULL_TOKEN_STR;
4256                      END IF;
4257 
4258                      l_ext_table_select := l_ext_table_select || ' AND NVL(EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1||','||wierd_constant||') '||
4259                                                                        '   = NVL(UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1||','||wierd_constant||')';
4260              END IF;
4261              IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2 <> 'NONE'
4262                 AND INSTR(l_ext_table_select,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2) = 0) THEN
4263                      IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE2 = 'NUMBER') THEN
4264                        wierd_constant := G_NULL_TOKEN_NUM;
4265                      ELSIF (l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE2 = 'DATE' OR l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE2 = 'DATETIME') THEN
4266                        wierd_constant := G_NULL_TOKEN_DATE;
4267                      ELSE
4268                        wierd_constant := G_NULL_TOKEN_STR;
4269                      END IF;
4270                      l_ext_table_select := l_ext_table_select || ' AND NVL(EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2||','||wierd_constant||') '||
4271                                                                        '   = NVL(UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2||','||wierd_constant||')';
4272              END IF;
4273              IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3 <> 'NONE'
4274                 AND INSTR(l_ext_table_select,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3) = 0) THEN
4275                      IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE3 = 'NUMBER') THEN
4276                        wierd_constant := G_NULL_TOKEN_NUM;
4277                      ELSIF (l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE3 = 'DATE' OR l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE3 = 'DATETIME') THEN
4278                        wierd_constant := G_NULL_TOKEN_DATE;
4279                      ELSE
4280                        wierd_constant := G_NULL_TOKEN_STR;
4281                      END IF;
4282                      l_ext_table_select := l_ext_table_select || ' AND NVL(EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3||','||wierd_constant||') '||
4283                                                                        '   = NVL(UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3||','||wierd_constant||')';
4284              END IF;
4285              IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4 <> 'NONE'
4286                 AND INSTR(l_ext_table_select,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4) = 0) THEN
4287                      IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE4 = 'NUMBER') THEN
4288                        wierd_constant := G_NULL_TOKEN_NUM;
4289                      ELSIF (l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE4 = 'DATE' OR l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE4 = 'DATETIME') THEN
4290                        wierd_constant := G_NULL_TOKEN_DATE;
4291                      ELSE
4292                        wierd_constant := G_NULL_TOKEN_STR;
4293                      END IF;
4294                      l_ext_table_select := l_ext_table_select || ' AND NVL(EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4||','||wierd_constant||') '||
4295                                                                        '   = NVL(UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4||','||wierd_constant||')';
4296              END IF;
4297              IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5 <> 'NONE'
4298                 AND INSTR(l_ext_table_select,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5) = 0) THEN
4299                      IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE5 = 'NUMBER') THEN
4300                        wierd_constant := G_NULL_TOKEN_NUM;
4301                      ELSIF (l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE5 = 'DATE' OR l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE5 = 'DATETIME') THEN
4302                        wierd_constant := G_NULL_TOKEN_DATE;
4303                      ELSE
4304                        wierd_constant := G_NULL_TOKEN_STR;
4305                      END IF;
4306                      l_ext_table_select := l_ext_table_select || ' AND NVL(EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5||','||wierd_constant||') '||
4307                                                                        '   = NVL(UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5||','||wierd_constant||')';
4308              END IF;
4309           END LOOP;
4310         ELSE
4311 
4312               IF (l_num_data_level_columns = 1) THEN
4313                 l_ext_table_select := l_ext_table_select || ' AND NVL(EXTVL1.'||l_data_level_column_1||',-1) =  NVL(UAI1.'||l_data_level_column_1||',-1)';
4314 
4315               ELSIF (l_num_data_level_columns = 2) THEN
4316                 l_ext_table_select := l_ext_table_select || ' AND NVL(EXTVL1.'||l_data_level_column_1||',-1) =  NVL(UAI1.'||l_data_level_column_1||',-1)';
4317                 l_ext_table_select := l_ext_table_select || ' AND NVL(EXTVL1.'||l_data_level_column_2||',-1) =  NVL(UAI1.'||l_data_level_column_2||',-1)';
4318 
4319               ELSIF (l_num_data_level_columns = 3) THEN
4320                 l_ext_table_select := l_ext_table_select || ' AND NVL(EXTVL1.'||l_data_level_column_1||',-1) =  NVL(UAI1.'||l_data_level_column_1||',-1)';
4321                 l_ext_table_select := l_ext_table_select || ' AND NVL(EXTVL1.'||l_data_level_column_2||',-1) =  NVL(UAI1.'||l_data_level_column_2||',-1)';
4322                 l_ext_table_select := l_ext_table_select || ' AND NVL(EXTVL1.'||l_data_level_column_3||',-1) =  NVL(UAI1.'||l_data_level_column_3||',-1)';
4323               END IF;
4324 
4325 
4326         END IF;
4327 
4328         code_debug('          The query generated for identifying the UKs is :'||l_ext_table_select ,3);
4329 
4330         ---------------------------------------------------------------
4331         -- We go on with the AG loop validations only if the         --
4332         -- API has been called with the parameter p_validate as TRUE --
4333         ---------------------------------------------------------------
4334         IF (p_validate = TRUE ) THEN --  search for  *p_validate-IF-2* for finding the end of this IF
4335         --------------------------------------------------------
4336         -- HERE WE DO THE TABLE VALUE SET VALIDATION FOR MR AG
4337         --------------------------------------------------------
4338         FOR y IN l_attr_metadata_table.FIRST .. l_attr_metadata_table.LAST
4339         LOOP
4340           IF (Attr_Is_In_Data_Set(l_attr_metadata_table(y),
4341                                   l_dist_attrs_in_data_set_table)) THEN
4342              l_attr_exists_in_intf := 'EXISTS';
4343           ELSE
4344             l_attr_exists_in_intf := 'NOTEXISTS';
4345           END IF;
4346 
4347           l_tvs_where_clause := ' ';
4348     --bug9846845, initialization the l_tvs_where_clause_clob
4349     l_tvs_where_clause_clob := ' ';
4350           IF (l_attr_exists_in_intf = 'EXISTS') THEN --WE DO THE TVC VALIDATION FOR SRAG ONLY IF THIS ATTR HAS ATLEAST ONE VALID INSTANCE IN THE INTF TABLE
4351             IF (l_attr_metadata_table(y).VALIDATION_CODE = EGO_EXT_FWK_PUB.G_TABLE_VALIDATION_CODE) THEN
4352 
4353               code_debug('          The attribute '||l_attr_metadata_table(y).ATTR_NAME||' has a table value set attached with value set id :'||l_attr_metadata_table(y).VALUE_SET_ID ,2);
4354 
4355               SELECT APPLICATION_TABLE_NAME,
4356                        VALUE_COLUMN_NAME,--VALUE_COLUMN_TYPE,VALUE_COLUMN_SIZE,
4357                        ID_COLUMN_NAME, --ID_COLUMN_TYPE, ID_COLUMN_SIZE,
4358                        MEANING_COLUMN_NAME, --MEANING_COLUMN_TYPE,
4359                        ADDITIONAL_WHERE_CLAUSE
4360                 INTO   l_tvs_table_name,
4361                        l_tvs_val_col, --l_tvs_val_col_type, l_tvs_val_col_size,
4362                        l_tvs_id_col, --l_tvs_id_col_type, l_tvs_id_col_size
4363                        l_tvs_mean_col, --l_tvs_mean_col_type,
4364                        l_tvs_where_clause
4365                 FROM FND_FLEX_VALIDATION_TABLES
4366                WHERE FLEX_VALUE_SET_ID = l_attr_metadata_table(y).VALUE_SET_ID;
4367 
4368         --By GEGUO for bug 9218013
4369         l_tvs_where_clause := trim(l_tvs_where_clause) || '  ';--BugFix:4609213: in case we have a bind at the end it fails because of the assimption mentioned below !
4370               IF (l_tvs_id_col IS NOT NULL) THEN
4371                  l_tvs_col := l_tvs_id_col;
4372               ELSE
4373                  l_tvs_col := l_tvs_val_col;
4374               END IF;
4375 
4376 
4377     -- abedajna Bug 6207675
4378                 --if ( l_tvs_where_clause is not null ) then
4379                 --  l_tvs_where_clause := '('||l_tvs_where_clause||')';
4380                 --end if;
4381     -- abedajna Bug 6322809
4382 
4383     --bug 9646916 if additional whereclause simply start with ORDER BY don't do anything
4384     IF (INSTR(UPPER(LTRIM(l_tvs_where_clause)), 'ORDER ') <> 1) THEN
4385       l_tvs_where_clause := process_whereclause(l_tvs_where_clause);
4386     END IF;
4387 
4388 
4389 
4390 
4391               IF(INSTR(UPPER(LTRIM(l_tvs_where_clause)),'WHERE ')) = 1 THEN --BugFix : 4171705
4392                 l_tvs_where_clause := SUBSTR(l_tvs_where_clause, INSTR(UPPER(l_tvs_where_clause),'WHERE ')+5 );
4393               ELSIF (INSTR(UPPER(LTRIM(l_tvs_where_clause)),'(WHERE ')) = 1 THEN  /*Added one more condition for bug 7508982*/
4394                 l_tvs_where_clause := '('||SUBSTR(l_tvs_where_clause, INSTR(UPPER(l_tvs_where_clause),'WHERE ')+5 );
4395               END IF;
4396 
4397               ------------------------------------------------------
4398                -- In case the where clause has new line or tabs    --
4399                -- we need to remove it BugFix:4101091              --
4400                ------------------------------------------------------
4401                SELECT REPLACE(l_tvs_where_clause,FND_GLOBAL.LOCAL_CHR(10),FND_GLOBAL.LOCAL_CHR(32)) INTO l_tvs_where_clause FROM dual; --replacing new line character
4402                SELECT REPLACE(l_tvs_where_clause,FND_GLOBAL.LOCAL_CHR(13),FND_GLOBAL.LOCAL_CHR(32)) INTO l_tvs_where_clause FROM dual; --removing carriage return
4403 
4404               IF(INSTR(UPPER(l_tvs_where_clause),' ORDER ')) <> 0 THEN --Bug:4065857 gnanda we need to remove the order by clause if any in the where clause
4405                 l_tvs_where_clause := SUBSTR(l_tvs_where_clause, 1 , INSTR(UPPER(l_tvs_where_clause),' ORDER '));
4406               END IF;
4407 
4408               IF(INSTR(UPPER(l_tvs_where_clause),')ORDER ')) <> 0 THEN --BugFix:6133202
4409                 l_tvs_where_clause := SUBSTR(l_tvs_where_clause, 1 , INSTR(UPPER(l_tvs_where_clause),')ORDER '));
4410               END IF;
4411 
4412 
4413               IF(INSTR(UPPER(LTRIM(l_tvs_where_clause)),'ORDER ')) = 1 THEN --Bug:4065857 gnanda we need to remove the order by if where clause has only an order by
4414                 l_tvs_where_clause := SUBSTR(l_tvs_where_clause, 1 , INSTR(UPPER(l_tvs_where_clause),' ORDER '));
4415                 l_tvs_where_clause := ' 1=1 '|| l_tvs_where_clause;
4416               END IF;
4417 
4418               l_tvs_metadata_fetched := TRUE;
4419         --bug9846845, using l_tvs_where_clause_clob instead of l_tvs_where_clause to deal with following loop
4420         l_tvs_where_clause := l_tvs_where_clause || '  ';
4421         l_tvs_where_clause_clob := l_tvs_where_clause;
4422 
4423 
4424               --WHILE (INSTR(l_tvs_where_clause, ':$ATTRIBUTEGROUP$') > 0)
4425         WHILE (DBMS_LOB.INSTR(l_tvs_where_clause_clob, ':$ATTRIBUTEGROUP$') > 0)
4426               LOOP
4427 
4428                 --l_attrname_start_index := INSTR(l_tvs_where_clause,':$ATTRIBUTEGROUP$') +18;
4429     l_attrname_start_index := DBMS_LOB.INSTR(l_tvs_where_clause_clob,':$ATTRIBUTEGROUP$') +18;
4430                 -- NOTE: WE ASSUME THAT WE WILL HAVE A SPACE AFTER THE ATTR NAME (will look into this later)
4431                 --l_attrname_end_index   := INSTR(l_tvs_where_clause,' ',l_attrname_start_index,1);
4432     l_attrname_end_index   := DBMS_LOB.INSTR(l_tvs_where_clause_clob,' ',l_attrname_start_index,1);
4433 
4434                 --l_bind_attr_name := SUBSTR(l_tvs_where_clause,l_attrname_start_index,l_attrname_end_index-l_attrname_start_index);
4435     l_bind_attr_name := DBMS_LOB.SUBSTR(l_tvs_where_clause_clob,l_attrname_end_index-l_attrname_start_index,l_attrname_start_index);
4436 
4437                 -- HERE WE GET THE COLNAME AND DATATYPE OF THE ATTRIBUTE USED AS BIND VARIABLE
4438 
4439                 FOR k IN l_attr_metadata_table.FIRST .. l_attr_metadata_table.LAST
4440                 LOOP
4441                   IF (l_attr_metadata_table(k).ATTR_NAME = l_bind_attr_name) THEN
4442                     l_ext_attr_col_name := l_attr_metadata_table(k).DATABASE_COLUMN;
4443                     l_bind_attr_data_type := l_attr_metadata_table(k).DATA_TYPE_CODE;
4444                   END IF;
4445                 END LOOP;
4446 
4447                 IF (l_ext_attr_col_name IS NULL OR l_bind_attr_data_type IS NULL) THEN
4448                   l_tvs_metadata_fetched := FALSE;
4449                 ELSE
4450                   l_tvs_metadata_fetched := TRUE;
4451                 END IF;
4452 
4453                 -- we already have the query to identify the row for MR AG's using the UK's (l_ext_table_select)
4454                 -- so we can use this query to find the value to bind from the production table.
4455 
4456                 l_value_from_ext_table := ' (SELECT '|| l_ext_attr_col_name ||'
4457                                                FROM '||l_ext_table_select||'
4458                                                 AND ATTR_GROUP_ID = UAI1.ATTR_GROUP_ID) ';
4459 
4460                 IF (l_bind_attr_data_type = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
4461                   l_value_from_intftbl := '(SELECT ATTR_VALUE_NUM FROM '||p_interface_table_name||'
4462                                             WHERE ROW_IDENTIFIER = UAI1.ROW_IDENTIFIER
4463                           AND DATA_SET_ID = '||p_data_set_id||'
4464                                               AND ATTR_INT_NAME = '''||l_bind_attr_name||''' )';
4465                 ELSIF (l_bind_attr_data_type = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE  OR
4466                        l_bind_attr_data_type = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE) THEN
4467                   l_value_from_intftbl := '(SELECT ATTR_VALUE_DATE FROM '||p_interface_table_name||'
4468                                             WHERE ROW_IDENTIFIER = UAI1.ROW_IDENTIFIER
4469                           AND DATA_SET_ID = '||p_data_set_id||'
4470                                               AND ATTR_INT_NAME = '''||l_bind_attr_name||''' )';
4471                 ELSE
4472                   l_value_from_intftbl := '(SELECT ATTR_VALUE_STR FROM '||p_interface_table_name||'
4473                                             WHERE ROW_IDENTIFIER = UAI1.ROW_IDENTIFIER
4474                           AND DATA_SET_ID = '||p_data_set_id||'
4475                                               AND ATTR_INT_NAME = '''||l_bind_attr_name||''' )';
4476                 END IF;
4477                 -- now we replace the :$ATTRIBUTEGROUP$.attrname with the query to find the value.
4478 
4479                 -- Bug 10151142 : Start
4480                 l_tvs_string_length  := DBMS_LOB.INSTR(l_tvs_where_clause_clob, ':$ATTRIBUTEGROUP$')-1;
4481 
4482                 l_offset := 1;
4483                 l_tvs_where_clause_clob1 := '';
4484                 l_amount := 8191;
4485 
4486                 WHILE l_offset <= l_tvs_string_length LOOP
4487                   l_buffer := '';
4488 
4489                   IF ( l_tvs_string_length > l_amount) THEN
4490                     l_tvs_colb_length_diff := l_tvs_string_length - l_offset +1;
4491 
4492                     IF (l_tvs_colb_length_diff >= l_amount) THEN
4493                       dbms_lob.read(l_tvs_where_clause_clob, l_amount, l_offset, l_buffer);
4494                       l_offset := l_offset + l_amount;
4495                     ELSE
4496                       dbms_lob.read(l_tvs_where_clause_clob, l_tvs_colb_length_diff, l_offset, l_buffer);
4497                       l_offset := l_offset + l_tvs_colb_length_diff;
4498                     END IF;
4499                   ELSE
4500                     dbms_lob.read(l_tvs_where_clause_clob, l_tvs_string_length, l_offset, l_buffer);
4501                     l_offset := l_offset + l_tvs_string_length;
4502                   END IF;
4503 
4504                   l_tvs_where_clause_clob1 := l_tvs_where_clause_clob1||l_buffer;
4505                 END LOOP;
4506 
4507                 l_offset := 1;
4508                 l_clob_length := DBMS_LOB.GETLENGTH(l_tvs_where_clause_clob) - l_attrname_end_index;
4509                 l_amount := 32767;
4510                 l_tvs_where_clause_clob2 := '';
4511 
4512                 WHILE l_offset <= l_clob_length LOOP
4513                   l_tvs_where_clause_buffer := '';
4514                   dbms_lob.read(l_tvs_where_clause_clob, l_amount, (l_attrname_end_index + (l_offset - 1)), l_tvs_where_clause_buffer);
4515                   l_tvs_where_clause_clob2 := l_tvs_where_clause_clob2 || l_tvs_where_clause_buffer;
4516                   l_offset := l_offset + l_amount;
4517                 END loop;
4518 
4519                 l_tvs_where_clause_clob := l_tvs_where_clause_clob1 ||'(NVL('||l_value_from_intftbl||',
4520                                                     DECODE(UAI1.TRANSACTION_TYPE, ''UPDATE'','||l_value_from_ext_table||'
4521                                                     ,''CREATE'',NULL
4522                                                     , ''SYNC'','||l_value_from_ext_table||'
4523                                                     ,NULL)
4524                                                    )
4525                                                )'||
4526                                                l_tvs_where_clause_clob2;
4527 
4528                 /*l_tvs_where_clause_clob := DBMS_LOB.SUBSTR(l_tvs_where_clause_clob,DBMS_LOB.INSTR(l_tvs_where_clause_clob, ':$ATTRIBUTEGROUP$')-1,1) ||
4529                                            '(NVL('||l_value_from_intftbl||',
4530                                                     DECODE(UAI1.TRANSACTION_TYPE, ''UPDATE'','||l_value_from_ext_table||'
4531                                                     ,''CREATE'',NULL
4532                                                     , ''SYNC'','||l_value_from_ext_table||'
4533                                                     ,NULL)
4534                                                    )
4535                                                )'||
4536                                              DBMS_LOB.SUBSTR(l_tvs_where_clause_clob,DBMS_LOB.GETLENGTH(l_tvs_where_clause_clob), l_attrname_end_index);
4537                 */
4538                 -- Bug 10151142 : End
4539               END LOOP;
4540 
4541               WHILE (DBMS_LOB.INSTR(l_tvs_where_clause_clob, ':$OBJECT$') > 0)
4542               LOOP
4543                 SELECT REPLACE(l_tvs_where_clause_clob,':$OBJECT$','UAI1') INTO l_tvs_where_clause_clob FROM DUAL;
4544               END LOOP;
4545 
4546         -- l_tvs_where_clause := l_tvs_where_clause_clob; -- Bug 10151142 : Commented
4547         --end of bug9846845
4548 
4549       /*
4550       NOTE ...
4551       THERE COULD BE A POSSIBILITY THAT THE TVS QUERY RETURNS MORE THAN ONE ROWS
4552       IN THIS CASE WE JUST TAKE THE FIRST ROW : ( i.e. WHERE ROWNUM = 1)
4553       */
4554               /* Bug 10151142 : Start
4555                   Use l_tvs_where_clause_clob instead of l_tvs_where_clause
4556                   Use l_tvs_select_clob instead of l_tvs_select
4557                   Use l_tvs_num_val_check_sel_clob instead of l_tvs_num_val_check_select
4558                   Use l_tvs_date_val_check_sel_clob instead of l_tvs_date_val_check_select
4559                   Use l_tvs_str_val_check_sel_clob instead of l_tvs_str_val_check_select
4560               */
4561               l_tvs_where_clause_clob := RTRIM(LTRIM(l_tvs_where_clause_clob));
4562 
4563               IF LENGTH(l_tvs_where_clause_clob)<3 OR LENGTH(l_tvs_where_clause_clob) IS NULL THEN                 --added for bugFix:4609213
4564                 l_tvs_where_clause_clob := ' 1=1 '||l_tvs_where_clause_clob;
4565               END IF;
4566 
4567               l_tvs_select_clob := '(SELECT DISTINCT '||l_tvs_col||' FROM '||l_tvs_table_name||'
4568                                  WHERE '||l_tvs_where_clause_clob||'
4569                                    AND ROWNUM = 1
4570                        AND '||l_tvs_val_col||' = UAI1.ATTR_DISP_VALUE )';
4571 
4572               l_tvs_num_val_check_sel_clob := '(SELECT COUNT(*) FROM '||l_tvs_table_name||'
4573                                  WHERE '||l_tvs_where_clause_clob||'
4574                                    AND ROWNUM = 1
4575                        AND '||l_tvs_col||' = UAI1.ATTR_VALUE_NUM )';
4576 
4577               l_tvs_date_val_check_sel_clob := '(SELECT COUNT(*) FROM '||l_tvs_table_name||'
4578                                  WHERE '||l_tvs_where_clause_clob||'
4579                                    AND ROWNUM = 1
4580                        AND '||l_tvs_col||' = UAI1.ATTR_DATE_VALUE )';
4581 
4582               l_tvs_str_val_check_sel_clob := '(SELECT COUNT(*) FROM '||l_tvs_table_name||'
4583                                  WHERE '||l_tvs_where_clause_clob||'
4584                                    AND ROWNUM = 1
4585                        AND '||l_tvs_col||' = UAI1.ATTR_VALUE_STR )';
4586 
4587               -- code_debug('          The TVS query constructed is :'||l_tvs_select ,3);
4588               code_debug('          The Length of TVS query constructed is :'||dbms_lob.getlength(l_tvs_select_clob), 3);
4589               code_debug('          The TVS query constructed is :');
4590 
4591               /* Print TVS Query - Start
4592                 Below Code is for printing the TVS query in the debug log */
4593               l_clob_length := dbms_lob.getlength(l_tvs_select_clob);
4594               l_offset := 1;
4595               l_amount := 8191;
4596 
4597               /* Read 8191 characters from clob sequentially and append them to the VARCHAR2 variable
4598               using DBMS_LOB.READ function */
4599               while l_offset <= l_clob_length loop
4600                 l_buffer := '';
4601                 dbms_lob.read(l_tvs_select_clob, l_amount, l_offset, l_buffer);
4602                 l_offset := l_offset + l_amount;
4603                 code_debug(l_buffer, 3);
4604               end loop;
4605               /* Print TVS Query - End */
4606 
4607               code_debug('          TVS query constructed - Done');
4608 
4609               IF(l_tvs_metadata_fetched = FALSE) THEN
4610                 IF (l_bad_bindattrs_tvs_cursor_id IS NULL) THEN
4611                   l_bad_bindattrs_tvs_cursor_id := DBMS_SQL.Open_Cursor;
4612                   l_dynamic_sql :=
4613                   'UPDATE '||p_interface_table_name||'
4614                       SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_BAD_ATTRS_IN_TVS_WHERE||'
4615                     WHERE DATA_SET_ID = :data_set_id
4616                       AND ATTR_INT_NAME = :attr_internal_name
4617                       AND ATTR_GROUP_INT_NAME = :attr_group_int_name';
4618 
4619                   DBMS_SQL.Parse(l_bad_bindattrs_tvs_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
4620                   DBMS_SQL.Bind_Variable(l_bad_bindattrs_tvs_cursor_id, ':data_set_id', p_data_set_id);
4621                 END IF;
4622 
4623                 DBMS_SQL.Bind_Variable(l_bad_bindattrs_tvs_cursor_id, ':attr_group_int_name', l_attr_group_metadata_obj.ATTR_GROUP_NAME);
4624                 DBMS_SQL.Bind_Variable(l_bad_bindattrs_tvs_cursor_id, ':attr_internal_name', l_attr_metadata_table(y).ATTR_NAME);
4625 
4626                 l_dummy := DBMS_SQL.Execute(l_bad_bindattrs_tvs_cursor_id);
4627 
4628               ELSE -- now we do the interface table update since we are sure we have the metadata for bound variables
4629 /*
4630 Note: we are assuming that the setup is correct i.e. the column of the TVS are of correct data type
4631 the id col is of datatype same as the attribute
4632 the meanin col is of type character.
4633 another assumtion is that the user cannot enter the value directly in to the attr_val_* col
4634 he has to enter the data in attr_disp_Value column for which we get the actual attr val.
4635 */
4636                 IF (l_attr_metadata_table(y).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
4637 
4638                   -- Bug 10151142 : Start
4639                   /*
4640                   l_dynamic_sql_1 :=
4641                   'UPDATE '||p_interface_table_name||' UAI1
4642                       SET PROCESS_STATUS = PROCESS_STATUS + DECODE(('||l_tvs_num_val_check_select||'),0,'||G_PS_VALUE_NOT_IN_TVS||',0)
4643                     WHERE DATA_SET_ID = :data_set_id '||'
4644                       AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
4645                       AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
4646                       AND ATTR_INT_NAME = '''||l_attr_metadata_table(y).ATTR_NAME||'''
4647                       AND ATTR_GROUP_INT_NAME = '''||l_attr_group_metadata_obj.ATTR_GROUP_NAME||'''
4648                       AND ATTR_VALUE_NUM IS NOT NULL';
4649 
4650                   l_dynamic_sql :=
4651                   'UPDATE '||p_interface_table_name||' UAI1
4652                       SET ATTR_VALUE_NUM = NVL('||l_tvs_select||',NULL),
4653                           PROCESS_STATUS = PROCESS_STATUS + DECODE(('||l_tvs_select||'),NULL,'||G_PS_VALUE_NOT_IN_TVS||',0)
4654                     WHERE DATA_SET_ID = :data_set_id '||'
4655                       AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
4656                       AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
4657                       AND ATTR_INT_NAME = '''||l_attr_metadata_table(y).ATTR_NAME||'''
4658                       AND ATTR_GROUP_INT_NAME = '''||l_attr_group_metadata_obj.ATTR_GROUP_NAME||'''
4659                       AND ATTR_DISP_VALUE IS NOT NULL ';
4660                     -- We execute the above cursor in a PL/SQL block since we know that if this fails
4661                     -- it is because of wrong setup the user has created for table value sets, so we
4662                     -- need to mark the row as errored due to bad TVS setup.
4663                   BEGIN
4664                     EXECUTE IMMEDIATE l_dynamic_sql_1
4665                       USING p_data_set_id;
4666                     EXECUTE IMMEDIATE l_dynamic_sql
4667                       USING p_data_set_id;
4668 
4669                   EXCEPTION
4670                     WHEN OTHERS THEN
4671                       IF (l_bad_tvs_sql_cursor_id IS NULL) THEN
4672                         l_bad_tvs_sql_cursor_id := DBMS_SQL.Open_Cursor;
4673                         l_dynamic_sql :=
4674                         'UPDATE '||p_interface_table_name||'
4675                             SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_BAD_TVS_SETUP||'
4676                           WHERE DATA_SET_ID = :data_set_id
4677                             AND ATTR_INT_NAME = :attr_internal_name
4678                             AND ATTR_GROUP_INT_NAME = :attr_group_int_name';
4679 
4680                         DBMS_SQL.Parse(l_bad_tvs_sql_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
4681                         DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':data_set_id', p_data_set_id);
4682                       END IF;
4683                       DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':attr_group_int_name', l_attr_group_metadata_obj.ATTR_GROUP_NAME);
4684                       DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':attr_internal_name', l_attr_metadata_table(y).ATTR_NAME);
4685                       l_dummy := DBMS_SQL.Execute(l_bad_tvs_sql_cursor_id);
4686                   END;
4687                   */
4688 
4689                   Prepare_Dynamic_Sqls_Clob ( p_data_set_id               => p_data_set_id,
4690                                               p_data_type_code            => EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE,
4691                                               p_interface_table_name      => p_interface_table_name,
4692                                               p_tvs_val_check_sel_clob    => l_tvs_num_val_check_sel_clob,
4693                                               p_tvs_select_clob           => l_tvs_select_clob,
4694                                               p_attr_name                 => l_attr_metadata_table(y).ATTR_NAME,
4695                                               p_attr_group_name           => l_attr_group_metadata_obj.ATTR_GROUP_NAME,
4696                                               x_return_status             => l_return_status,
4697                                               x_msg_data                  => l_msg_data,
4698                                               x_sql_1_ub                  => l_sql_1_ub,
4699                                               x_sql_ub                    => l_sql_ub,
4700                                               x_dynamic_sql_1_v_type      => l_dynamic_sql_1_v_type,
4701                                               x_dynamic_sql_v_type        => l_dynamic_sql_v_type
4702                                             );
4703 
4704                   code_debug('          After Prepare_Dynamic_Sqls_Clob - l_return_status :'||l_return_status ,3);
4705 
4706                   IF (l_dynamic_sql_1_cursor_id IS NULL) THEN
4707                     l_dynamic_sql_1_cursor_id := DBMS_SQL.Open_Cursor;
4708                   END IF;
4709 
4710                   IF (l_dynamic_sql_cursor_id IS NULL) THEN
4711                     l_dynamic_sql_cursor_id := DBMS_SQL.Open_Cursor;
4712                   END IF;
4713 
4714                   code_debug('          Before parse  l_dynamic_sql_1_cursor_id - l_sql_1_ub :'||l_sql_1_ub ,3);
4715 
4716                   BEGIN
4717                     DBMS_SQL.PARSE( c                  => l_dynamic_sql_1_cursor_id,
4718                                     statement          => l_dynamic_sql_1_v_type,
4719                                     lb                 => 1,
4720                                     ub                 => l_sql_1_ub,
4721                                     lfflg              => false,
4722                                     language_flag      => dbms_sql.native );
4723 
4724 
4725                     DBMS_SQL.Bind_Variable(l_dynamic_sql_1_cursor_id, ':data_set_id', p_data_set_id);
4726                     code_debug('          EXECUTING l_dynamic_sql_1_cursor_id' ,3);
4727 
4728                     l_dummy := DBMS_SQL.Execute(l_dynamic_sql_1_cursor_id);
4729 
4730                     code_debug('          Before parse  l_dynamic_sql_cursor_id - l_sql_ub :'||l_sql_ub ,3);
4731 
4732                     DBMS_SQL.PARSE( c                  => l_dynamic_sql_cursor_id,
4733                                     statement          => l_dynamic_sql_v_type,
4734                                     lb                 => 1,
4735                                     ub                 => l_sql_ub,
4736                                     lfflg              => false,
4737                                     language_flag      => dbms_sql.native );
4738 
4739                     DBMS_SQL.Bind_Variable(l_dynamic_sql_cursor_id, ':data_set_id', p_data_set_id);
4740                     code_debug('          EXECUTING l_dynamic_sql_cursor_id' ,3);
4741 
4742                     l_dummy := DBMS_SQL.Execute(l_dynamic_sql_cursor_id);
4743                     code_debug('          EXECUTING DONE' ,3);
4744 
4745                   EXCEPTION
4746                     WHEN OTHERS THEN
4747                       IF (l_dynamic_sql_cursor_id) IS NOT NULL THEN
4748                         DBMS_SQL.Close_Cursor(l_dynamic_sql_cursor_id);
4749                       END IF;
4750 
4751                       IF (l_dynamic_sql_1_cursor_id) IS NOT NULL THEN
4752                         DBMS_SQL.Close_Cursor(l_dynamic_sql_1_cursor_id);
4753                       END IF;
4754                       code_debug('          ERROR  :'||SQLERRM  ,3);
4755 
4756                       IF (l_bad_tvs_sql_cursor_id IS NULL) THEN
4757                         l_bad_tvs_sql_cursor_id := DBMS_SQL.Open_Cursor;
4758                         l_dynamic_sql :=
4759                         'UPDATE '||p_interface_table_name||'
4760                             SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_BAD_TVS_SETUP||'
4761                           WHERE DATA_SET_ID = :data_set_id
4762                             AND ATTR_INT_NAME = :attr_internal_name
4763                             AND ATTR_GROUP_INT_NAME = :attr_group_int_name';
4764 
4765                         DBMS_SQL.Parse(l_bad_tvs_sql_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
4766                         DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':data_set_id', p_data_set_id);
4767                       END IF;
4768                       DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':attr_group_int_name', l_attr_group_metadata_obj.ATTR_GROUP_NAME);
4769                       DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':attr_internal_name', l_attr_metadata_table(y).ATTR_NAME);
4770                       l_dummy := DBMS_SQL.Execute(l_bad_tvs_sql_cursor_id);
4771                   END;
4772                   -- Bug 10151142 : End
4773 
4774                 ELSIF (l_attr_metadata_table(y).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE OR l_attr_metadata_table(y).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE) THEN
4775 
4776                   -- Bug 10151142 : Start
4777                   /*
4778                   l_dynamic_sql_1 :=
4779                   'UPDATE '||p_interface_table_name||' UAI1
4780                       SET PROCESS_STATUS = PROCESS_STATUS + DECODE(('||l_tvs_date_val_check_select||'),0,'||G_PS_VALUE_NOT_IN_TVS||',0)
4781                     WHERE DATA_SET_ID = :data_set_id '||'
4782                       AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
4783                       AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
4784                       AND ATTR_INT_NAME = '''||l_attr_metadata_table(y).ATTR_NAME||'''
4785                       AND ATTR_GROUP_INT_NAME = '''||l_attr_group_metadata_obj.ATTR_GROUP_NAME||'''
4786                       AND ATTR_VALUE_DATE IS NOT NULL';
4787 
4788                   l_dynamic_sql :=
4789                   'UPDATE '||p_interface_table_name||' UAI1
4790                       SET ATTR_VALUE_DATE = NVL('||l_tvs_select||',NULL),
4791                           PROCESS_STATUS = PROCESS_STATUS + DECODE(('||l_tvs_select||'),NULL,'||G_PS_VALUE_NOT_IN_TVS||',0)
4792                     WHERE DATA_SET_ID = :data_set_id '||'
4793                       AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
4794                       AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
4795                       AND ATTR_INT_NAME = '''||l_attr_metadata_table(y).ATTR_NAME||'''
4796                       AND ATTR_GROUP_INT_NAME = '''||l_attr_group_metadata_obj.ATTR_GROUP_NAME||'''
4797                       AND ATTR_DISP_VALUE IS NOT NULL ';
4798                     -- We execute the above cursor in a PL/SQL block since we know that if this fails
4799                   -- it is because of wrong setup the user has created for table value sets, so we
4800                   -- need to mark the row as errored due to bad TVS setup.
4801                   BEGIN
4802                     EXECUTE IMMEDIATE l_dynamic_sql_1
4803                       USING p_data_set_id;
4804                     EXECUTE IMMEDIATE l_dynamic_sql
4805                       USING p_data_set_id;
4806                   EXCEPTION
4807                     WHEN OTHERS THEN
4808                       IF (l_bad_tvs_sql_cursor_id IS NULL) THEN
4809                         l_bad_tvs_sql_cursor_id := DBMS_SQL.Open_Cursor;
4810                         l_dynamic_sql :=
4811                         'UPDATE '||p_interface_table_name||'
4812                             SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_BAD_TVS_SETUP||'
4813                           WHERE DATA_SET_ID = :data_set_id
4814                             AND ATTR_INT_NAME = :attr_internal_name
4815                             AND ATTR_GROUP_INT_NAME = :attr_group_int_name';
4816 
4817                         DBMS_SQL.Parse(l_bad_tvs_sql_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
4818                         DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':data_set_id', p_data_set_id);
4819                       END IF;
4820                       DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':attr_group_int_name', l_attr_group_metadata_obj.ATTR_GROUP_NAME);
4821                       DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':attr_internal_name', l_attr_metadata_table(y).ATTR_NAME);
4822                       l_dummy := DBMS_SQL.Execute(l_bad_tvs_sql_cursor_id);
4823                   END;
4824                   */
4825 
4826                   Prepare_Dynamic_Sqls_Clob ( p_data_set_id               => p_data_set_id,
4827                                               p_data_type_code            => EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE,
4828                                               p_interface_table_name      => p_interface_table_name,
4829                                               p_tvs_val_check_sel_clob    => l_tvs_date_val_check_sel_clob,
4830                                               p_tvs_select_clob           => l_tvs_select_clob,
4831                                               p_attr_name                 => l_attr_metadata_table(y).ATTR_NAME,
4832                                               p_attr_group_name           => l_attr_group_metadata_obj.ATTR_GROUP_NAME,
4833                                               x_return_status             => l_return_status,
4834                                               x_msg_data                  => l_msg_data,
4835                                               x_sql_1_ub                  => l_sql_1_ub,
4836                                               x_sql_ub                    => l_sql_ub,
4837                                               x_dynamic_sql_1_v_type      => l_dynamic_sql_1_v_type,
4838                                               x_dynamic_sql_v_type        => l_dynamic_sql_v_type
4839                                             );
4840 
4841                   code_debug('          After Prepare_Dynamic_Sqls_Clob - l_return_status :'||l_return_status ,3);
4842 
4843                   IF (l_dynamic_sql_1_cursor_id IS NULL) THEN
4844                     l_dynamic_sql_1_cursor_id := DBMS_SQL.Open_Cursor;
4845                   END IF;
4846 
4847                   IF (l_dynamic_sql_cursor_id IS NULL) THEN
4848                     l_dynamic_sql_cursor_id := DBMS_SQL.Open_Cursor;
4849                   END IF;
4850 
4851                   code_debug('          Before parse  l_dynamic_sql_1_cursor_id - l_sql_1_ub :'||l_sql_1_ub ,3);
4852 
4853                   BEGIN
4854                     DBMS_SQL.PARSE( c                  => l_dynamic_sql_1_cursor_id,
4855                                     statement          => l_dynamic_sql_1_v_type,
4856                                     lb                 => 1,
4857                                     ub                 => l_sql_1_ub,
4858                                     lfflg              => false,
4859                                     language_flag      => dbms_sql.native );
4860 
4861 
4862                     DBMS_SQL.Bind_Variable(l_dynamic_sql_1_cursor_id, ':data_set_id', p_data_set_id);
4863                     code_debug('          EXECUTING l_dynamic_sql_1_cursor_id' ,3);
4864 
4865                     l_dummy := DBMS_SQL.Execute(l_dynamic_sql_1_cursor_id);
4866 
4867                     code_debug('          Before parse  l_dynamic_sql_cursor_id - l_sql_ub :'||l_sql_ub ,3);
4868 
4869                     DBMS_SQL.PARSE( c                  => l_dynamic_sql_cursor_id,
4870                                     statement          => l_dynamic_sql_v_type,
4871                                     lb                 => 1,
4872                                     ub                 => l_sql_ub,
4873                                     lfflg              => false,
4874                                     language_flag      => dbms_sql.native );
4875 
4876                     DBMS_SQL.Bind_Variable(l_dynamic_sql_cursor_id, ':data_set_id', p_data_set_id);
4877                     code_debug('          EXECUTING l_dynamic_sql_cursor_id' ,3);
4878 
4879                     l_dummy := DBMS_SQL.Execute(l_dynamic_sql_cursor_id);
4880                     code_debug('          EXECUTING DONE' ,3);
4881                   EXCEPTION
4882                     WHEN OTHERS THEN
4883                       IF (l_dynamic_sql_cursor_id) IS NOT NULL THEN
4884                         DBMS_SQL.Close_Cursor(l_dynamic_sql_cursor_id);
4885                       END IF;
4886 
4887                       IF (l_dynamic_sql_1_cursor_id) IS NOT NULL THEN
4888                         DBMS_SQL.Close_Cursor(l_dynamic_sql_1_cursor_id);
4889                       END IF;
4890 
4891                       code_debug('          ERROR  :'||SQLERRM  ,3);
4892                       IF (l_bad_tvs_sql_cursor_id IS NULL) THEN
4893                         l_bad_tvs_sql_cursor_id := DBMS_SQL.Open_Cursor;
4894                         l_dynamic_sql :=
4895                         'UPDATE '||p_interface_table_name||'
4896                             SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_BAD_TVS_SETUP||'
4897                           WHERE DATA_SET_ID = :data_set_id
4898                             AND ATTR_INT_NAME = :attr_internal_name
4899                             AND ATTR_GROUP_INT_NAME = :attr_group_int_name';
4900 
4901                         DBMS_SQL.Parse(l_bad_tvs_sql_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
4902                         DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':data_set_id', p_data_set_id);
4903                       END IF;
4904                       DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':attr_group_int_name', l_attr_group_metadata_obj.ATTR_GROUP_NAME);
4905                       DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':attr_internal_name', l_attr_metadata_table(y).ATTR_NAME);
4906                       l_dummy := DBMS_SQL.Execute(l_bad_tvs_sql_cursor_id);
4907                   END;
4908                   -- Bug 10151142 : End
4909 
4910                 ELSE
4911 /*                  l_dynamic_sql :=
4912                   'UPDATE '||p_interface_table_name||' UAI1
4913                       SET ATTR_VALUE_STR = NVL(ATTR_VALUE_STR,'||l_tvs_select||'),
4914                           PROCESS_STATUS = PROCESS_STATUS + DECODE(NVL2(ATTR_VALUE_STR,
4915                                                             '||l_tvs_str_val_check_select||',
4916                                                             NVL2('||l_tvs_select||',1,NULL)
4917                                                             ),
4918                                     NULL,
4919                                 '||G_PS_VALUE_NOT_IN_TVS||'
4920                                 ,0)
4921                     WHERE DATA_SET_ID = '||p_data_set_id||'
4922                       AND PROCESS_STATUS <> 3
4923                       AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
4924                       AND ATTR_INT_NAME = '''||l_attr_metadata_table(y).ATTR_NAME||'''
4925                       AND ATTR_GROUP_INT_NAME = '''||l_attr_group_metadata_obj.ATTR_GROUP_NAME||''' ';
4926 */
4927                   -- Bug 10151142 : Start
4928                   /*
4929                   l_dynamic_sql_1 :=
4930                   'UPDATE '||p_interface_table_name||' UAI1
4931                       SET PROCESS_STATUS = PROCESS_STATUS + DECODE(('||l_tvs_str_val_check_select||'),0,'||G_PS_VALUE_NOT_IN_TVS||',0)
4932                     WHERE DATA_SET_ID = :data_set_id '||'
4933                       AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
4934                       AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
4935                       AND ATTR_INT_NAME = '''||l_attr_metadata_table(y).ATTR_NAME||'''
4936                       AND ATTR_GROUP_INT_NAME = '''||l_attr_group_metadata_obj.ATTR_GROUP_NAME||'''
4937                       AND ATTR_VALUE_STR IS NOT NULL';
4938 
4939                   l_dynamic_sql :=
4940                   'UPDATE '||p_interface_table_name||' UAI1
4941                       SET ATTR_VALUE_STR = NVL('||l_tvs_select||',NULL),
4942                           PROCESS_STATUS = PROCESS_STATUS + DECODE(('||l_tvs_select||'),NULL,'||G_PS_VALUE_NOT_IN_TVS||',0)
4943                     WHERE DATA_SET_ID = :data_set_id '||'
4944                       AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
4945                       AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
4946                       AND ATTR_INT_NAME = '''||l_attr_metadata_table(y).ATTR_NAME||'''
4947                       AND ATTR_GROUP_INT_NAME = '''||l_attr_group_metadata_obj.ATTR_GROUP_NAME||'''
4948                       AND ATTR_DISP_VALUE IS NOT NULL ';
4949                   -- We execute the above cursor in a PL/SQL block since we know that if this fails
4950                   -- it is because of wrong setup the user has created for table value sets, so we
4951                   -- need to mark the row as errored due to bad TVS setup.
4952                   BEGIN
4953                     EXECUTE IMMEDIATE l_dynamic_sql_1
4954                       USING p_data_set_id;
4955                     EXECUTE IMMEDIATE l_dynamic_sql
4956                       USING p_data_set_id;
4957                   EXCEPTION
4958                     WHEN OTHERS THEN
4959                       IF (l_bad_tvs_sql_cursor_id IS NULL) THEN
4960                         l_bad_tvs_sql_cursor_id := DBMS_SQL.Open_Cursor;
4961                         l_dynamic_sql :=
4962                         'UPDATE '||p_interface_table_name||'
4963                             SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_BAD_TVS_SETUP||'
4964                           WHERE DATA_SET_ID = :data_set_id
4965                             AND ATTR_INT_NAME = :attr_internal_name
4966                             AND ATTR_GROUP_INT_NAME = :attr_group_int_name';
4967 
4968                         DBMS_SQL.Parse(l_bad_tvs_sql_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
4969                         DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':data_set_id', p_data_set_id);
4970                       END IF;
4971                       DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':attr_group_int_name', l_attr_group_metadata_obj.ATTR_GROUP_NAME);
4972                       DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':attr_internal_name', l_attr_metadata_table(y).ATTR_NAME);
4973                       l_dummy := DBMS_SQL.Execute(l_bad_tvs_sql_cursor_id);
4974                   END;
4975                   */
4976 
4977                   Prepare_Dynamic_Sqls_Clob ( p_data_set_id               => p_data_set_id,
4978                                               p_data_type_code            => EGO_EXT_FWK_PUB.G_CHAR_DATA_TYPE,
4979                                               p_interface_table_name      => p_interface_table_name,
4980                                               p_tvs_val_check_sel_clob    => l_tvs_str_val_check_sel_clob,
4981                                               p_tvs_select_clob           => l_tvs_select_clob,
4982                                               p_attr_name                 => l_attr_metadata_table(y).ATTR_NAME,
4983                                               p_attr_group_name           => l_attr_group_metadata_obj.ATTR_GROUP_NAME,
4984                                               x_return_status             => l_return_status,
4985                                               x_msg_data                  => l_msg_data,
4986                                               x_sql_1_ub                  => l_sql_1_ub,
4987                                               x_sql_ub                    => l_sql_ub,
4988                                               x_dynamic_sql_1_v_type      => l_dynamic_sql_1_v_type,
4989                                               x_dynamic_sql_v_type        => l_dynamic_sql_v_type
4990                                             );
4991 
4992                   code_debug('          After Prepare_Dynamic_Sqls_Clob - l_return_status :'||l_return_status ,3);
4993 
4994                   IF (l_dynamic_sql_1_cursor_id IS NULL) THEN
4995                     l_dynamic_sql_1_cursor_id := DBMS_SQL.Open_Cursor;
4996                   END IF;
4997 
4998                   IF (l_dynamic_sql_cursor_id IS NULL) THEN
4999                     l_dynamic_sql_cursor_id := DBMS_SQL.Open_Cursor;
5000                   END IF;
5001 
5002                   code_debug('          Before parse  l_dynamic_sql_1_cursor_id - l_sql_1_ub :'||l_sql_1_ub ,3);
5003 
5004                   BEGIN
5005                     DBMS_SQL.PARSE( c                  => l_dynamic_sql_1_cursor_id,
5006                                     statement          => l_dynamic_sql_1_v_type,
5007                                     lb                 => 1,
5008                                     ub                 => l_sql_1_ub,
5009                                     lfflg              => false,
5010                                     language_flag      => dbms_sql.native );
5011 
5012 
5013                     DBMS_SQL.Bind_Variable(l_dynamic_sql_1_cursor_id, ':data_set_id', p_data_set_id);
5014                     code_debug('          EXECUTING l_dynamic_sql_1_cursor_id' ,3);
5015 
5016                     l_dummy := DBMS_SQL.Execute(l_dynamic_sql_1_cursor_id);
5017 
5018                     code_debug('          Before parse  l_dynamic_sql_1_cursor_id - l_sql_ub :'||l_sql_ub ,3);
5019 
5020                     DBMS_SQL.PARSE( c                  => l_dynamic_sql_cursor_id,
5021                                     statement          => l_dynamic_sql_v_type,
5022                                     lb                 => 1,
5023                                     ub                 => l_sql_ub,
5024                                     lfflg              => false,
5025                                     language_flag      => dbms_sql.native );
5026 
5027                     DBMS_SQL.Bind_Variable(l_dynamic_sql_cursor_id, ':data_set_id', p_data_set_id);
5028                     code_debug('          EXECUTING l_dynamic_sql_cursor_id' ,3);
5029 
5030                     l_dummy := DBMS_SQL.Execute(l_dynamic_sql_cursor_id);
5031                     code_debug('          EXECUTING DONE' ,3);
5032                   EXCEPTION
5033                     WHEN OTHERS THEN
5034                         IF (l_dynamic_sql_cursor_id) IS NOT NULL THEN
5035                           DBMS_SQL.Close_Cursor(l_dynamic_sql_cursor_id);
5036                         END IF;
5037 
5038                         IF (l_dynamic_sql_1_cursor_id) IS NOT NULL THEN
5039                           DBMS_SQL.Close_Cursor(l_dynamic_sql_1_cursor_id);
5040                         END IF;
5041 
5042                     code_debug('          ERROR  :'||SQLERRM  ,3);
5043                     IF (l_bad_tvs_sql_cursor_id IS NULL) THEN
5044                       l_bad_tvs_sql_cursor_id := DBMS_SQL.Open_Cursor;
5045                       l_dynamic_sql :=
5046                       'UPDATE '||p_interface_table_name||'
5047                           SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_BAD_TVS_SETUP||'
5048                         WHERE DATA_SET_ID = :data_set_id
5049                           AND ATTR_INT_NAME = :attr_internal_name
5050                           AND ATTR_GROUP_INT_NAME = :attr_group_int_name';
5051 
5052                       DBMS_SQL.Parse(l_bad_tvs_sql_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
5053                       DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':data_set_id', p_data_set_id);
5054                     END IF;
5055                     DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':attr_group_int_name', l_attr_group_metadata_obj.ATTR_GROUP_NAME);
5056                     DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':attr_internal_name', l_attr_metadata_table(y).ATTR_NAME);
5057                     l_dummy := DBMS_SQL.Execute(l_bad_tvs_sql_cursor_id);
5058                   END;
5059                   -- Bug 10151142 : End
5060 
5061                 END IF;
5062               END IF; --l_attr_metadata fetched TRUE/FALSE
5063             END IF; -- if validation_code is TVS
5064           END IF;--the if attr exists in the intf table ends.
5065         END LOOP;
5066 
5067         code_debug('          After the TVS check ' ,2);
5068 
5069         ------------------------------------------------
5070         -- Here we error out the MR AG rows which have
5071         -- a wrong transaction type (UPDATE, CREATE)
5072         ------------------------------------------------
5073         l_dynamic_sql :=
5074         ' UPDATE /*+ INDEX(UAI1,EGO_ITM_USR_ATTR_INTRFC_N3) */  /* Bug 9678667 */ '||p_interface_table_name||' UAI1
5075             SET UAI1.PROCESS_STATUS = PROCESS_STATUS +
5076                                       DECODE(UAI1.TRANSACTION_TYPE,
5077                                              '''||EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||''', '||G_PS_BAD_TTYPE_CREATE||',
5078                                              '''||EGO_USER_ATTRS_DATA_PVT.G_UPDATE_MODE||''', '||G_PS_BAD_TTYPE_UPDATE||',
5079                                              '''||EGO_USER_ATTRS_DATA_PVT.G_DELETE_MODE||''', '||G_PS_BAD_TTYPE_DELETE||',0)
5080           WHERE UAI1.DATA_SET_ID = :data_set_id '||--p_data_set_id||
5081           ' AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||
5082           ' AND UAI1.ATTR_GROUP_TYPE = '''||p_attr_group_type||''' '||
5083           ' AND UAI1.TRANSACTION_TYPE <> '''||EGO_USER_ATTRS_DATA_PVT.G_SYNC_MODE||
5084         ''' AND UAI1.ATTR_GROUP_INT_NAME = '''||
5085                 l_attr_group_metadata_obj.ATTR_GROUP_NAME||
5086         ''' AND UAI1.ROW_IDENTIFIER IN (
5087                 SELECT DISTINCT UAI2.ROW_IDENTIFIER
5088                   FROM '||p_interface_table_name||' UAI2
5089                  WHERE UAI2.DATA_SET_ID = :data_set_id '||--p_data_set_id||
5090                  ' AND UAI2.PROCESS_STATUS = '||G_PS_IN_PROCESS;
5091 
5092         l_dynamic_sql := l_dynamic_sql||' AND (SELECT COUNT(*) FROM '||l_ext_table_select||')
5093                           = DECODE(UAI2.TRANSACTION_TYPE,
5094                              '''||EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||''', 1,
5095                              '''||EGO_USER_ATTRS_DATA_PVT.G_UPDATE_MODE||''', 0,
5096                              '''||EGO_USER_ATTRS_DATA_PVT.G_DELETE_MODE||''', 0))';
5097 
5098         EXECUTE IMMEDIATE l_dynamic_sql
5099         USING p_data_set_id, p_data_set_id;/*Fix for bug#9678667. Literal to bind*/
5100         code_debug('          After transaction type validation ' ,2);
5101 
5102         --------------------------------------------------
5103         -- Here we update the INTF table transaction_type
5104         -- from SYNC to CREATE or UPDATE
5105         --------------------------------------------------
5106         l_dynamic_sql :=
5107         ' UPDATE '||p_interface_table_name||' UAI1
5108             SET UAI1.TRANSACTION_TYPE = DECODE((SELECT COUNT(*) FROM '||l_ext_table_select||'),0,'''||
5109                                                EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||''','''||
5110                                                EGO_USER_ATTRS_DATA_PVT.G_UPDATE_MODE||''')
5111           WHERE UAI1.DATA_SET_ID = '||p_data_set_id||
5112           ' AND UAI1.ATTR_GROUP_INT_NAME = '''||l_attr_group_metadata_obj.ATTR_GROUP_NAME||
5113        '''  AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||
5114           ' AND UAI1.TRANSACTION_TYPE = '''||EGO_USER_ATTRS_DATA_PVT.G_SYNC_MODE||'''';
5115 
5116           --ER 9489112, do not convert SYNC to CREATE/UPDATE for item rev level Multi Row UDA when change order be created
5117           --Current UDA chanage be put in change order controll since rev level UDA will defaulted from
5118           --current revision when new revision created. rev level UDA defauled when the new revision
5119           --is created by change Service ChangeImportManager.createItemRevChangeMethodRequests later.
5120           IF  l_data_level_col_exists  AND l_add_all_to_cm = 'Y' THEN
5121             l_dynamic_sql := l_dynamic_sql || ' AND UAI1.DATA_LEVEL_ID <> ' ||l_item_rev_dl_id ;
5122           END IF;
5123         code_debug('l_dynamic_sql to update Transaction type for MR Row '||l_attr_group_metadata_obj.ATTR_GROUP_NAME ||':' || l_dynamic_sql,2);
5124         EXECUTE IMMEDIATE l_dynamic_sql;
5125 
5126         code_debug('          After transaction type updation ' ,2);
5127 
5128         END IF; -- *p_validate-IF-2* ending the IF for p_validate...
5129       END IF; -- ending MR specific work
5130 
5131       ----------------------------------------------------
5132       -- Folowing validations are also done only if the --
5133       -- API is called with p_validate = TRUE           --
5134       ----------------------------------------------------
5135       IF (p_validate OR p_do_req_def_valiadtion) THEN   -- Search for *p_validate-IF-3.1* to find the ending of this loop
5136 
5137         /* Bug 9678667 - Start
5138         -- Below query inserts the Default UDAs for a given AG in a single query instead of looping through the attributes.
5139         */
5140         code_debug('          Before Inserting Default rows for AG :'||l_attr_group_intf_rec.ATTR_GROUP_INT_NAME );
5141 		/* Bug 14044344
5142 		-- Add setting value for column CHANGE_ID,CHANGE_LINE_ID,PROG_INT_CHAR2,PROG_INT_NUM4, so that default value line will go with the original change line in implementation phase.
5143 		-- By QIXIA 2012-07-05
5144 		*/
5145 
5146         l_extra_column_str := '';
5147 
5148 	/*start bug 14672950 commented below lines as these columns are not needed to AG defaulting query except column PROG_INT_CHAR2.
5149 	  It is causing regresion when AG is having default attributes and template filled attributes.
5150 	  In validation mode,
5151           value for prog_int_chr2 is null for template filled and AG default records.
5152 	  So the inner select query with group by is returing multiple AG records.
5153 	  Hence reverting the changes for bug 14044344 in this file.
5154 
5155 	  In validation mode,
5156           value for prog_int_chr2 is null for template filled and AG default records.
5157           In non validation mode,
5158           value N is set if it is update.
5159           Value Y if same item is created in this batch.
5160           Hence no harm in hard-coding prog_int_chr2 with value N while defaulting at AG level.
5161 
5162 	  Removed this column from inner select query as it returns morethan one entry for single AG (Reason: this column holds different values for user enetered records and
5163 	  defaulting records).
5164 	  For more details about this issue refer to update *** GNOOKALA 10/29/12 02:11 am *** in bug 14672950 */
5165         --IF FND_API.TO_BOOLEAN(EGO_USER_ATTRS_COMMON_PVT.has_column_in_table(p_interface_table_name, 'CHANGE_ID')) THEN l_extra_column_str := l_extra_column_str || ', CHANGE_ID'; END IF;
5166         --IF FND_API.TO_BOOLEAN(EGO_USER_ATTRS_COMMON_PVT.has_column_in_table(p_interface_table_name, 'CHANGE_LINE_ID')) THEN l_extra_column_str := l_extra_column_str || ', CHANGE_LINE_ID'; END IF;
5167         --IF FND_API.TO_BOOLEAN(EGO_USER_ATTRS_COMMON_PVT.has_column_in_table(p_interface_table_name, 'PROG_INT_CHAR2')) THEN l_extra_column_str := l_extra_column_str || ', PROG_INT_CHAR2'; END IF;
5168         --IF FND_API.TO_BOOLEAN(EGO_USER_ATTRS_COMMON_PVT.has_column_in_table(p_interface_table_name, 'PROG_INT_NUM4')) THEN l_extra_column_str := l_extra_column_str || ', PROG_INT_NUM4'; END IF;
5169          l_extra_column_val := '';
5170 	IF FND_API.TO_BOOLEAN(EGO_USER_ATTRS_COMMON_PVT.has_column_in_table(p_interface_table_name, 'PROG_INT_CHAR2')) THEN
5171            l_extra_column_str := l_extra_column_str || ', PROG_INT_CHAR2';
5172            l_extra_column_val := l_extra_column_val || ', ''N''';
5173         END IF;
5174 	/*end bug 14672950*/
5175 
5176         l_dynamic_sql :=
5177                 'INSERT INTO '||p_interface_table_name||'
5178                             ( TRANSACTION_ID,
5179                               ATTR_GROUP_TYPE,
5180                               PROCESS_STATUS,
5181                               DATA_SET_ID,
5182                               ROW_IDENTIFIER,
5183                               ATTR_GROUP_INT_NAME,
5184                               ATTR_INT_NAME,
5185                               ATTR_VALUE_NUM,
5186                               ATTR_VALUE_STR,
5187                               ATTR_VALUE_DATE,
5188                               TRANSACTION_TYPE,
5189                               '||l_concat_pk_cols_sel||'
5190                               ATTR_GROUP_ID,
5191                               CREATED_BY,
5192                               CREATION_DATE,
5193                               LAST_UPDATED_BY,
5194                               LAST_UPDATE_DATE' || l_extra_column_str || '
5195                             )
5196                   SELECT DISTINCT TRANSACTION_ID,
5197                                   FL_COL.DESCRIPTIVE_FLEXFIELD_NAME,
5198                                   '||G_PS_IN_PROCESS||',
5199                                   DATA_SET_ID,
5200                                   ROW_IDENTIFIER,
5201                                   ATTR_GROUP_INT_NAME,
5202                                   FL_COL.END_USER_COLUMN_NAME,
5203                                   TO_NUMBER(DECODE(ATTR_EXT.DATA_TYPE, ''N'', FL_COL.DEFAULT_VALUE,
5204                                                                         NULL)),
5205                                   DECODE(ATTR_EXT.DATA_TYPE, ''A'', FL_COL.DEFAULT_VALUE,
5206                                                               ''C'', FL_COL.DEFAULT_VALUE,
5207                                                               NULL),
5208                                   DECODE(ATTR_EXT.DATA_TYPE, ''X'', EGO_USER_ATTRS_BULK_PVT.GET_DATE(FL_COL.DEFAULT_VALUE, NULL),
5209                                                               ''Y'', EGO_USER_ATTRS_BULK_PVT.GET_DATE(FL_COL.DEFAULT_VALUE, NULL),
5210                                                               NULL),
5211                                   '''|| EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||''',
5212                                   '|| l_concat_pk_cols_sel ||'
5213                                   ATTR_GROUP_ID,
5214                                   FND_GLOBAL.USER_ID,
5215                                   SYSDATE,
5216                                   FND_GLOBAL.USER_ID,
5217                                   SYSDATE' || l_extra_column_val || '
5218                   FROM  (SELECT /*+ NO_MERGE index(A,EGO_ITM_USR_ATTR_INTRFC_N1) */
5219                          MAX(TRANSACTION_ID) TRANSACTION_ID,
5220                                   DATA_SET_ID,
5221                                   ROW_IDENTIFIER,
5222                                   ATTR_GROUP_INT_NAME,
5223                                   '|| l_concat_pk_cols_sel ||'
5224                                   ATTR_GROUP_ID
5225                           FROM   '||p_interface_table_name||' A
5226                           WHERE  DATA_SET_ID = :data_set_id
5227                                  AND PROCESS_STATUS = '||G_PS_IN_PROCESS|| '
5228                                  AND ATTR_GROUP_INT_NAME = :attr_group_int_name
5229                                  AND Bitand(PROCESS_STATUS, 64) = 0
5230                                  AND TRANSACTION_TYPE = '''|| EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||'''
5231                                  AND ATTR_GROUP_TYPE = :attr_group_type
5232                           GROUP  BY DATA_SET_ID,
5233                                     ROW_IDENTIFIER,
5234                                     ATTR_GROUP_INT_NAME,
5235                                     '|| l_concat_pk_cols_sel ||'
5236                                     ATTR_GROUP_ID
5237                         ) A,
5238                         FND_DESCR_FLEX_COLUMN_USAGES FL_COL,
5239                         EGO_FND_DF_COL_USGS_EXT ATTR_EXT
5240                   WHERE NOT EXISTS (SELECT /*+ no_unnest index(B,EGO_ITM_USR_ATTR_INTRFC_U1) */ NULL
5241                                     FROM   '||p_interface_table_name||' B
5242                                     WHERE  DATA_SET_ID = :data_set_id
5243                                            AND B.ATTR_INT_NAME = FL_COL.END_USER_COLUMN_NAME
5244                                            AND A.ROW_IDENTIFIER = B.ROW_IDENTIFIER
5245                                            AND B.ATTR_GROUP_INT_NAME = :attr_group_int_name
5246                                    )
5247                         AND :attr_group_int_name = FL_COL.DESCRIPTIVE_FLEX_CONTEXT_CODE
5248                         AND FL_COL.APPLICATION_ID  = '||p_application_id||'
5249                         AND FL_COL.DESCRIPTIVE_FLEXFIELD_NAME =  :attr_group_type
5250                         AND FL_COL.ENABLED_FLAG = ''Y''
5251                         AND (FL_COL.DEFAULT_VALUE IS NOT NULL OR FL_COL.REQUIRED_FLAG = ''Y'')
5252                         AND ATTR_EXT.APPLICATION_ID = FL_COL.APPLICATION_ID
5253                         AND ATTR_EXT.DESCRIPTIVE_FLEXFIELD_NAME = FL_COL.DESCRIPTIVE_FLEXFIELD_NAME
5254                         AND ATTR_EXT.DESCRIPTIVE_FLEX_CONTEXT_CODE = FL_COL.DESCRIPTIVE_FLEX_CONTEXT_CODE
5255                         AND ATTR_EXT.APPLICATION_COLUMN_NAME = FL_COL.APPLICATION_COLUMN_NAME';
5256 
5257         EXECUTE IMMEDIATE l_dynamic_sql
5258         USING p_data_set_id
5259              ,l_attr_group_intf_rec.ATTR_GROUP_INT_NAME
5260              ,p_attr_group_type
5261              ,p_data_set_id
5262              ,l_attr_group_intf_rec.ATTR_GROUP_INT_NAME
5263              ,l_attr_group_intf_rec.ATTR_GROUP_INT_NAME
5264              ,p_attr_group_type;
5265 
5266         code_debug('           After Inserting Default rows for AG :'||l_attr_group_intf_rec.ATTR_GROUP_INT_NAME );
5267         /* Bug 9678667 - End */
5268 
5269         ------------------------------------------------------------------------------
5270         -- HERE WE COPY THE DEFAULT VALUE FOR THE ATTRIBUTE FROM THE METADATA IF NO --
5271         -- VALUE HAS BEEN PROVIDED FOR THE ATTRIBUTE                                --
5272         ------------------------------------------------------------------------------
5273         --rathna LOOP THROUGH ALL THE ATTRS METADATA FOR THIS AG
5274         FOR z IN l_attr_metadata_table_1.FIRST .. l_attr_metadata_table_1.LAST
5275         LOOP
5276 
5277           IF (l_attr_metadata_table_1(z).DEFAULT_VALUE IS NOT NULL OR
5278               l_attr_metadata_table_1(z).REQUIRED_FLAG = 'Y' AND p_do_req_def_valiadtion) THEN
5279 
5280             /* Bug 9678667 : Start - Commenting the below Code
5281             -- The below logic of inserting Default UDAs is done above out of the loop as a single query per AG
5282             */
5283             /*
5284 
5285             code_debug('          Attribute '||l_attr_metadata_table_1(z).ATTR_NAME|| ' has a default value or is a required attribute' ,2);
5286             --------- FOR NUMBER DATATYPE
5287             IF(l_attr_metadata_table_1(z).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
5288               IF (l_default_num_cursor_id IS NULL) THEN
5289                 l_default_num_cursor_id := DBMS_SQL.Open_Cursor;
5290                 l_dynamic_sql :=
5291                 'INSERT INTO '||p_interface_table_name||' ( TRANSACTION_ID,
5292                       PROCESS_STATUS                 ,
5293                       DATA_SET_ID                    ,
5294                       ROW_IDENTIFIER                 ,
5295                       ATTR_GROUP_INT_NAME            ,
5296                       ATTR_INT_NAME                  ,
5297                       ATTR_VALUE_NUM                 ,
5298                       TRANSACTION_TYPE               ,'||l_concat_pk_cols_sel||'
5299                       ATTR_GROUP_ID,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE)
5300                   SELECT /*+ index(A,EGO_ITM_USR_ATTR_INTRFC_N1) */   /* Fix for bug#9678667 */
5301            /* Bug 9678667           MAX(TRANSACTION_ID),'||G_PS_IN_PROCESS||',DATA_SET_ID,ROW_IDENTIFIER,:attr_group_int_name,:attr_internal_name,
5302                                   :default_value,'''|| EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||''','|| l_concat_pk_cols_sel ||'
5303                                   ATTR_GROUP_ID,MAX(CREATED_BY),SYSDATE,MAX(LAST_UPDATED_BY),SYSDATE
5304                   FROM '||p_interface_table_name||' A
5305                   WHERE NOT EXISTS (
5306                           SELECT  /*+ no_unnest index(B,EGO_ITM_USR_ATTR_INTRFC_U1) */  /* Fix for bug#9678667 */
5307            /* Bug 9678667                     NULL
5308                             FROM '||p_interface_table_name||' B
5309                            WHERE DATA_SET_ID = A.DATA_SET_ID
5310                              AND B.ATTR_INT_NAME = :attr_internal_name
5311                              -- AND B.ATTR_GROUP_INT_NAME = A.ATTR_GROUP_INT_NAME /* Fix for bug#9678667 */
5312                              --AND B.TRANSACTION_TYPE = A.TRANSACTION_TYPE
5313           /* Bug 9678667                   AND A.ROW_IDENTIFIER = B.ROW_IDENTIFIER)
5314                     AND DATA_SET_ID = :data_set_id
5315                     AND ATTR_GROUP_INT_NAME = :attr_group_int_name
5316                     AND PROCESS_STATUS = '||G_PS_IN_PROCESS|| '
5317                     AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
5318                     AND TRANSACTION_TYPE = '''|| EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||'''
5319                   GROUP BY DATA_SET_ID,ROW_IDENTIFIER,'|| l_concat_pk_cols_sel ||' ATTR_GROUP_ID' ;
5320                 DBMS_SQL.Parse(l_default_num_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
5321                 DBMS_SQL.Bind_Variable(l_default_num_cursor_id, ':data_set_id', p_data_set_id);
5322               END IF;
5323 
5324               DBMS_SQL.Bind_Variable(l_default_num_cursor_id, ':attr_group_int_name', l_attr_metadata_table_1(z).ATTR_GROUP_NAME);
5325               DBMS_SQL.Bind_Variable(l_default_num_cursor_id, ':attr_internal_name', l_attr_metadata_table_1(z).ATTR_NAME);
5326               DBMS_SQL.Bind_Variable(l_default_num_cursor_id, ':default_value', l_attr_metadata_table_1(z).DEFAULT_VALUE);
5327               l_dummy := DBMS_SQL.Execute(l_default_num_cursor_id);
5328               -- We need to add the attr in the distinct attrs table, since now we have to process this one also
5329               IF (l_attr_metadata_table_1(z).DEFAULT_VALUE IS NOT NULL AND l_dummy > 0 ) THEN
5330                 l_dist_attr_in_data_set_rec.ATTR_GROUP_ID := l_attr_metadata_table_1(z).ATTR_GROUP_ID;
5331                 l_dist_attr_in_data_set_rec.ATTR_INT_NAME := l_attr_metadata_table_1(z).ATTR_NAME;
5332                 l_dist_attr_in_data_set_rec.ATTR_GROUP_INT_NAME := l_attr_metadata_table_1(z).ATTR_GROUP_NAME;
5333 
5334                 l_dist_attrs_in_data_set_table(l_dist_attrs_in_data_set_table.COUNT+1) := l_dist_attr_in_data_set_rec;
5335               END IF;
5336 
5337             --------- FOR DATE DATATYPE
5338             ELSIF(l_attr_metadata_table_1(z).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE OR
5339                   l_attr_metadata_table_1(z).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE) THEN
5340               IF (l_default_date_cursor_id IS NULL) THEN
5341                 l_default_date_cursor_id := DBMS_SQL.Open_Cursor;
5342                 l_dynamic_sql :=
5343                 'INSERT INTO '||p_interface_table_name||' ( TRANSACTION_ID,
5344                       PROCESS_STATUS                 ,
5345                       DATA_SET_ID                    ,
5346                       ROW_IDENTIFIER                 ,
5347                       ATTR_GROUP_INT_NAME            ,
5348                       ATTR_INT_NAME                  ,
5349                       ATTR_VALUE_DATE                ,
5350                       TRANSACTION_TYPE               ,'||l_concat_pk_cols_sel||'
5351                       ATTR_GROUP_ID,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE)
5352                   SELECT /*+ index(A,EGO_ITM_USR_ATTR_INTRFC_N1) */   /* Fix for bug#9678667 */
5353            /* Bug 9678667           MAX(TRANSACTION_ID),'||G_PS_IN_PROCESS||',DATA_SET_ID,ROW_IDENTIFIER,:attr_group_int_name,:attr_internal_name,
5354                                   :default_value,'''|| EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||''','|| l_concat_pk_cols_sel ||'
5355                                   ATTR_GROUP_ID,MAX(CREATED_BY),SYSDATE,MAX(LAST_UPDATED_BY),SYSDATE
5356                   FROM '||p_interface_table_name||' A
5357                   WHERE NOT EXISTS (
5358                           SELECT /*+ no_unnest index(B,EGO_ITM_USR_ATTR_INTRFC_U1) */ /* Fix for bug#9678667 */
5359           /* Bug 9678667                      NULL
5360                             FROM '||p_interface_table_name||' B
5361                            WHERE DATA_SET_ID = A.DATA_SET_ID
5362                              AND B.ATTR_INT_NAME = :attr_internal_name
5363                              -- AND B.ATTR_GROUP_INT_NAME = A.ATTR_GROUP_INT_NAME /* Fix for bug#9678667 */
5364                              --AND B.TRANSACTION_TYPE = A.TRANSACTION_TYPE
5365          /* Bug 9678667                    AND A.ROW_IDENTIFIER = B.ROW_IDENTIFIER)
5366                     AND DATA_SET_ID = :data_set_id
5367                     AND ATTR_GROUP_INT_NAME = :attr_group_int_name
5368                     AND PROCESS_STATUS = '||G_PS_IN_PROCESS|| '
5369                     AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
5370                     AND TRANSACTION_TYPE = '''|| EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||'''
5371                   GROUP BY DATA_SET_ID,ROW_IDENTIFIER,'|| l_concat_pk_cols_sel ||' ATTR_GROUP_ID' ;
5372                 DBMS_SQL.Parse(l_default_date_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
5373                 DBMS_SQL.Bind_Variable(l_default_date_cursor_id, ':data_set_id', p_data_set_id);
5374               END IF;
5375 
5376               DBMS_SQL.Bind_Variable(l_default_date_cursor_id, ':attr_group_int_name', l_attr_metadata_table_1(z).ATTR_GROUP_NAME);
5377               DBMS_SQL.Bind_Variable(l_default_date_cursor_id, ':attr_internal_name', l_attr_metadata_table_1(z).ATTR_NAME);
5378               DBMS_SQL.Bind_Variable(l_default_date_cursor_id, ':default_value', Get_Date(l_attr_metadata_table_1(z).DEFAULT_VALUE));
5379 -- bug 3902395
5380 --              l_dummy := DBMS_SQL.Execute(l_default_num_cursor_id);
5381               l_dummy := DBMS_SQL.Execute(l_default_date_cursor_id);
5382               -- We need to add the attr in the distinct attrs table, since now we have to process this one also
5383               IF (l_attr_metadata_table_1(z).DEFAULT_VALUE IS NOT NULL AND l_dummy > 0 ) THEN
5384                 l_dist_attr_in_data_set_rec.ATTR_GROUP_ID := l_attr_metadata_table_1(z).ATTR_GROUP_ID;
5385                 l_dist_attr_in_data_set_rec.ATTR_INT_NAME := l_attr_metadata_table_1(z).ATTR_NAME;
5386                 l_dist_attr_in_data_set_rec.ATTR_GROUP_INT_NAME := l_attr_metadata_table_1(z).ATTR_GROUP_NAME;
5387 
5388                 l_dist_attrs_in_data_set_table(l_dist_attrs_in_data_set_table.COUNT+1) := l_dist_attr_in_data_set_rec;
5389               END IF;
5390 
5391             --------- FOR CHAR/TRANS DATATYPE
5392             ELSE
5393               IF (l_default_char_cursor_id IS NULL) THEN
5394                 l_default_char_cursor_id := DBMS_SQL.Open_Cursor;
5395                 l_dynamic_sql :=
5396                 'INSERT INTO '||p_interface_table_name||' ( TRANSACTION_ID,
5397                       PROCESS_STATUS                 ,
5398                       DATA_SET_ID                    ,
5399                       ROW_IDENTIFIER                 ,
5400                       ATTR_GROUP_INT_NAME            ,
5401                       ATTR_INT_NAME                  ,
5402                       ATTR_VALUE_STR                 ,
5403                       TRANSACTION_TYPE               ,'||l_concat_pk_cols_sel||'
5404                       ATTR_GROUP_ID,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE)
5405                   SELECT /*+ index(A,EGO_ITM_USR_ATTR_INTRFC_N1) */   /* Fix for bug#9678667 */
5406          /* Bug 9678667             MAX(TRANSACTION_ID),'||G_PS_IN_PROCESS||',DATA_SET_ID,ROW_IDENTIFIER,:attr_group_int_name,:attr_internal_name,
5407                                   :default_value,'''|| EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||''','|| l_concat_pk_cols_sel ||'
5408                                   ATTR_GROUP_ID,MAX(CREATED_BY),SYSDATE,MAX(LAST_UPDATED_BY),SYSDATE
5409                   FROM '||p_interface_table_name||' A
5410                   WHERE NOT EXISTS (
5411                           SELECT /*+ no_unnest index(B,EGO_ITM_USR_ATTR_INTRFC_U1) */ /* Fix for bug#9678667 */
5412           /* Bug 9678667                      NULL
5413                             FROM '||p_interface_table_name||' B
5414                            WHERE DATA_SET_ID = A.DATA_SET_ID
5415                              AND B.ATTR_INT_NAME = :attr_internal_name
5416                              -- AND B.ATTR_GROUP_INT_NAME = A.ATTR_GROUP_INT_NAME   /* Fix for bug#9678667 */
5417                              --AND B.TRANSACTION_TYPE = A.TRANSACTION_TYPE
5418          /* Bug 9678667                    AND A.ROW_IDENTIFIER = B.ROW_IDENTIFIER)
5419                     AND DATA_SET_ID = :data_set_id
5420                     AND ATTR_GROUP_INT_NAME = :attr_group_int_name
5421                     AND PROCESS_STATUS = '||G_PS_IN_PROCESS|| '
5422                     AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
5423                     AND TRANSACTION_TYPE = '''|| EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||'''
5424                   GROUP BY DATA_SET_ID,ROW_IDENTIFIER,'|| l_concat_pk_cols_sel ||' ATTR_GROUP_ID' ;
5425                 DBMS_SQL.Parse(l_default_char_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
5426                 DBMS_SQL.Bind_Variable(l_default_char_cursor_id, ':data_set_id', p_data_set_id);
5427               END IF;
5428 
5429               DBMS_SQL.Bind_Variable(l_default_char_cursor_id, ':attr_group_int_name', l_attr_metadata_table_1(z).ATTR_GROUP_NAME);
5430               DBMS_SQL.Bind_Variable(l_default_char_cursor_id, ':attr_internal_name', l_attr_metadata_table_1(z).ATTR_NAME);
5431               DBMS_SQL.Bind_Variable(l_default_char_cursor_id, ':default_value', l_attr_metadata_table_1(z).DEFAULT_VALUE);
5432 
5433               l_dummy := DBMS_SQL.Execute(l_default_char_cursor_id);
5434               -- We need to add the attr in the distinct attrs table, since now we have to process this one also
5435               IF (l_attr_metadata_table_1(z).DEFAULT_VALUE IS NOT NULL AND l_dummy > 0 ) THEN
5436                 l_dist_attr_in_data_set_rec.ATTR_GROUP_ID := l_attr_metadata_table_1(z).ATTR_GROUP_ID;
5437                 l_dist_attr_in_data_set_rec.ATTR_INT_NAME := l_attr_metadata_table_1(z).ATTR_NAME;
5438                 l_dist_attr_in_data_set_rec.ATTR_GROUP_INT_NAME := l_attr_metadata_table_1(z).ATTR_GROUP_NAME;
5439 
5440                 l_dist_attrs_in_data_set_table(l_dist_attrs_in_data_set_table.COUNT+1) := l_dist_attr_in_data_set_rec;
5441               END IF;
5442 
5443             END IF;--inserting row
5444 
5445             code_debug('          After inserting rows where ever required for attribute '||l_attr_metadata_table_1(z).ATTR_NAME ,2);
5446           */ -- Bug 9678667 : End - Commenting Ends
5447 
5448             ----------------------------------------------------------
5449             -- HERE WE CHECK FOR REQUIRED FIELD VALIDATIONS FOR ROWS
5450             -- HAVING TRANSACTION TYPE AS UPDATE OR CREATE
5451             -- BY NOW WE HAVE THE ATTR_VAL_* COLUMNS FILLED UP WITH
5452             -- APPROPRIATE VALUES.
5453             ----------------------------------------------------------
5454             IF (l_attr_metadata_table_1(z).REQUIRED_FLAG = 'Y') THEN
5455 
5456               code_debug('          Attribute '||l_attr_metadata_table_1(z).ATTR_NAME|| ' is a required attribute' ,2);
5457 
5458               --------- FOR NUMBER DATATYPE
5459               IF(l_attr_metadata_table_1(z).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
5460                 IF (l_req_num_cursor_id IS NULL) THEN
5461                   l_req_num_cursor_id := DBMS_SQL.Open_Cursor;
5462                   l_dynamic_sql :=
5463                   'UPDATE '||p_interface_table_name||'
5464                       SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_REQUIRED_ATTRIBUTE||'
5465                     WHERE DATA_SET_ID = :data_set_id
5466                       AND PROCESS_STATUS = '||G_PS_IN_PROCESS|| '
5467                       AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
5468                       AND ATTR_INT_NAME = :attr_internal_name
5469                       AND ATTR_GROUP_INT_NAME = :attr_group_int_name
5470                       AND ATTR_VALUE_NUM IS NULL
5471                       AND ATTR_DISP_VALUE IS NULL ' ;--BugFix : 4171705
5472                   DBMS_SQL.Parse(l_req_num_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
5473                   DBMS_SQL.Bind_Variable(l_req_num_cursor_id, ':data_set_id', p_data_set_id);
5474                 END IF;
5475 
5476                 DBMS_SQL.Bind_Variable(l_req_num_cursor_id, ':attr_group_int_name', l_attr_metadata_table_1(z).ATTR_GROUP_NAME);
5477                 DBMS_SQL.Bind_Variable(l_req_num_cursor_id, ':attr_internal_name', l_attr_metadata_table_1(z).ATTR_NAME);
5478 
5479                 l_dummy := DBMS_SQL.Execute(l_req_num_cursor_id);
5480 
5481               --------- FOR DATE AND DATE TIME DATATYPE
5482               ELSIF (l_attr_metadata_table_1(z).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE OR l_attr_metadata_table_1(z).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE) THEN
5483                 IF (l_req_date_cursor_id IS NULL) THEN
5484                   l_req_date_cursor_id := DBMS_SQL.Open_Cursor;
5485                   l_dynamic_sql :=
5486                   'UPDATE '||p_interface_table_name||'
5487                       SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_REQUIRED_ATTRIBUTE||'
5488                     WHERE DATA_SET_ID = :data_set_id
5489                       AND PROCESS_STATUS = '||G_PS_IN_PROCESS|| '
5490                       AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
5491                       AND ATTR_INT_NAME = :attr_internal_name
5492                       AND ATTR_GROUP_INT_NAME = :attr_group_int_name
5493                       AND ATTR_VALUE_DATE IS NULL
5494                       AND ATTR_DISP_VALUE IS NULL ' ;--BugFix : 4171705
5495                   DBMS_SQL.Parse(l_req_date_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
5496                   DBMS_SQL.Bind_Variable(l_req_date_cursor_id, ':data_set_id', p_data_set_id);
5497                 END IF;
5498 
5499                 DBMS_SQL.Bind_Variable(l_req_date_cursor_id, ':attr_group_int_name', l_attr_metadata_table_1(z).ATTR_GROUP_NAME);
5500                 DBMS_SQL.Bind_Variable(l_req_date_cursor_id, ':attr_internal_name', l_attr_metadata_table_1(z).ATTR_NAME);
5501 
5502                 l_dummy := DBMS_SQL.Execute(l_req_date_cursor_id);
5503                 --------- FOR CHAR AND TRANSLATEBLE TEXT DATATYPE
5504                 ELSE
5505                   IF (l_req_char_cursor_id IS NULL) THEN
5506                     l_req_char_cursor_id := DBMS_SQL.Open_Cursor;
5507                     l_dynamic_sql :=
5508                     'UPDATE '||p_interface_table_name||'
5509                         SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_REQUIRED_ATTRIBUTE||'
5510                       WHERE DATA_SET_ID = :data_set_id
5511                         AND PROCESS_STATUS = '||G_PS_IN_PROCESS|| '
5512                         AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
5513                         AND ATTR_INT_NAME = :attr_internal_name
5514                         AND ATTR_GROUP_INT_NAME = :attr_group_int_name
5515                         AND ATTR_VALUE_STR IS NULL
5516                         AND ATTR_DISP_VALUE IS NULL ' ;--BugFix : 4171705
5517                     DBMS_SQL.Parse(l_req_char_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
5518                     DBMS_SQL.Bind_Variable(l_req_char_cursor_id, ':data_set_id', p_data_set_id);
5519                   END IF;
5520 
5521                   DBMS_SQL.Bind_Variable(l_req_char_cursor_id, ':attr_group_int_name', l_attr_metadata_table_1(z).ATTR_GROUP_NAME);
5522                   DBMS_SQL.Bind_Variable(l_req_char_cursor_id, ':attr_internal_name', l_attr_metadata_table_1(z).ATTR_NAME);
5523 
5524                   l_dummy := DBMS_SQL.Execute(l_req_char_cursor_id);
5525                 END IF;
5526               END IF;--Required flag
5527            END IF;
5528         END LOOP;
5529 
5530       END IF;-- *p_validate-IF-3.1*
5531 --Rathna ended
5532 
5533         -----------------------------------------------
5534         -- HERE ER FO TVS VALIDATION FOR SR AG
5535         ----------------------------------------------
5536       IF(p_validate) THEN --- Search for p_validate-IF-3.2 to find the ending of this loop
5537 
5538         IF (l_attr_group_metadata_obj.MULTI_ROW_CODE <> 'Y') THEN  -- i.e., if MULTI_ROW_CODE <> 'Y'
5539 
5540           code_debug('          Inside single row specific validations for Attribute Group :'||l_attr_group_intf_rec.ATTR_GROUP_INT_NAME ,2);
5541 
5542           -- now we go for doing the TVS validation if the AG is SR
5543           FOR x IN l_attr_metadata_table_sr.FIRST .. l_attr_metadata_table_sr.LAST
5544           LOOP
5545 
5546             IF (Attr_Is_In_Data_Set(l_attr_metadata_table_sr(X),
5547                                     l_dist_attrs_in_data_set_table)) THEN
5548               l_attr_exists_in_intf := 'EXISTS';
5549             ELSE
5550               l_attr_exists_in_intf := 'NOTEXISTS';
5551             END IF;
5552 
5553  --WE DO THE TVC VALIDATION FOR SRAG ONLY IF THIS ATTR HAS ATLEAST ONE VALID INSTANCE IN THE INTF TABLE
5554             IF (l_attr_exists_in_intf = 'EXISTS') THEN
5555               IF (l_attr_metadata_table_sr(x).VALIDATION_CODE = EGO_EXT_FWK_PUB.G_TABLE_VALIDATION_CODE) THEN
5556 
5557                 code_debug('          The attribute :'||l_attr_metadata_table_sr(x).ATTR_NAME||' has a table value set attached to it with value set id :'||l_attr_metadata_table_sr(x).VALUE_SET_ID ,2);
5558 
5559                 SELECT APPLICATION_TABLE_NAME,
5560                        VALUE_COLUMN_NAME,--VALUE_COLUMN_TYPE,VALUE_COLUMN_SIZE,
5561                        ID_COLUMN_NAME, --ID_COLUMN_TYPE, ID_COLUMN_SIZE,
5562                        MEANING_COLUMN_NAME, --MEANING_COLUMN_TYPE,
5563                        ADDITIONAL_WHERE_CLAUSE
5564                   INTO l_tvs_table_name,
5565                        l_tvs_val_col, --l_tvs_val_col_type, l_tvs_val_col_size,
5566                        l_tvs_id_col, --l_tvs_id_col_type, l_tvs_id_col_size
5567                        l_tvs_mean_col, --l_tvs_mean_col_type,
5568                        l_tvs_where_clause
5569                   FROM FND_FLEX_VALIDATION_TABLES
5570                  WHERE FLEX_VALUE_SET_ID = l_attr_metadata_table_sr(x).VALUE_SET_ID;
5571 
5572     --By GEGUO for bug 9218013
5573     l_tvs_where_clause := trim(l_tvs_where_clause) || '  ';--BugFix:4609213: in case we have a bind at the end it fails because of the assimption mentioned below !
5574                 IF (l_tvs_id_col IS NOT NULL) THEN
5575                   l_tvs_col := l_tvs_id_col;
5576                 ELSE
5577                   l_tvs_col := l_tvs_val_col;
5578                 END IF;
5579 
5580 
5581     -- abedajna Bug 6207675
5582                 --if ( l_tvs_where_clause is not null ) then
5583                 --  l_tvs_where_clause := '('||l_tvs_where_clause||')';
5584                 --end if;
5585     -- abedajna Bug 6322809
5586 
5587    -- bug 12889614, 13011041, system will not process the where clause if the
5588    --where clause does not start with order by statement.
5589    IF (INSTR(UPPER(LTRIM(l_tvs_where_clause)), 'ORDER ') <> 1) THEN
5590     l_tvs_where_clause := process_whereclause(l_tvs_where_clause);
5591    END IF;
5592 
5593 
5594                 IF(INSTR(UPPER(LTRIM(l_tvs_where_clause)),'WHERE ')) = 1 THEN --BugFix : 4171705
5595                   l_tvs_where_clause := SUBSTR(l_tvs_where_clause, INSTR(UPPER(l_tvs_where_clause),'WHERE ')+5 );
5596                 ELSIF (INSTR(UPPER(LTRIM(l_tvs_where_clause)),'(WHERE ')) = 1 THEN  /*Added one more condition for bug 7508982*/
5597                   l_tvs_where_clause := '('||SUBSTR(l_tvs_where_clause, INSTR(UPPER(l_tvs_where_clause),'WHERE ')+5 );
5598                 END IF;
5599 
5600                 ------------------------------------------------------
5601                 -- In case the where clause has new line or tabs    --
5602                 -- we need to remove it BugFix:4101091              --
5603                 ------------------------------------------------------
5604                 SELECT REPLACE(l_tvs_where_clause,FND_GLOBAL.LOCAL_CHR(10),FND_GLOBAL.LOCAL_CHR(32)) INTO l_tvs_where_clause FROM dual; --replacing new line character
5605                 SELECT REPLACE(l_tvs_where_clause,FND_GLOBAL.LOCAL_CHR(13),FND_GLOBAL.LOCAL_CHR(32)) INTO l_tvs_where_clause FROM dual; --removing carriage return
5606 
5607                 IF(INSTR(UPPER(l_tvs_where_clause),' ORDER ')) <> 0 THEN --Bug:4065857 gnanda we need to remove the order by clause if any in the where clause
5608                   l_tvs_where_clause := SUBSTR(l_tvs_where_clause, 1 , INSTR(UPPER(l_tvs_where_clause),' ORDER '));
5609                 END IF;
5610 
5611                 IF(INSTR(UPPER(l_tvs_where_clause),')ORDER ')) <> 0 THEN --BugFix:6133202
5612                   l_tvs_where_clause := SUBSTR(l_tvs_where_clause, 1 , INSTR(UPPER(l_tvs_where_clause),')ORDER '));
5613                 END IF;
5614 
5615 
5616                 IF(INSTR(UPPER(LTRIM(l_tvs_where_clause)),'ORDER ')) = 1 THEN --Bug:4065857 gnanda we need to remove the order by if where clause has only an order by
5617                   l_tvs_where_clause := SUBSTR(l_tvs_where_clause, 1 , INSTR(UPPER(l_tvs_where_clause),' ORDER '));
5618                   l_tvs_where_clause := ' 1=1 '|| l_tvs_where_clause;
5619                 END IF;
5620 
5621                 l_tvs_metadata_fetched := TRUE;
5622 
5623                 WHILE (INSTR(l_tvs_where_clause, ':$ATTRIBUTEGROUP$') > 0)
5624                 LOOP
5625                   l_attrname_start_index := INSTR(l_tvs_where_clause,':$ATTRIBUTEGROUP$') +18;
5626                   -- NOTE: WE ASSUME THAT WE WILL HAVE A SPACE AFTER THE ATTR NAME (will look into this later)
5627                   l_attrname_end_index   := INSTR(l_tvs_where_clause,' ',l_attrname_start_index,1);
5628 
5629                   l_bind_attr_name := SUBSTR(l_tvs_where_clause,l_attrname_start_index,l_attrname_end_index-l_attrname_start_index);
5630 
5631                   -- HERE WE GET THE COLNAME AND DATATYPE OF THE ATTRIBUTE USED AS BIND VARIABLE
5632                   FOR j IN l_attr_metadata_table_sr.FIRST .. l_attr_metadata_table_sr.LAST LOOP
5633                     IF (l_attr_metadata_table_sr(j).ATTR_NAME = l_bind_attr_name) THEN
5634                       l_ext_attr_col_name := l_attr_metadata_table_sr(j).DATABASE_COLUMN;
5635                       l_bind_attr_data_type := l_attr_metadata_table_sr(j).DATA_TYPE_CODE;
5636                     END IF;
5637                   END LOOP;
5638 
5639                   IF (l_ext_attr_col_name IS NULL OR l_bind_attr_data_type IS NULL) THEN
5640                     l_tvs_metadata_fetched := FALSE;
5641                   ELSE
5642                     l_tvs_metadata_fetched := TRUE;
5643                   END IF;
5644                   l_value_from_ext_table := '( SELECT '|| l_ext_attr_col_name ||'
5645                                                  FROM '||l_ext_vl_name||'
5646                                                 WHERE ATTR_GROUP_ID = UAI1.ATTR_GROUP_ID ';
5647 
5648                   -- add the pk's
5649                   IF (l_pk1_column_name IS NOT NULL) THEN
5650                     l_value_from_ext_table := l_value_from_ext_table || ' AND '||l_pk1_column_name||' = UAI1.'||l_pk1_column_name;
5651                   END IF;
5652                   IF (l_pk2_column_name IS NOT NULL) THEN
5653                     l_value_from_ext_table := l_value_from_ext_table || ' AND '||l_pk2_column_name||' = UAI1.'||l_pk2_column_name;
5654                   END IF;
5655                   IF (l_pk3_column_name IS NOT NULL) THEN
5656                     l_value_from_ext_table := l_value_from_ext_table || ' AND '||l_pk3_column_name||' = UAI1.'||l_pk3_column_name;
5657                   END IF;
5658                   IF (l_pk4_column_name IS NOT NULL) THEN
5659                     l_value_from_ext_table := l_value_from_ext_table || ' AND '||l_pk4_column_name||' = UAI1.'||l_pk4_column_name;
5660                   END IF;
5661                   IF (l_pk5_column_name IS NOT NULL) THEN
5662                     l_value_from_ext_table := l_value_from_ext_table || ' AND '||l_pk5_column_name||' = UAI1.'||l_pk5_column_name;
5663                   END IF;
5664 
5665                   --bug 12397223 begin
5666                   OPEN enabled_data_level_cols(l_attr_group_metadata_obj.ATTR_GROUP_ID);
5667                   LOOP
5668                     FETCH enabled_data_level_cols INTO l_data_level_cols_rec;
5669                     EXIT WHEN enabled_data_level_cols%NOTFOUND;
5670                       IF(l_data_level_cols_rec.PK1_COLUMN_NAME IS NOT NULL) THEN
5671                         l_value_from_ext_table := l_value_from_ext_table || ' AND NVL('||l_data_level_cols_rec.PK1_COLUMN_NAME||',-1) =  NVL(UAI1.'||l_data_level_cols_rec.PK1_COLUMN_NAME||',-1)';
5672                       END IF;
5673                       IF(l_data_level_cols_rec.PK2_COLUMN_NAME IS NOT NULL) THEN
5674                         l_value_from_ext_table := l_value_from_ext_table || ' AND NVL('||l_data_level_cols_rec.PK2_COLUMN_NAME||',-1) =  NVL(UAI1.'||l_data_level_cols_rec.PK2_COLUMN_NAME||',-1)';
5675                       END IF;
5676                       IF(l_data_level_cols_rec.PK3_COLUMN_NAME IS NOT NULL) THEN
5677                         l_value_from_ext_table := l_value_from_ext_table || ' AND NVL('||l_data_level_cols_rec.PK3_COLUMN_NAME||',-1) =  NVL(UAI1.'||l_data_level_cols_rec.PK3_COLUMN_NAME||',-1)';
5678                       END IF;
5679                       IF(l_data_level_cols_rec.PK4_COLUMN_NAME IS NOT NULL) THEN
5680                         l_value_from_ext_table := l_value_from_ext_table || ' AND NVL('||l_data_level_cols_rec.PK4_COLUMN_NAME||',-1) =  NVL(UAI1.'||l_data_level_cols_rec.PK4_COLUMN_NAME||',-1)';
5681                       END IF;
5682                       IF(l_data_level_cols_rec.PK5_COLUMN_NAME IS NOT NULL) THEN
5683                         l_value_from_ext_table := l_value_from_ext_table || ' AND NVL('||l_data_level_cols_rec.PK5_COLUMN_NAME||',-1) =  NVL(UAI1.'||l_data_level_cols_rec.PK5_COLUMN_NAME||',-1)';
5684                       END IF;
5685                   END LOOP;
5686                   CLOSE enabled_data_level_cols;
5687 
5688                   /*IF (l_num_data_level_columns = 1) THEN
5689                     l_value_from_ext_table := l_value_from_ext_table || ' AND NVL('||l_data_level_column_1||',-1) =  NVL(UAI1.'||l_data_level_column_1||',-1)';
5690 
5691                   ELSIF (l_num_data_level_columns = 2) THEN
5692                     l_value_from_ext_table := l_value_from_ext_table || ' AND NVL('||l_data_level_column_1||',-1) =  NVL(UAI1.'||l_data_level_column_1||',-1)';
5693                     l_value_from_ext_table := l_value_from_ext_table || ' AND NVL('||l_data_level_column_2||',-1) =  NVL(UAI1.'||l_data_level_column_2||',-1)';
5694 
5695                   ELSIF (l_num_data_level_columns = 3) THEN
5696                     l_value_from_ext_table := l_value_from_ext_table || ' AND NVL('||l_data_level_column_1||',-1) =  NVL(UAI1.'||l_data_level_column_1||',-1)';
5697                     l_value_from_ext_table := l_value_from_ext_table || ' AND NVL('||l_data_level_column_2||',-1) =  NVL(UAI1.'||l_data_level_column_2||',-1)';
5698                     l_value_from_ext_table := l_value_from_ext_table || ' AND NVL('||l_data_level_column_3||',-1) =  NVL(UAI1.'||l_data_level_column_3||',-1)';
5699                   END IF;
5700                   */
5701                   --bug 12397223 end
5702 
5703                   IF (l_bind_attr_data_type = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
5704                     l_value_from_intftbl := '(SELECT ATTR_VALUE_NUM FROM '||p_interface_table_name||'
5705                                                 WHERE ROW_IDENTIFIER = UAI1.ROW_IDENTIFIER
5706                                                   AND DATA_SET_ID = :data_set_id
5707                                                   AND ATTR_INT_NAME = '''||l_bind_attr_name||''' )';
5708                   ELSIF (l_bind_attr_data_type = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE  OR l_bind_attr_data_type = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE) THEN
5709                     l_value_from_intftbl := '(SELECT ATTR_VALUE_DATE FROM '||p_interface_table_name||'
5710                                                 WHERE ROW_IDENTIFIER = UAI1.ROW_IDENTIFIER
5711                                                   AND DATA_SET_ID = :data_set_id
5712                                                   AND ATTR_INT_NAME = '''||l_bind_attr_name||''' )';
5713                   ELSE
5714                     l_value_from_intftbl := '(SELECT ATTR_VALUE_STR FROM '||p_interface_table_name||'
5715                                                 WHERE ROW_IDENTIFIER = UAI1.ROW_IDENTIFIER
5716                                                   AND DATA_SET_ID = :data_set_id
5717                                                   AND ATTR_INT_NAME = '''||l_bind_attr_name||''' )';
5718                   END IF;
5719 
5720                   l_value_from_ext_table := l_value_from_ext_table || ' )';
5721                   -- now we replace the :$ATTRIBUTEGROUP$.attrname with the query to find the value.
5722 
5723                   l_tvs_where_clause := SUBSTR(l_tvs_where_clause,1,INSTR(l_tvs_where_clause, ':$ATTRIBUTEGROUP$')-1) ||
5724                                                  '(NVL('||l_value_from_intftbl||',
5725                                                         DECODE(UAI1.TRANSACTION_TYPE, ''UPDATE'','||l_value_from_ext_table||',''CREATE'',NULL,NULL)
5726                                                        )
5727                                                    )'||
5728                                                  SUBSTR(l_tvs_where_clause,l_attrname_end_index);
5729 
5730                 END LOOP;
5731                 WHILE (INSTR(l_tvs_where_clause, ':$OBJECT$') > 0)
5732                 LOOP
5733                   SELECT REPLACE(l_tvs_where_clause,':$OBJECT$','UAI1') INTO l_tvs_where_clause FROM DUAL;
5734                 END LOOP;
5735   /*
5736 THERE COULD BE A POSSIBILITY THAT THE TVS QUERY RETURNS MORE THAN ONE ROW
5737 IN THIS CASE WE JUST TAKE THE FIRST ROW : ( i.e. WHERE ROWNUM = 1)
5738   */
5739                 l_tvs_where_clause := RTRIM(LTRIM(l_tvs_where_clause));
5740 
5741                 IF LENGTH(l_tvs_where_clause)<3 OR LENGTH(l_tvs_where_clause) IS NULL THEN                  --added for bugFix:4609213
5742                   l_tvs_where_clause := ' 1=1 '||l_tvs_where_clause;
5743                 END IF;
5744 
5745                 l_tvs_select := '(SELECT DISTINCT '||l_tvs_col||' FROM '||l_tvs_table_name||'
5746                                    WHERE '||l_tvs_where_clause||'
5747                                      AND ROWNUM = 1
5748                          AND '||l_tvs_val_col||' = UAI1.ATTR_DISP_VALUE )';--BugFix : 4171705
5749 
5750                 l_tvs_num_val_check_select := '(SELECT COUNT(*) FROM '||l_tvs_table_name||'
5751                                    WHERE '||l_tvs_where_clause||'
5752                                      AND ROWNUM = 1
5753                          AND '||l_tvs_col||' = UAI1.ATTR_VALUE_NUM )';
5754 
5755                 l_tvs_date_val_check_select := '(SELECT COUNT(*) FROM '||l_tvs_table_name||'
5756                                    WHERE '||l_tvs_where_clause||'
5757                                      AND ROWNUM = 1
5758                          AND '||l_tvs_col||' = UAI1.ATTR_VALUE_DATE )';
5759 
5760                 l_tvs_str_val_check_select := '(SELECT COUNT(*) FROM '||l_tvs_table_name||'
5761                                    WHERE '||l_tvs_where_clause||'
5762                                      AND ROWNUM = 1
5763                          AND '||l_tvs_col||' = UAI1.ATTR_VALUE_STR )';
5764 
5765                 code_debug('          The TVS select constructed is :'||l_tvs_select ,3);
5766 
5767                 IF (l_tvs_metadata_fetched = FALSE) THEN
5768                   IF (l_bad_bindattrs_tvs_cursor_id IS NULL) THEN
5769                     l_bad_bindattrs_tvs_cursor_id := DBMS_SQL.Open_Cursor;
5770                     l_dynamic_sql :=
5771                     'UPDATE '||p_interface_table_name||'
5772                         SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_BAD_ATTRS_IN_TVS_WHERE||'
5773                       WHERE DATA_SET_ID = :data_set_id
5774                         AND ATTR_INT_NAME = :attr_internal_name
5775                         AND ATTR_GROUP_INT_NAME = :attr_group_int_name';
5776 
5777                     DBMS_SQL.Parse(l_bad_bindattrs_tvs_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
5778                     DBMS_SQL.Bind_Variable(l_bad_bindattrs_tvs_cursor_id, ':data_set_id', p_data_set_id);
5779                   END IF;
5780 
5781                   DBMS_SQL.Bind_Variable(l_bad_bindattrs_tvs_cursor_id, ':attr_group_int_name', l_attr_group_metadata_obj.ATTR_GROUP_NAME);
5782                   DBMS_SQL.Bind_Variable(l_bad_bindattrs_tvs_cursor_id, ':attr_internal_name', l_attr_metadata_table_sr(x).ATTR_NAME);
5783                   l_dummy := DBMS_SQL.Execute(l_bad_bindattrs_tvs_cursor_id);
5784                 ELSE -- now we do the interface table update since we are sure we have the metadata for bound variables
5785 
5786   /*
5787 Note: we are assuming that the setup is correct i.e. the column of the TVS are of correct data type
5788 the id col is of datatype same as the attribute
5789 the meanin col is of type character.
5790 another assumtion is that the user cannot enter the value directly in to the attr_val_* col
5791 he has to enter the data in attr_disp_Value column for which we get the actual attr val.
5792   */
5793                   IF (l_attr_metadata_table_sr(x).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
5794 
5795                     l_dynamic_sql_1 :=
5796                     'UPDATE '||p_interface_table_name||' UAI1
5797                         SET PROCESS_STATUS = PROCESS_STATUS + DECODE(('||l_tvs_num_val_check_select||'),0,'||G_PS_VALUE_NOT_IN_TVS||',0)
5798                       WHERE DATA_SET_ID = :data_set_id
5799                         AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
5800                         AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
5801                         AND ATTR_INT_NAME = '''||l_attr_metadata_table_sr(x).ATTR_NAME||'''
5802                         AND ATTR_GROUP_INT_NAME = '''||l_attr_group_metadata_obj.ATTR_GROUP_NAME||'''
5803                         AND ATTR_VALUE_NUM IS NOT NULL';
5804 
5805                     l_dynamic_sql :=
5806                     'UPDATE '||p_interface_table_name||' UAI1
5807                         SET ATTR_VALUE_NUM = NVL('||l_tvs_select||',NULL),
5808                             PROCESS_STATUS = PROCESS_STATUS + DECODE(('||l_tvs_select||'),NULL,'||G_PS_VALUE_NOT_IN_TVS||',0)
5809                       WHERE DATA_SET_ID = :data_set_id
5810                         AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
5811                         AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
5812                         AND ATTR_INT_NAME = '''||l_attr_metadata_table_sr(x).ATTR_NAME||'''
5813                         AND ATTR_GROUP_INT_NAME = '''||l_attr_group_metadata_obj.ATTR_GROUP_NAME||'''
5814                         AND ATTR_DISP_VALUE IS NOT NULL ';
5815                     -- We execute the above cursor in a PL/SQL block since we know that if this fails
5816                     -- it is because of wrong setup the user has created for table value sets, so we
5817                     -- need to mark the row as errored due to bad TVS setup.
5818 
5819                     BEGIN
5820                       --EXECUTE IMMEDIATE l_dynamic_sql_1;
5821                       IF (l_sr_tvs_num_cursor_id1 IS NULL) THEN
5822                         l_sr_tvs_num_cursor_id1 := DBMS_SQL.Open_Cursor;
5823                       END IF;
5824                       DBMS_SQL.Parse(l_sr_tvs_num_cursor_id1, l_dynamic_sql_1, DBMS_SQL.NATIVE);
5825                       DBMS_SQL.Bind_Variable(l_sr_tvs_num_cursor_id1, ':data_set_id', p_data_set_id);
5826                       l_dummy := DBMS_SQL.Execute(l_sr_tvs_num_cursor_id1);
5827 
5828                       --EXECUTE IMMEDIATE l_dynamic_sql;
5829                       IF (l_sr_tvs_num_cursor_id2 IS NULL) THEN
5830                         l_sr_tvs_num_cursor_id2 := DBMS_SQL.Open_Cursor;
5831                       END IF;
5832                       DBMS_SQL.Parse(l_sr_tvs_num_cursor_id2, l_dynamic_sql, DBMS_SQL.NATIVE);
5833                       DBMS_SQL.Bind_Variable(l_sr_tvs_num_cursor_id2, ':data_set_id', p_data_set_id);
5834                       l_dummy := DBMS_SQL.Execute(l_sr_tvs_num_cursor_id2);
5835 
5836                     EXCEPTION
5837                       WHEN OTHERS THEN
5838                         IF (l_bad_tvs_sql_cursor_id IS NULL) THEN
5839                           l_bad_tvs_sql_cursor_id := DBMS_SQL.Open_Cursor;
5840                           l_dynamic_sql :=
5841                           'UPDATE '||p_interface_table_name||'
5842                               SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_BAD_TVS_SETUP||'
5843                             WHERE DATA_SET_ID = :data_set_id
5844                               AND ATTR_INT_NAME = :attr_internal_name
5845                               AND ATTR_GROUP_INT_NAME = :attr_group_int_name';
5846 
5847                           DBMS_SQL.Parse(l_bad_tvs_sql_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
5848                           DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':data_set_id', p_data_set_id);
5849                         END IF;
5850                         DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':attr_group_int_name', l_attr_group_metadata_obj.ATTR_GROUP_NAME);
5851                         DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':attr_internal_name', l_attr_metadata_table_sr(x).ATTR_NAME);
5852                         l_dummy := DBMS_SQL.Execute(l_bad_tvs_sql_cursor_id);
5853                     END;
5854 
5855                   ELSIF (l_attr_metadata_table_sr(x).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE OR l_attr_metadata_table_sr(x).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE) THEN
5856 
5857                     l_dynamic_sql_1 :=
5858                     'UPDATE '||p_interface_table_name||' UAI1
5859                         SET PROCESS_STATUS = PROCESS_STATUS + DECODE(('||l_tvs_date_val_check_select||'),0,'||G_PS_VALUE_NOT_IN_TVS||',0)
5860                       WHERE DATA_SET_ID = :data_set_id
5861                         AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
5862                         AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
5863                         AND ATTR_INT_NAME = '''||l_attr_metadata_table_sr(x).ATTR_NAME||'''
5864                         AND ATTR_GROUP_INT_NAME = '''||l_attr_group_metadata_obj.ATTR_GROUP_NAME||'''
5865                         AND ATTR_VALUE_DATE IS NOT NULL';
5866 
5867                     l_dynamic_sql :=
5868                     'UPDATE '||p_interface_table_name||' UAI1
5869                         SET ATTR_VALUE_DATE = NVL('||l_tvs_select||',NULL),
5870                             PROCESS_STATUS = PROCESS_STATUS + DECODE(('||l_tvs_select||'),NULL,'||G_PS_VALUE_NOT_IN_TVS||',0)
5871                       WHERE DATA_SET_ID = :data_set_id
5872                         AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
5873                         AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
5874                         AND ATTR_INT_NAME = '''||l_attr_metadata_table_sr(x).ATTR_NAME||'''
5875                         AND ATTR_GROUP_INT_NAME = '''||l_attr_group_metadata_obj.ATTR_GROUP_NAME||'''
5876                         AND ATTR_DISP_VALUE IS NOT NULL ';
5877 
5878                     -- We execute the above cursor in a PL/SQL block since we know that if this fails
5879                     -- it is because of wrong setup the user has created for table value sets, so we
5880                     -- need to mark the row as errored due to bad TVS setup.
5881                     BEGIN
5882 
5883                       --EXECUTE IMMEDIATE l_dynamic_sql_1;
5884                       IF (l_sr_tvs_date_cursor_id1 IS NULL) THEN
5885                         l_sr_tvs_date_cursor_id1 := DBMS_SQL.Open_Cursor;
5886                       END IF;
5887                       DBMS_SQL.Parse(l_sr_tvs_date_cursor_id1, l_dynamic_sql_1, DBMS_SQL.NATIVE);
5888                       DBMS_SQL.Bind_Variable(l_sr_tvs_date_cursor_id1, ':data_set_id', p_data_set_id);
5889                       l_dummy := DBMS_SQL.Execute(l_sr_tvs_date_cursor_id1);
5890 
5891                       --EXECUTE IMMEDIATE l_dynamic_sql;
5892                       IF (l_sr_tvs_date_cursor_id2 IS NULL) THEN
5893                         l_sr_tvs_date_cursor_id2 := DBMS_SQL.Open_Cursor;
5894                       END IF;
5895                       DBMS_SQL.Parse(l_sr_tvs_date_cursor_id2, l_dynamic_sql, DBMS_SQL.NATIVE);
5896                       DBMS_SQL.Bind_Variable(l_sr_tvs_date_cursor_id2, ':data_set_id', p_data_set_id);
5897                       l_dummy := DBMS_SQL.Execute(l_sr_tvs_date_cursor_id2);
5898 
5899                     EXCEPTION
5900                       WHEN OTHERS THEN
5901                         IF (l_bad_tvs_sql_cursor_id IS NULL) THEN
5902                           l_bad_tvs_sql_cursor_id := DBMS_SQL.Open_Cursor;
5903                           l_dynamic_sql :=
5904                           'UPDATE '||p_interface_table_name||'
5905                               SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_BAD_TVS_SETUP||'
5906                             WHERE DATA_SET_ID = :data_set_id
5907                               AND ATTR_INT_NAME = :attr_internal_name
5908                               AND ATTR_GROUP_INT_NAME = :attr_group_int_name';
5909 
5910                           DBMS_SQL.Parse(l_bad_tvs_sql_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
5911                           DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':data_set_id', p_data_set_id);
5912                         END IF;
5913                         DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':attr_group_int_name', l_attr_group_metadata_obj.ATTR_GROUP_NAME);
5914                         DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':attr_internal_name', l_attr_metadata_table_sr(x).ATTR_NAME);
5915                         l_dummy := DBMS_SQL.Execute(l_bad_tvs_sql_cursor_id);
5916                     END;
5917                   ELSE
5918                     l_dynamic_sql_1 :=
5919                     'UPDATE '||p_interface_table_name||' UAI1
5920                         SET PROCESS_STATUS = PROCESS_STATUS + DECODE(('||l_tvs_str_val_check_select||'),0,'||G_PS_VALUE_NOT_IN_TVS||',0)
5921                       WHERE DATA_SET_ID = :data_set_id
5922                         AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
5923                         AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
5924                         AND ATTR_INT_NAME = '''||l_attr_metadata_table_sr(x).ATTR_NAME||'''
5925                         AND ATTR_GROUP_INT_NAME = '''||l_attr_group_metadata_obj.ATTR_GROUP_NAME||'''
5926                         AND ATTR_VALUE_STR IS NOT NULL';
5927 
5928                     l_dynamic_sql :=
5929                     'UPDATE '||p_interface_table_name||' UAI1
5930                         SET ATTR_VALUE_STR = NVL('||l_tvs_select||',NULL),
5931                             PROCESS_STATUS = PROCESS_STATUS + DECODE(('||l_tvs_select||'),NULL,'||G_PS_VALUE_NOT_IN_TVS||',0)
5932                       WHERE DATA_SET_ID = :data_set_id
5933                         AND (PROCESS_STATUS = '||G_PS_IN_PROCESS||' OR PROCESS_STATUS > '||G_PS_BAD_ATTR_OR_AG_METADATA||' )
5934                         AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
5935                         AND ATTR_INT_NAME = '''||l_attr_metadata_table_sr(x).ATTR_NAME||'''
5936                         AND ATTR_GROUP_INT_NAME = '''||l_attr_group_metadata_obj.ATTR_GROUP_NAME||'''
5937                         AND ATTR_DISP_VALUE IS NOT NULL ';
5938                     -- We execute the above cursor in a PL/SQL block since we know that if this fails
5939                     -- it is because of wrong setup the user has created for table value sets, so we
5940                     -- need to mark the row as errored due to bad TVS setup.
5941                     BEGIN
5942                       --EXECUTE IMMEDIATE l_dynamic_sql_1;
5943                       IF (l_sr_tvs_str_cursor_id1 IS NULL) THEN
5944                         l_sr_tvs_str_cursor_id1 := DBMS_SQL.Open_Cursor;
5945                       END IF;
5946                       DBMS_SQL.Parse(l_sr_tvs_str_cursor_id1, l_dynamic_sql_1, DBMS_SQL.NATIVE);
5947                       DBMS_SQL.Bind_Variable(l_sr_tvs_str_cursor_id1, ':data_set_id', p_data_set_id);
5948                       l_dummy := DBMS_SQL.Execute(l_sr_tvs_str_cursor_id1);
5949 
5950                       --EXECUTE IMMEDIATE l_dynamic_sql;
5951                       IF (l_sr_tvs_str_cursor_id2 IS NULL) THEN
5952                         l_sr_tvs_str_cursor_id2 := DBMS_SQL.Open_Cursor;
5953                       END IF;
5954                       DBMS_SQL.Parse(l_sr_tvs_str_cursor_id2, l_dynamic_sql, DBMS_SQL.NATIVE);
5955                       DBMS_SQL.Bind_Variable(l_sr_tvs_str_cursor_id2, ':data_set_id', p_data_set_id);
5956                       l_dummy := DBMS_SQL.Execute(l_sr_tvs_str_cursor_id2);
5957 
5958                     EXCEPTION
5959                       WHEN OTHERS THEN
5960                         IF (l_bad_tvs_sql_cursor_id IS NULL) THEN
5961                           l_bad_tvs_sql_cursor_id := DBMS_SQL.Open_Cursor;
5962                           l_dynamic_sql :=
5963                           'UPDATE '||p_interface_table_name||'
5964                               SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_BAD_TVS_SETUP||'
5965                             WHERE DATA_SET_ID = :data_set_id
5966                               AND ATTR_INT_NAME = :attr_internal_name
5967                               AND ATTR_GROUP_INT_NAME = :attr_group_int_name';
5968 
5969                           DBMS_SQL.Parse(l_bad_tvs_sql_cursor_id, l_dynamic_sql, DBMS_SQL.NATIVE);
5970                           DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':data_set_id', p_data_set_id);
5971                         END IF;
5972                         DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':attr_group_int_name', l_attr_group_metadata_obj.ATTR_GROUP_NAME);
5973                         DBMS_SQL.Bind_Variable(l_bad_tvs_sql_cursor_id, ':attr_internal_name', l_attr_metadata_table_sr(x).ATTR_NAME);
5974                         l_dummy := DBMS_SQL.Execute(l_bad_tvs_sql_cursor_id);
5975                     END;
5976                   END IF;
5977                 END IF; --l_attr_metadata TRUE/FALSE
5978               END IF; -- if validation_code is TVS
5979             END IF;--the if attr exists in the intf table ends.
5980           END LOOP; --end of all attr loop.
5981         END IF; -- ending of  single row OR MULTI ROW if
5982 
5983         code_debug('          Now done with the validations for ATTR GROUP LEVEL validations ',2);
5984 
5985       END IF;  --  *p_validate-IF-3.3* ending the p_validate IF
5986 
5987       -----------------------------------------------------
5988       -- NOW WE WILL RAISE PRE-EVENTS FOR THE PASSED AG's
5989       -- (if the pre_events are enabled for the ag)
5990       -- ONLY IF THE PARAMETER p_do_dml IS TRUE
5991       -----------------------------------------------------
5992       IF (p_do_dml) THEN --search for *p_do_dml-IF-1* to locate the END
5993 
5994         BEGIN
5995           SELECT PRE_BUSINESS_EVENT_NAME
5996             INTO l_pre_event_name
5997             FROM EGO_FND_DESC_FLEXS_EXT
5998            WHERE APPLICATION_ID = p_application_id
5999              AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type;
6000         EXCEPTION
6001           WHEN NO_DATA_FOUND THEN
6002             l_pre_event_name := NULL;
6003         END;
6004 
6005        SELECT COUNT(*)
6006           INTO l_dummy
6007           FROM EGO_ATTR_GROUP_DL
6008          WHERE ATTR_GROUP_ID = l_attr_group_metadata_obj.ATTR_GROUP_ID
6009            AND RAISE_PRE_EVENT = 'Y';
6010 
6011         IF (l_dummy > 0) THEN
6012           l_is_pre_event_enabled_flag := 'Y';
6013         ELSE
6014           l_is_pre_event_enabled_flag := 'N';
6015         END IF;
6016 
6017         code_debug('inside raising events   l_is_pre_event_enabled_flag-'||l_is_pre_event_enabled_flag);
6018 
6019         /*Code changes for bug 8485287*/
6020            /* Added code to raise postAttributeChange BE for call of public API to create Item. */
6021            BEGIN
6022              SELECT BUSINESS_EVENT_NAME
6023                INTO l_new_post_event_name
6024              FROM EGO_FND_DESC_FLEXS_EXT
6025              WHERE APPLICATION_ID = p_application_id
6026                AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type;
6027            EXCEPTION
6028              WHEN NO_DATA_FOUND THEN
6029                l_new_post_event_name := NULL;
6030            END;
6031 
6032         -- Bug 10090254 Changes : Start
6033         /*
6034         SELECT BUSINESS_EVENT_FLAG
6035          INTO l_new_post_event_enabled_flag
6036         FROM EGO_FND_DSC_FLX_CTX_EXT
6037         WHERE ATTR_GROUP_ID = l_attr_group_metadata_obj.ATTR_GROUP_ID;
6038         */
6039 
6040         SELECT COUNT(*)
6041         INTO  l_dummy
6042         FROM  EGO_ATTR_GROUP_DL
6043         WHERE ATTR_GROUP_ID = l_attr_group_metadata_obj.ATTR_GROUP_ID
6044           AND RAISE_POST_EVENT = 'Y';
6045 
6046         IF (l_dummy > 0) THEN
6047           l_new_post_event_enabled_flag := 'Y';
6048         ELSE
6049           l_new_post_event_enabled_flag := 'N';
6050         END IF;
6051 
6052         code_debug('inside raising events   l_new_post_event_enabled_flag - '||l_new_post_event_enabled_flag);
6053         -- Bug 10090254 Changes : End
6054 
6055 
6056            IF ((l_new_post_event_name IS NOT NULL AND l_new_post_event_enabled_flag = 'Y')  ) THEN
6057 
6058              l_dynamic_sql := ' SELECT EXTVL1.EXTENSION_ID , UAI1.ATTR_GROUP_INT_NAME, UAI1.TRANSACTION_TYPE, UAI1.ROW_IDENTIFIER ';
6059              l_group_by_pre := ' GROUP BY EXTVL1.EXTENSION_ID , UAI1.ATTR_GROUP_INT_NAME, UAI1.TRANSACTION_TYPE, UAI1.ROW_IDENTIFIER ';
6060                      l_dynamic_sql_delete_post := ' SELECT NULL , UAI1.ATTR_GROUP_INT_NAME, UAI1.TRANSACTION_TYPE, UAI1.ROW_IDENTIFIER ';
6061              l_dynamic_group_by := ' ';
6062              l_deflatening_sql_where := ' ';
6063              l_dynamic_query := ' ';
6064 
6065              IF (l_pk1_column_name IS NOT NULL) THEN
6066                l_dynamic_query := l_dynamic_query || ' , UAI1.' ||l_pk1_column_name;
6067                l_dynamic_group_by := l_dynamic_group_by || ' , UAI1.' ||l_pk1_column_name;
6068                l_deflatening_sql_where := l_deflatening_sql_where || ' AND UAI1.'||l_pk1_column_name||' = '||' EXTVL1.'||l_pk1_column_name;
6069              ELSE
6070                l_dynamic_query := l_dynamic_query || ' , NULL ';
6071              END IF;
6072 
6073              IF (l_pk2_column_name IS NOT NULL) THEN
6074                l_dynamic_query := l_dynamic_query || ' , UAI1.' ||l_pk2_column_name;
6075                l_dynamic_group_by := l_dynamic_group_by || ' , UAI1.' ||l_pk2_column_name;
6076                l_deflatening_sql_where := l_deflatening_sql_where || ' AND UAI1.'||l_pk2_column_name||' = '||' EXTVL1.'||l_pK2_column_name;
6077              ELSE
6078                l_dynamic_query := l_dynamic_query || ' , NULL ';
6079              END IF;
6080 
6081              IF (l_pk3_column_name IS NOT NULL) THEN
6082                l_dynamic_query := l_dynamic_query || ' , UAI1.' ||l_pk3_column_name;
6083                l_dynamic_group_by := l_dynamic_group_by || ' , UAI1.' ||l_pk3_column_name;
6084                l_deflatening_sql_where := l_deflatening_sql_where || ' AND UAI1.'||l_pk3_column_name||' = '||' EXTVL1.'||l_pk3_column_name;
6085              ELSE
6086                l_dynamic_query := l_dynamic_query || ' , NULL ';
6087              END IF;
6088 
6089              IF (l_pk4_column_name IS NOT NULL) THEN
6090                l_dynamic_query := l_dynamic_query || ' , UAI1.' ||l_pk4_column_name;
6091                l_dynamic_group_by := l_dynamic_group_by || ' , UAI1.' ||l_pk4_column_name;
6092                l_deflatening_sql_where := l_deflatening_sql_where || ' AND UAI1.'||l_pk4_column_name||' = '||' EXTVL1.'||l_pk4_column_name;
6093              ELSE
6094                l_dynamic_query := l_dynamic_query || ' , NULL ';
6095              END IF;
6096              IF (l_pk5_column_name IS NOT NULL) THEN
6097                l_dynamic_query := l_dynamic_query || ' , UAI1.' ||l_pk5_column_name;
6098                l_dynamic_group_by := l_dynamic_group_by || ' , UAI1.' ||l_pk5_column_name;
6099                l_deflatening_sql_where := l_deflatening_sql_where || ' AND UAI1.'||l_pk5_column_name||' = '||' EXTVL1.'||l_pk5_column_name;
6100              ELSE
6101                l_dynamic_query := l_dynamic_query || ' , NULL ';
6102              END IF;
6103 
6104              -- Bug 10090254 Code changes : Start
6105              /*
6106              IF (l_num_data_level_columns = 0) THEN
6107                 l_dynamic_query := l_dynamic_query ||' , NULL ';
6108                 l_dynamic_query := l_dynamic_query ||' , NULL ';
6109                 l_dynamic_query := l_dynamic_query ||' , NULL ';
6110              ELSIF (l_num_data_level_columns = 1) THEN
6111                 l_dynamic_query := l_dynamic_query ||' , UAI1.' ||l_data_level_column_1;
6112                 l_dynamic_query := l_dynamic_query ||' , NULL ';
6113                 l_dynamic_query := l_dynamic_query ||' , NULL ';
6114                 l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_data_level_column_1;
6115                 l_deflatening_sql_where := l_deflatening_sql_where || ' AND (UAI1.'||l_data_level_column_1||' = '||' EXTVL1.'||l_data_level_column_1||' OR ('||'UAI1.'||l_data_level_column_1|| ' IS NULL AND EXTVL1.'||l_data_level_column_1||' IS NULL))' ;
6116              ELSIF (l_num_data_level_columns = 2) THEN
6117                 l_dynamic_query := l_dynamic_query ||' , UAI1.' ||l_data_level_column_1;
6118                 l_dynamic_query := l_dynamic_query ||' , UAI1.' ||l_data_level_column_2;
6119                 l_dynamic_query := l_dynamic_query ||' , NULL ';
6120                 l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_data_level_column_1;
6121                 l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_data_level_column_2;
6122                 l_deflatening_sql_where := l_deflatening_sql_where || ' AND (UAI1.'||l_data_level_column_1||' = '||' EXTVL1.'||l_data_level_column_1||' OR ('||'UAI1.'||l_data_level_column_1|| ' IS NULL AND EXTVL1.'||l_data_level_column_1||' IS NULL))' ;
6123                 l_deflatening_sql_where := l_deflatening_sql_where || ' AND (UAI1.'||l_data_level_column_2||' = '||' EXTVL1.'||l_data_level_column_2||' OR ('||'UAI1.'||l_data_level_column_2|| ' IS NULL AND EXTVL1.'||l_data_level_column_2||' IS NULL))' ;
6124              ELSIF (l_num_data_level_columns = 3) THEN
6125                 l_dynamic_query := l_dynamic_query ||' , UAI1.' ||l_data_level_column_1;
6126                 l_dynamic_query := l_dynamic_query ||' , UAI1.' ||l_data_level_column_2;
6127                 l_dynamic_query := l_dynamic_query ||' , UAI1.' ||l_data_level_column_3;
6128                 l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_data_level_column_1;
6129                 l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_data_level_column_2;
6130                 l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_data_level_column_3;
6131                 l_deflatening_sql_where := l_deflatening_sql_where || ' AND (UAI1.'||l_data_level_column_1||' = '||' EXTVL1.'||l_data_level_column_1||' OR ('||'UAI1.'||l_data_level_column_1|| ' IS NULL AND EXTVL1.'||l_data_level_column_1||' IS NULL))' ;
6132                 l_deflatening_sql_where := l_deflatening_sql_where || ' AND (UAI1.'||l_data_level_column_2||' = '||' EXTVL1.'||l_data_level_column_2||' OR ('||'UAI1.'||l_data_level_column_2|| ' IS NULL AND EXTVL1.'||l_data_level_column_2||' IS NULL))' ;
6133                 l_deflatening_sql_where := l_deflatening_sql_where || ' AND (UAI1.'||l_data_level_column_3||' = '||' EXTVL1.'||l_data_level_column_3||' OR ('||'UAI1.'||l_data_level_column_3|| ' IS NULL AND EXTVL1.'||l_data_level_column_3||' IS NULL))' ;
6134              END IF;
6135              */
6136 
6137               --------------------------------------
6138               -- Adding the data level columns ...
6139               --------------------------------------
6140               IF(l_data_level_col_exists) THEN
6141 
6142                 l_dynamic_query := l_dynamic_query||' , UAI1.DATA_LEVEL_ID ';
6143                 l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.DATA_LEVEL_ID ';
6144                 l_deflatening_sql_where := l_deflatening_sql_where || ' AND NVL(UAI1.DATA_LEVEL_ID,-1) = NVL(EXTVL1.DATA_LEVEL_ID,-1) ';
6145 
6146                l_dl_pk_col1_sql:=NULL;
6147                l_dl_pk_col2_sql:=NULL;
6148                l_dl_pk_col3_sql:=NULL;
6149                l_dl_pk_col4_sql:=NULL;
6150                l_dl_pk_col5_sql:=NULL;
6151 
6152                FOR i IN l_list_of_dl_for_ag_type.FIRST .. l_list_of_dl_for_ag_type.LAST
6153                LOOP
6154                   l_dl_pk_col1_sql := l_dl_pk_col1_sql||' , '||l_list_of_dl_for_ag_type(i).DATA_LEVEL_ID||' ';
6155                   l_dl_pk_col2_sql := l_dl_pk_col2_sql||' , '||l_list_of_dl_for_ag_type(i).DATA_LEVEL_ID||' ';
6156                   l_dl_pk_col3_sql := l_dl_pk_col3_sql||' , '||l_list_of_dl_for_ag_type(i).DATA_LEVEL_ID||' ';
6157                   l_dl_pk_col4_sql := l_dl_pk_col4_sql||' , '||l_list_of_dl_for_ag_type(i).DATA_LEVEL_ID||' ';
6158                   l_dl_pk_col5_sql := l_dl_pk_col5_sql||' , '||l_list_of_dl_for_ag_type(i).DATA_LEVEL_ID||' ';
6159 
6160                   IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 <> 'NONE'
6161                      AND INSTR(l_dynamic_query,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1) = 0) THEN
6162 
6163                           l_dl_pk_col1_sql := l_dl_pk_col1_sql||' , UAI1.' ||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1;
6164                           l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1;
6165                           l_deflatening_sql_where := l_deflatening_sql_where || ' AND (UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1||
6166                                                                                        ' = '||' EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1||
6167                                                                                 ' OR  ('||'UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1|| ' IS NULL '||
6168                                                                                        'AND EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1||' IS NULL))' ;
6169                   ELSE
6170                           l_dl_pk_col1_sql := l_dl_pk_col1_sql||' , NULL ';
6171                   END IF;
6172                   IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2 <> 'NONE'
6173                      AND INSTR(l_dynamic_query,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2) = 0) THEN
6174                           l_dl_pk_col2_sql := l_dl_pk_col2_sql||' , UAI1.' ||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2;
6175                           l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2;
6176                           l_deflatening_sql_where := l_deflatening_sql_where || ' AND (UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2||
6177                                                                                        ' = '||' EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2||
6178                                                                                 ' OR  ('||'UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2|| ' IS NULL '||
6179                                                                                        'AND EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2||' IS NULL))' ;
6180 
6181                   ELSE
6182                           l_dl_pk_col2_sql := l_dl_pk_col2_sql||' , NULL ';
6183                   END IF;
6184                   IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3 <> 'NONE'
6185                      AND INSTR(l_dynamic_query,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3) = 0) THEN
6186                           l_dl_pk_col3_sql := l_dl_pk_col3_sql||' , UAI1.' ||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3;
6187                           l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3;
6188                           l_deflatening_sql_where := l_deflatening_sql_where || ' AND (UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3||
6189                                                                                        ' = '||' EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3||
6190                                                                                 ' OR  ('||'UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3|| ' IS NULL '||
6191                                                                                        'AND EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3||' IS NULL))' ;
6192 
6193                   ELSE
6194                           l_dl_pk_col3_sql := l_dl_pk_col3_sql||' , NULL ';
6195                   END IF;
6196                   IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4 <> 'NONE'
6197                      AND INSTR(l_dynamic_query,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4) = 0) THEN
6198                           l_dl_pk_col4_sql := l_dl_pk_col4_sql||' , UAI1.' ||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4;
6199                           l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4;
6200                           l_deflatening_sql_where := l_deflatening_sql_where || ' AND (UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4||
6201                                                                                        ' = '||' EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4||
6202                                                                                 ' OR  ('||'UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4|| ' IS NULL '||
6203                                                                                        'AND EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4||' IS NULL))' ;
6204 
6205                   ELSE
6206                           l_dl_pk_col4_sql := l_dl_pk_col4_sql||' , NULL ';
6207                   END IF;
6208                   IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5 <> 'NONE'
6209                      AND INSTR(l_dynamic_query,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5) = 0) THEN
6210                           l_dl_pk_col5_sql := l_dl_pk_col5_sql||' , UAI1.' ||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5;
6211                           l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5;
6212                           l_deflatening_sql_where := l_deflatening_sql_where || ' AND (UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5||
6213                                                                                        ' = '||' EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5||
6214                                                                                 ' OR  ('||'UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5|| ' IS NULL '||
6215                                                                                        'AND EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5||' IS NULL))' ;
6216 
6217                   ELSE
6218                           l_dl_pk_col5_sql := l_dl_pk_col5_sql||' , NULL ';
6219                   END IF;
6220                END LOOP;
6221                l_dynamic_query := l_dynamic_query||', DECODE(UAI1.DATA_LEVEL_ID '||l_dl_pk_col1_sql||' ) DL_PK1_VAL ';
6222                l_dynamic_query := l_dynamic_query||', DECODE(UAI1.DATA_LEVEL_ID '||l_dl_pk_col2_sql||' ) DL_PK2_VAL ';
6223                l_dynamic_query := l_dynamic_query||', DECODE(UAI1.DATA_LEVEL_ID '||l_dl_pk_col3_sql||' ) DL_PK3_VAL ';
6224                l_dynamic_query := l_dynamic_query||', DECODE(UAI1.DATA_LEVEL_ID '||l_dl_pk_col4_sql||' ) DL_PK4_VAL ';
6225                l_dynamic_query := l_dynamic_query||', DECODE(UAI1.DATA_LEVEL_ID '||l_dl_pk_col5_sql||' ) DL_PK5_VAL ';
6226 
6227               ELSE
6228                  l_dynamic_query := l_dynamic_query||' ,NULL '; --this is one is to compensate for the data_level_id
6229                  IF (l_num_data_level_columns = 0) THEN
6230                      l_dynamic_query := l_dynamic_query ||' , NULL ';
6231                      l_dynamic_query := l_dynamic_query ||' , NULL ';
6232                      l_dynamic_query := l_dynamic_query ||' , NULL ';
6233                      l_dynamic_query := l_dynamic_query ||' , NULL ';
6234                      l_dynamic_query := l_dynamic_query ||' , NULL ';
6235                  ELSIF (l_num_data_level_columns = 1) THEN
6236                      l_dynamic_query := l_dynamic_query ||' , UAI1.' ||l_data_level_column_1;
6237                      l_dynamic_query := l_dynamic_query ||' , NULL ';
6238                      l_dynamic_query := l_dynamic_query ||' , NULL ';
6239                      l_dynamic_query := l_dynamic_query ||' , NULL ';
6240                      l_dynamic_query := l_dynamic_query ||' , NULL ';
6241                      l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_data_level_column_1;
6242                      l_deflatening_sql_where := l_deflatening_sql_where ||
6243                          ' AND (UAI1.'||l_data_level_column_1||' = '||' EXTVL1.'||l_data_level_column_1||
6244                          ' OR ('||'UAI1.'||l_data_level_column_1|| ' IS NULL AND EXTVL1.'||l_data_level_column_1||' IS NULL))' ;
6245                   ELSIF (l_num_data_level_columns = 2) THEN
6246                      l_dynamic_query := l_dynamic_query ||' , UAI1.' ||l_data_level_column_1;
6247                      l_dynamic_query := l_dynamic_query ||' , UAI1.' ||l_data_level_column_2;
6248                      l_dynamic_query := l_dynamic_query ||' , NULL ';
6249                      l_dynamic_query := l_dynamic_query ||' , NULL ';
6250                      l_dynamic_query := l_dynamic_query ||' , NULL ';
6251                      l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_data_level_column_1;
6252                      l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_data_level_column_2;
6253                      l_deflatening_sql_where := l_deflatening_sql_where ||
6254                          ' AND (UAI1.'||l_data_level_column_1||' = '||' EXTVL1.'||l_data_level_column_1||
6255                          ' OR ('||'UAI1.'||l_data_level_column_1|| ' IS NULL AND EXTVL1.'||l_data_level_column_1||' IS NULL))' ;
6256                      l_deflatening_sql_where := l_deflatening_sql_where ||
6257                          ' AND (UAI1.'||l_data_level_column_2||' = '||' EXTVL1.'||l_data_level_column_2||
6258                          ' OR ('||'UAI1.'||l_data_level_column_2|| ' IS NULL AND EXTVL1.'||l_data_level_column_2||' IS NULL))' ;
6259                   ELSIF (l_num_data_level_columns = 3) THEN
6260                      l_dynamic_query := l_dynamic_query ||' , UAI1.' ||l_data_level_column_1;
6261                      l_dynamic_query := l_dynamic_query ||' , UAI1.' ||l_data_level_column_2;
6262                      l_dynamic_query := l_dynamic_query ||' , UAI1.' ||l_data_level_column_3;
6263                      l_dynamic_query := l_dynamic_query ||' , NULL ';
6264                      l_dynamic_query := l_dynamic_query ||' , NULL ';
6265                      l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_data_level_column_1;
6266                      l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_data_level_column_2;
6267                      l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_data_level_column_3;
6268                      l_deflatening_sql_where := l_deflatening_sql_where ||
6269                          ' AND (UAI1.'||l_data_level_column_1||' = '||' EXTVL1.'||l_data_level_column_1||
6270                          ' OR ('||'UAI1.'||l_data_level_column_1|| ' IS NULL AND EXTVL1.'||l_data_level_column_1||' IS NULL))' ;
6271                      l_deflatening_sql_where := l_deflatening_sql_where ||
6272                          ' AND (UAI1.'||l_data_level_column_2||' = '||' EXTVL1.'||l_data_level_column_2||
6273                          ' OR ('||'UAI1.'||l_data_level_column_2|| ' IS NULL AND EXTVL1.'||l_data_level_column_2||' IS NULL))' ;
6274                      l_deflatening_sql_where := l_deflatening_sql_where ||
6275                          ' AND (UAI1.'||l_data_level_column_3||' = '||' EXTVL1.'||l_data_level_column_3||
6276                          ' OR ('||'UAI1.'||l_data_level_column_3|| ' IS NULL AND EXTVL1.'||l_data_level_column_3||' IS NULL))' ;
6277                   END IF;
6278               END IF;
6279               -- Bug 10090254 Code changes : End
6280 
6281              l_deflatening_sql_where := l_deflatening_sql_where || ' AND EXTVL1.ATTR_GROUP_ID ='||l_attr_group_metadata_obj.ATTR_GROUP_ID;
6282 
6283              l_defaltening_sql := ' ';
6284              l_defaltening_sql_create := ' ';
6285              FOR i IN l_attr_metadata_table.FIRST .. l_attr_metadata_table.LAST
6286              LOOP
6287 
6288                   l_defaltening_sql := l_defaltening_sql ||
6289                                     '||  MAX(DECODE(UAI1.ATTR_INT_NAME'||
6290                                                  ','||' '''||l_attr_metadata_table(i).ATTR_NAME||''' '||
6291                                                  ','||'''#*'||l_attr_metadata_table(i).ATTR_NAME||'*#'||
6292                                                  ' NEWVALUE:$['''|| '||' ||'UAI1.ATTR_VALUE_NUM'||'||'||'UAI1.ATTR_VALUE_DATE'||'||'||'UAI1.ATTR_VALUE_STR'||' || '']$OLDVALUE${''||'||'EXTVL1.'||l_attr_metadata_table(i).DATABASE_COLUMN||'||''}$'' '||
6293                                                  ',NULL)) ';
6294                   l_defaltening_sql_create := l_defaltening_sql_create ||
6295                                     '||  MAX(DECODE(UAI1.ATTR_INT_NAME'||
6296                                                  ','||' '''||l_attr_metadata_table(i).ATTR_NAME||''' '||
6297                                                  ','||'''#*'||l_attr_metadata_table(i).ATTR_NAME||'*#'||' NEWVALUE:$['''|| '||' ||'UAI1.ATTR_VALUE_NUM'||'||'||'UAI1.ATTR_VALUE_DATE'||'||'||'UAI1.ATTR_VALUE_STR'||' || '']$'' '||
6298                                                  ',NULL)) ';
6299 
6300              END LOOP;
6301 
6302              l_dynamic_sql := l_dynamic_sql || l_dynamic_query;
6303              l_dynamic_sql_1 := l_dynamic_sql || ' ,NULL ';
6304              -------------------------------------------------
6305              -- Building the query for post event raising on
6306              -- rows with TT as DELETE
6307              -------------------------------------------------
6308              l_dynamic_sql_delete_post := l_dynamic_sql_delete_post || l_dynamic_query || ' ,NULL';
6309              l_dynamic_sql_delete_post := l_dynamic_sql_delete_post || ' FROM '||p_interface_table_name||' UAI1 ';
6310              l_dynamic_sql_delete_post := l_dynamic_sql_delete_post || ' WHERE UAI1.DATA_SET_ID = :data_set_id '||
6311                                                                        '  AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||
6312                                                                        '  AND UAI1.ATTR_GROUP_INT_NAME = :attr_group_int_name '||
6313                                                                        '  AND UAI1.TRANSACTION_TYPE = '''||EGO_USER_ATTRS_DATA_PVT.G_DELETE_MODE||'''';
6314              l_dynamic_sql_delete_post := l_dynamic_sql_delete_post || '  GROUP BY UAI1.ATTR_GROUP_INT_NAME, UAI1.TRANSACTION_TYPE, UAI1.ROW_IDENTIFIER ';
6315 
6316              l_dynamic_sql_delete_post := l_dynamic_sql_delete_post ||'  '|| l_dynamic_group_by;
6317 
6318              IF (l_attr_group_metadata_obj.MULTI_ROW_CODE = 'Y') THEN
6319                 l_dynamic_sql_1 := l_dynamic_sql_1 ||
6320                                 ' FROM '||p_interface_table_name||' UAI1,';
6321                 l_dynamic_sql_1 := l_dynamic_sql_1 || l_ext_table_select;
6322              ELSE
6323                 l_dynamic_sql_1 := l_dynamic_sql_1 ||
6324                                 ' FROM '||p_interface_table_name||' UAI1, '|| l_ext_vl_name || '  EXTVL1  WHERE';
6325                 l_dynamic_sql_1 := l_dynamic_sql_1 || ' 1 = 1 ';
6326              END IF;
6327 
6328              l_dynamic_sql_1 := l_dynamic_sql_1 ||'  AND UAI1.DATA_SET_ID = :data_set_id '||
6329                                                   '  AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||
6330                                                   '  AND UAI1.ATTR_GROUP_INT_NAME = :attr_group_int_name '||
6331                                                   '  AND UAI1.TRANSACTION_TYPE <> '''||EGO_USER_ATTRS_DATA_PVT.G_DELETE_MODE||'''';
6332 
6333 
6334              l_dynamic_sql_1 := l_dynamic_sql_1 || l_deflatening_sql_where;
6335              l_dynamic_sql_1 := l_dynamic_sql_1 || '   ' || l_group_by_pre || l_dynamic_group_by;
6336 
6337 
6338            END IF;-- IF ((l_new_post_event_name IS NOT NULL AND l_new_post_event_enabled_flag = 'Y')  ) THEN
6339 
6340         /*End code changes for bug 8485287*/
6341 
6342         ----------------------------------------------------------------------------------------------------------
6343         -- HERE WE BUILD THE REQUIRED QUERIES FOR THE CURSORS TO BE EXECUTED TO DEFLATEN THE DATA IN THE INTERFACE
6344         -- TABLE AND RAISE EVENT ONCE PER AG (We build the sql's only if atleast one of pre or post is enabled.)
6345         ----------------------------------------------------------------------------------------------------------
6346         IF ((l_pre_event_name IS NOT NULL AND l_is_pre_event_enabled_flag = 'Y') ) THEN
6347 
6348           l_dynamic_sql := ' SELECT EXTVL1.EXTENSION_ID , UAI1.ATTR_GROUP_INT_NAME, UAI1.TRANSACTION_TYPE, UAI1.ROW_IDENTIFIER ';
6349           l_group_by_pre := ' GROUP BY EXTVL1.EXTENSION_ID , UAI1.ATTR_GROUP_INT_NAME, UAI1.TRANSACTION_TYPE, UAI1.ROW_IDENTIFIER ';
6350           --l_dynamic_sql_delete_post := ' SELECT NULL , UAI1.ATTR_GROUP_INT_NAME, UAI1.TRANSACTION_TYPE, UAI1.ROW_IDENTIFIER ';
6351           l_dynamic_group_by := ' ';
6352           l_deflatening_sql_where := ' ';
6353           l_dynamic_query := ' ';
6354 
6355           IF (l_pk1_column_name IS NOT NULL) THEN
6356             l_dynamic_query := l_dynamic_query || ' , UAI1.' ||l_pk1_column_name;
6357             l_dynamic_group_by := l_dynamic_group_by || ' , UAI1.' ||l_pk1_column_name;
6358             l_deflatening_sql_where := l_deflatening_sql_where || ' AND UAI1.'||l_pk1_column_name||' = '||' EXTVL1.'||l_pk1_column_name;
6359           ELSE
6360             l_dynamic_query := l_dynamic_query || ' , NULL ';
6361           END IF;
6362           IF (l_pk2_column_name IS NOT NULL) THEN
6363             l_dynamic_query := l_dynamic_query || ' , UAI1.' ||l_pk2_column_name;
6364             l_dynamic_group_by := l_dynamic_group_by || ' , UAI1.' ||l_pk2_column_name;
6365             l_deflatening_sql_where := l_deflatening_sql_where || ' AND UAI1.'||l_pk2_column_name||' = '||' EXTVL1.'||l_pK2_column_name;
6366           ELSE
6367             l_dynamic_query := l_dynamic_query || ' , NULL ';
6368           END IF;
6369           IF (l_pk3_column_name IS NOT NULL) THEN
6370             l_dynamic_query := l_dynamic_query || ' , UAI1.' ||l_pk3_column_name;
6371             l_dynamic_group_by := l_dynamic_group_by || ' , UAI1.' ||l_pk3_column_name;
6372             l_deflatening_sql_where := l_deflatening_sql_where || ' AND UAI1.'||l_pk3_column_name||' = '||' EXTVL1.'||l_pk3_column_name;
6373           ELSE
6374             l_dynamic_query := l_dynamic_query || ' , NULL ';
6375           END IF;
6376           IF (l_pk4_column_name IS NOT NULL) THEN
6377             l_dynamic_query := l_dynamic_query || ' , UAI1.' ||l_pk4_column_name;
6378             l_dynamic_group_by := l_dynamic_group_by || ' , UAI1.' ||l_pk4_column_name;
6379             l_deflatening_sql_where := l_deflatening_sql_where || ' AND UAI1.'||l_pk4_column_name||' = '||' EXTVL1.'||l_pk4_column_name;
6380           ELSE
6381             l_dynamic_query := l_dynamic_query || ' , NULL ';
6382           END IF;
6383           IF (l_pk5_column_name IS NOT NULL) THEN
6384             l_dynamic_query := l_dynamic_query || ' , UAI1.' ||l_pk5_column_name;
6385             l_dynamic_group_by := l_dynamic_group_by || ' , UAI1.' ||l_pk5_column_name;
6386             l_deflatening_sql_where := l_deflatening_sql_where || ' AND UAI1.'||l_pk5_column_name||' = '||' EXTVL1.'||l_pk5_column_name;
6387           ELSE
6388             l_dynamic_query := l_dynamic_query || ' , NULL ';
6389           END IF;
6390 
6391           --------------------------------------
6392           -- Adding the data level columns ...
6393           --------------------------------------
6394           IF(l_data_level_col_exists) THEN
6395 
6396             l_dynamic_query := l_dynamic_query||' , UAI1.DATA_LEVEL_ID ';
6397             l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.DATA_LEVEL_ID ';
6398             l_deflatening_sql_where := l_deflatening_sql_where || ' AND NVL(UAI1.DATA_LEVEL_ID,-1) = NVL(EXTVL1.DATA_LEVEL_ID,-1) ';
6399 
6400       /* Bug 8488861. The following FOR loop will execute multiple times because of outer FOR loop over the Cursor l_dynamic_dist_ag_cursor.
6401                 Initializing the varibales (l_dl_pk_col1_sql etc.,) to NULL to avoid adding duplicate values, as these
6402                 variables will be used in Decode() function, which accepts only 255 parameters in some Database versions. */
6403              l_dl_pk_col1_sql:=NULL;
6404              l_dl_pk_col2_sql:=NULL;
6405              l_dl_pk_col3_sql:=NULL;
6406              l_dl_pk_col4_sql:=NULL;
6407              l_dl_pk_col5_sql:=NULL;
6408 
6409              FOR i IN l_list_of_dl_for_ag_type.FIRST .. l_list_of_dl_for_ag_type.LAST
6410              LOOP
6411                 l_dl_pk_col1_sql := l_dl_pk_col1_sql||' , '||l_list_of_dl_for_ag_type(i).DATA_LEVEL_ID||' ';
6412                 l_dl_pk_col2_sql := l_dl_pk_col2_sql||' , '||l_list_of_dl_for_ag_type(i).DATA_LEVEL_ID||' ';
6413                 l_dl_pk_col3_sql := l_dl_pk_col3_sql||' , '||l_list_of_dl_for_ag_type(i).DATA_LEVEL_ID||' ';
6414                 l_dl_pk_col4_sql := l_dl_pk_col4_sql||' , '||l_list_of_dl_for_ag_type(i).DATA_LEVEL_ID||' ';
6415                 l_dl_pk_col5_sql := l_dl_pk_col5_sql||' , '||l_list_of_dl_for_ag_type(i).DATA_LEVEL_ID||' ';
6416 
6417                 IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 <> 'NONE'
6418                    AND INSTR(l_dynamic_query,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1) = 0) THEN
6419 
6420                         l_dl_pk_col1_sql := l_dl_pk_col1_sql||' , UAI1.' ||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1;
6421                         l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1;
6422                         l_deflatening_sql_where := l_deflatening_sql_where || ' AND (UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1||
6423                                                                                      ' = '||' EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1||
6424                                                                               ' OR  ('||'UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1|| ' IS NULL '||
6425                                                                                      'AND EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1||' IS NULL))' ;
6426                 ELSE
6427                         l_dl_pk_col1_sql := l_dl_pk_col1_sql||' , NULL ';
6428                 END IF;
6429                 IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2 <> 'NONE'
6430                    AND INSTR(l_dynamic_query,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2) = 0) THEN
6431                         l_dl_pk_col2_sql := l_dl_pk_col2_sql||' , UAI1.' ||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2;
6432                         l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2;
6433                         l_deflatening_sql_where := l_deflatening_sql_where || ' AND (UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2||
6434                                                                                      ' = '||' EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2||
6435                                                                               ' OR  ('||'UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2|| ' IS NULL '||
6436                                                                                      'AND EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2||' IS NULL))' ;
6437 
6438                 ELSE
6439                         l_dl_pk_col2_sql := l_dl_pk_col2_sql||' , NULL ';
6440                 END IF;
6441                 IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3 <> 'NONE'
6442                    AND INSTR(l_dynamic_query,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3) = 0) THEN
6443                         l_dl_pk_col3_sql := l_dl_pk_col3_sql||' , UAI1.' ||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3;
6444                         l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3;
6445                         l_deflatening_sql_where := l_deflatening_sql_where || ' AND (UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3||
6446                                                                                      ' = '||' EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3||
6447                                                                               ' OR  ('||'UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3|| ' IS NULL '||
6448                                                                                      'AND EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3||' IS NULL))' ;
6449 
6450                 ELSE
6451                         l_dl_pk_col3_sql := l_dl_pk_col3_sql||' , NULL ';
6452                 END IF;
6453                 IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4 <> 'NONE'
6454                    AND INSTR(l_dynamic_query,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4) = 0) THEN
6455                         l_dl_pk_col4_sql := l_dl_pk_col4_sql||' , UAI1.' ||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4;
6456                         l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4;
6457                         l_deflatening_sql_where := l_deflatening_sql_where || ' AND (UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4||
6458                                                                                      ' = '||' EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4||
6459                                                                               ' OR  ('||'UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4|| ' IS NULL '||
6460                                                                                      'AND EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4||' IS NULL))' ;
6461 
6462                 ELSE
6463                         l_dl_pk_col4_sql := l_dl_pk_col4_sql||' , NULL ';
6464                 END IF;
6465                 IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5 <> 'NONE'
6466                    AND INSTR(l_dynamic_query,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5) = 0) THEN
6467                         l_dl_pk_col5_sql := l_dl_pk_col5_sql||' , UAI1.' ||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5;
6468                         l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5;
6469                         l_deflatening_sql_where := l_deflatening_sql_where || ' AND (UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5||
6470                                                                                      ' = '||' EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5||
6471                                                                               ' OR  ('||'UAI1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5|| ' IS NULL '||
6472                                                                                      'AND EXTVL1.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5||' IS NULL))' ;
6473 
6474                 ELSE
6475                         l_dl_pk_col5_sql := l_dl_pk_col5_sql||' , NULL ';
6476                 END IF;
6477              END LOOP;
6478              l_dynamic_query := l_dynamic_query||', DECODE(UAI1.DATA_LEVEL_ID '||l_dl_pk_col1_sql||' ) DL_PK1_VAL ';
6479              l_dynamic_query := l_dynamic_query||', DECODE(UAI1.DATA_LEVEL_ID '||l_dl_pk_col2_sql||' ) DL_PK2_VAL ';
6480              l_dynamic_query := l_dynamic_query||', DECODE(UAI1.DATA_LEVEL_ID '||l_dl_pk_col3_sql||' ) DL_PK3_VAL ';
6481              l_dynamic_query := l_dynamic_query||', DECODE(UAI1.DATA_LEVEL_ID '||l_dl_pk_col4_sql||' ) DL_PK4_VAL ';
6482              l_dynamic_query := l_dynamic_query||', DECODE(UAI1.DATA_LEVEL_ID '||l_dl_pk_col5_sql||' ) DL_PK5_VAL ';
6483 
6484           ELSE
6485                l_dynamic_query := l_dynamic_query||' ,NULL '; --this is one is to compensate for the data_level_id
6486                IF (l_num_data_level_columns = 0) THEN
6487                    l_dynamic_query := l_dynamic_query ||' , NULL ';
6488                    l_dynamic_query := l_dynamic_query ||' , NULL ';
6489                    l_dynamic_query := l_dynamic_query ||' , NULL ';
6490                    l_dynamic_query := l_dynamic_query ||' , NULL ';
6491                    l_dynamic_query := l_dynamic_query ||' , NULL ';
6492                ELSIF (l_num_data_level_columns = 1) THEN
6493                    l_dynamic_query := l_dynamic_query ||' , UAI1.' ||l_data_level_column_1;
6494                    l_dynamic_query := l_dynamic_query ||' , NULL ';
6495                    l_dynamic_query := l_dynamic_query ||' , NULL ';
6496                    l_dynamic_query := l_dynamic_query ||' , NULL ';
6497                    l_dynamic_query := l_dynamic_query ||' , NULL ';
6498                    l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_data_level_column_1;
6499                    l_deflatening_sql_where := l_deflatening_sql_where ||
6500                        ' AND (UAI1.'||l_data_level_column_1||' = '||' EXTVL1.'||l_data_level_column_1||
6501                        ' OR ('||'UAI1.'||l_data_level_column_1|| ' IS NULL AND EXTVL1.'||l_data_level_column_1||' IS NULL))' ;
6502                 ELSIF (l_num_data_level_columns = 2) THEN
6503                    l_dynamic_query := l_dynamic_query ||' , UAI1.' ||l_data_level_column_1;
6504                    l_dynamic_query := l_dynamic_query ||' , UAI1.' ||l_data_level_column_2;
6505                    l_dynamic_query := l_dynamic_query ||' , NULL ';
6506                    l_dynamic_query := l_dynamic_query ||' , NULL ';
6507                    l_dynamic_query := l_dynamic_query ||' , NULL ';
6508                    l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_data_level_column_1;
6509                    l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_data_level_column_2;
6510                    l_deflatening_sql_where := l_deflatening_sql_where ||
6511                        ' AND (UAI1.'||l_data_level_column_1||' = '||' EXTVL1.'||l_data_level_column_1||
6512                        ' OR ('||'UAI1.'||l_data_level_column_1|| ' IS NULL AND EXTVL1.'||l_data_level_column_1||' IS NULL))' ;
6513                    l_deflatening_sql_where := l_deflatening_sql_where ||
6514                        ' AND (UAI1.'||l_data_level_column_2||' = '||' EXTVL1.'||l_data_level_column_2||
6515                        ' OR ('||'UAI1.'||l_data_level_column_2|| ' IS NULL AND EXTVL1.'||l_data_level_column_2||' IS NULL))' ;
6516                 ELSIF (l_num_data_level_columns = 3) THEN
6517                    l_dynamic_query := l_dynamic_query ||' , UAI1.' ||l_data_level_column_1;
6518                    l_dynamic_query := l_dynamic_query ||' , UAI1.' ||l_data_level_column_2;
6519                    l_dynamic_query := l_dynamic_query ||' , UAI1.' ||l_data_level_column_3;
6520                    l_dynamic_query := l_dynamic_query ||' , NULL ';
6521                    l_dynamic_query := l_dynamic_query ||' , NULL ';
6522                    l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_data_level_column_1;
6523                    l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_data_level_column_2;
6524                    l_dynamic_group_by := l_dynamic_group_by ||' , UAI1.' ||l_data_level_column_3;
6525                    l_deflatening_sql_where := l_deflatening_sql_where ||
6526                        ' AND (UAI1.'||l_data_level_column_1||' = '||' EXTVL1.'||l_data_level_column_1||
6527                        ' OR ('||'UAI1.'||l_data_level_column_1|| ' IS NULL AND EXTVL1.'||l_data_level_column_1||' IS NULL))' ;
6528                    l_deflatening_sql_where := l_deflatening_sql_where ||
6529                        ' AND (UAI1.'||l_data_level_column_2||' = '||' EXTVL1.'||l_data_level_column_2||
6530                        ' OR ('||'UAI1.'||l_data_level_column_2|| ' IS NULL AND EXTVL1.'||l_data_level_column_2||' IS NULL))' ;
6531                    l_deflatening_sql_where := l_deflatening_sql_where ||
6532                        ' AND (UAI1.'||l_data_level_column_3||' = '||' EXTVL1.'||l_data_level_column_3||
6533                        ' OR ('||'UAI1.'||l_data_level_column_3|| ' IS NULL AND EXTVL1.'||l_data_level_column_3||' IS NULL))' ;
6534                 END IF;
6535           END IF;
6536 
6537           l_deflatening_sql_where := l_deflatening_sql_where || ' AND EXTVL1.ATTR_GROUP_ID ='||l_attr_group_metadata_obj.ATTR_GROUP_ID;
6538 
6539           l_defaltening_sql := ' ';
6540           l_defaltening_sql_create := ' ';
6541           FOR i IN l_attr_metadata_table.FIRST .. l_attr_metadata_table.LAST
6542           LOOP
6543                 -- abedajna begin
6544                if l_attr_metadata_table(i).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE then
6545                     l_correct_date_time_sql_uai := 'to_char(UAI1.ATTR_VALUE_DATE , '||''''||EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT ||''')';
6546                     l_correct_date_time_sql_extvl := 'to_char(EXTVL1.'||l_attr_metadata_table(i).DATABASE_COLUMN||', '''||EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT ||''')';
6547                else
6548                     l_correct_date_time_sql_uai := 'UAI1.ATTR_VALUE_DATE';
6549                     l_correct_date_time_sql_extvl := 'EXTVL1.'||l_attr_metadata_table(i).DATABASE_COLUMN;
6550                end if;
6551                 -- abedajna end
6552 
6553                l_defaltening_sql := l_defaltening_sql ||
6554                                  '||  MAX(DECODE(UAI1.ATTR_INT_NAME'||
6555                                               ','||' '''||l_attr_metadata_table(i).ATTR_NAME||''' '||
6556                                               ','||'''#*'||l_attr_metadata_table(i).ATTR_NAME||'*#'||
6557                -- abedajna delete             ' NEWVALUE:$['''|| '||' ||'UAI1.ATTR_VALUE_NUM'||'||'||'UAI1.ATTR_VALUE_DATE'||'||'||'UAI1.ATTR_VALUE_STR'||' || '']$OLDVALUE${''||'||'EXTVL1.'||l_attr_metadata_table(i).DATABASE_COLUMN||'||''}$'' '||
6558                -- abedajna add
6559                                               ' NEWVALUE:$['''|| '||' ||'UAI1.ATTR_VALUE_NUM'||'||'||l_correct_date_time_sql_uai||'||'||'UAI1.ATTR_VALUE_STR'||
6560             ' ||'']$OLDVALUE${''||'||l_correct_date_time_sql_extvl||'||''}$'' '|| ',NULL)) ';
6561 
6562                l_defaltening_sql_create := l_defaltening_sql_create ||
6563                                  '||  MAX(DECODE(UAI1.ATTR_INT_NAME'||
6564                                               ','||' '''||l_attr_metadata_table(i).ATTR_NAME||''' '||
6565                -- abedajna delete             ','||'''#*'||l_attr_metadata_table(i).ATTR_NAME||'*#'||' NEWVALUE:$['''|| '||' ||'UAI1.ATTR_VALUE_NUM'||'||'||'UAI1.ATTR_VALUE_DATE'||'||'||'UAI1.ATTR_VALUE_STR'||' || '']$'' '||
6566                -- abedajna add
6567                                               ','||'''#*'||l_attr_metadata_table(i).ATTR_NAME||'*#'||' NEWVALUE:$['''|| '||' ||'UAI1.ATTR_VALUE_NUM'||'||'||l_correct_date_time_sql_uai||'||'||'UAI1.ATTR_VALUE_STR'||' || '']$'' '||
6568                                               ',NULL)) ';
6569 
6570            END LOOP;
6571 
6572           l_dynamic_sql := l_dynamic_sql || l_dynamic_query;
6573           --l_dynamic_sql_1 := l_dynamic_sql || ' ,NULL ';
6574           l_dynamic_sql := l_dynamic_sql || ' ,  ' ||' '' '' ' || l_defaltening_sql;
6575           /*
6576           -------------------------------------------------
6577           -- Building the query for post event raising on
6578           -- rows with TT as DELETE
6579           -------------------------------------------------
6580           l_dynamic_sql_delete_post := l_dynamic_sql_delete_post || l_dynamic_query || ' ,NULL';
6581           l_dynamic_sql_delete_post := l_dynamic_sql_delete_post || ' FROM '||p_interface_table_name||' UAI1 ';
6582           l_dynamic_sql_delete_post := l_dynamic_sql_delete_post || ' WHERE UAI1.DATA_SET_ID = :data_set_id '||
6583                                                                     '  AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||
6584                                                                     '  AND UAI1.ATTR_GROUP_INT_NAME = :attr_group_int_name '||
6585                                                                     '  AND UAI1.TRANSACTION_TYPE = '''||EGO_USER_ATTRS_DATA_PVT.G_DELETE_MODE||'''';
6586           l_dynamic_sql_delete_post := l_dynamic_sql_delete_post || '  GROUP BY UAI1.ATTR_GROUP_INT_NAME, UAI1.TRANSACTION_TYPE, UAI1.ROW_IDENTIFIER ';
6587 
6588           l_dynamic_sql_delete_post := l_dynamic_sql_delete_post ||'  '|| l_dynamic_group_by;
6589           */
6590           IF (l_attr_group_metadata_obj.MULTI_ROW_CODE = 'Y') THEN
6591              l_dynamic_sql := l_dynamic_sql ||
6592                              ' FROM '||p_interface_table_name||' UAI1,';
6593              l_dynamic_sql := l_dynamic_sql || l_ext_table_select;
6594              --l_dynamic_sql_1 := l_dynamic_sql_1 ||
6595              --                ' FROM '||p_interface_table_name||' UAI1,';
6596              --l_dynamic_sql_1 := l_dynamic_sql_1 || l_ext_table_select;
6597           ELSE
6598              l_dynamic_sql := l_dynamic_sql ||
6599                              ' FROM '||p_interface_table_name||' UAI1, '|| l_ext_vl_name || '  EXTVL1  WHERE';
6600              l_dynamic_sql := l_dynamic_sql || ' 1 = 1 ';
6601              --l_dynamic_sql_1 := l_dynamic_sql_1 ||
6602              --                ' FROM '||p_interface_table_name||' UAI1, '|| l_ext_vl_name || '  EXTVL1  WHERE';
6603              --l_dynamic_sql_1 := l_dynamic_sql_1 || ' 1 = 1 ';
6604           END IF;
6605 
6606           --- Added Code  '  AND UAI1.PROCESS_STATUS <> '||G_PS_SUCCESS|| for bug 7460377
6607           l_dynamic_sql := l_dynamic_sql ||'  AND UAI1.DATA_SET_ID = :data_set_id '||
6608                                            '  AND UAI1.PROCESS_STATUS <> '||G_PS_GENERIC_ERROR||
6609              '  AND UAI1.PROCESS_STATUS <> '||G_PS_SUCCESS||
6610                                            '  AND UAI1.ATTR_GROUP_INT_NAME = :attr_group_int_name '||
6611                                            '  AND UAI1.TRANSACTION_TYPE <> '''||EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||'''';
6612           --l_dynamic_sql_1 := l_dynamic_sql_1 ||'  AND UAI1.DATA_SET_ID = :data_set_id '||
6613           --                                     '  AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||
6614           --                                     '  AND UAI1.ATTR_GROUP_INT_NAME = :attr_group_int_name '||
6615           --                                     '  AND UAI1.TRANSACTION_TYPE <> '''||EGO_USER_ATTRS_DATA_PVT.G_DELETE_MODE||'''';
6616 
6617           l_dynamic_sql := l_dynamic_sql || l_deflatening_sql_where;
6618           l_dynamic_sql := l_dynamic_sql || '   ' || l_group_by_pre || l_dynamic_group_by;
6619 
6620           --l_dynamic_sql_1 := l_dynamic_sql_1 || l_deflatening_sql_where;
6621           --l_dynamic_sql_1 := l_dynamic_sql_1 || '   ' || l_group_by_pre || l_dynamic_group_by;
6622 
6623           -- WE GENERATE THE DML FOR ERRORING OUT THE AG'S FOR WHICH PRE-EVENT RAISING HAS FAILED.
6624 
6625           IF (l_attr_group_metadata_obj.MULTI_ROW_CODE = 'Y') THEN
6626                 l_pre_event_failed_sql :=
6627                 'UPDATE '||p_interface_table_name||' UAI1
6628                 SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_PRE_EVENT_FAILED||'
6629                 WHERE DATA_SET_ID = :data_set_id
6630                 AND ATTR_GROUP_INT_NAME = :attr_group_int_name
6631               AND ROW_IDENTIFIER = :row_identifier';
6632           ELSE
6633               l_pre_event_failed_sql :=
6634               'UPDATE '||p_interface_table_name||' UAI1
6635               SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_PRE_EVENT_FAILED||'
6636               WHERE DATA_SET_ID = :data_set_id
6637               AND ATTR_GROUP_INT_NAME = :attr_group_int_name
6638             AND ROWNUM = 1';
6639           END IF;
6640 
6641           IF(l_pk1_column_name IS NOT NULL ) THEN
6642             l_pre_event_failed_sql := l_pre_event_failed_sql || ' AND '||l_pk1_column_name||' = :pk1_value ' ;
6643           END IF;
6644           IF(l_pk2_column_name IS NOT NULL ) THEN
6645             l_pre_event_failed_sql := l_pre_event_failed_sql || ' AND '||l_pk2_column_name||' = :pk2_value ';
6646           END IF;
6647           IF(l_pk3_column_name IS NOT NULL ) THEN
6648             l_pre_event_failed_sql := l_pre_event_failed_sql || ' AND '||l_pk3_column_name||' = :pk3_value ' ;
6649           END IF;
6650           IF(l_pk4_column_name IS NOT NULL ) THEN
6651             l_pre_event_failed_sql := l_pre_event_failed_sql || ' AND '||l_pk4_column_name||' = :pk4_value ' ;
6652           END IF;
6653           IF(l_pk5_column_name IS NOT NULL ) THEN
6654             l_pre_event_failed_sql := l_pre_event_failed_sql || ' AND '||l_pk5_column_name||' = :pk5_value ' ;
6655           END IF;
6656 
6657           IF(l_data_level_col_exists) THEN
6658 
6659             l_pre_event_failed_sql := l_pre_event_failed_sql || ' AND ';
6660 
6661             FOR i IN l_list_of_dl_for_ag_type.FIRST .. l_list_of_dl_for_ag_type.LAST
6662             LOOP
6663 
6664               IF(i=1) THEN
6665                 l_pre_event_failed_sql := l_pre_event_failed_sql || ' (DATA_LEVEL_ID = :dl_id ' ;
6666               ELSE
6667                 l_pre_event_failed_sql := l_pre_event_failed_sql || ' OR (DATA_LEVEL_ID = :dl_id ' ;
6668               END IF;
6669 
6670               IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 <> 'NONE' ) THEN
6671                 l_pre_event_failed_sql := l_pre_event_failed_sql || ' AND '||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1||' = :dl_pk1_val ' ;
6672               ELSE
6673                 l_pre_event_failed_sql := l_pre_event_failed_sql || ' AND :dl_pk1_val IS NULL ' ;
6674               END IF;
6675 
6676               IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2 <> 'NONE' ) THEN
6677                 l_pre_event_failed_sql := l_pre_event_failed_sql || ' AND '||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2||' = :dl_pk2_val ' ;
6678               ELSE
6679                 l_pre_event_failed_sql := l_pre_event_failed_sql || ' AND :dl_pk2_val IS NULL ' ;
6680               END IF;
6681               IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3 <> 'NONE' ) THEN
6682                 l_pre_event_failed_sql := l_pre_event_failed_sql || ' AND '||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3||' = :dl_pk3_val ' ;
6683               ELSE
6684                 l_pre_event_failed_sql := l_pre_event_failed_sql || ' AND :dl_pk3_val IS NULL ' ;
6685               END IF;
6686               IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4 <> 'NONE' ) THEN
6687                 l_pre_event_failed_sql := l_pre_event_failed_sql || ' AND '||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4||' = :dl_pk4_val ' ;
6688               ELSE
6689                 l_pre_event_failed_sql := l_pre_event_failed_sql || ' AND :dl_pk4_val IS NULL ' ;
6690               END IF;
6691               IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5 <> 'NONE' ) THEN
6692                 l_pre_event_failed_sql := l_pre_event_failed_sql || ' AND '||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5||' = :dl_pk5_val ' ;
6693               ELSE
6694                 l_pre_event_failed_sql := l_pre_event_failed_sql || ' AND :dl_pk5_val IS NULL ' ;
6695               END IF;
6696               ---
6697               -- Bug 16163078 , added below clause for
6698               -- correctly placing the braces in the constructed SQL
6699               -- otherwise the SQL errors out
6700               ---
6701               IF ( i <> 1) THEN
6702                 l_pre_event_failed_sql := l_pre_event_failed_sql || ' ) ';
6703               END IF;
6704           END LOOP;
6705 
6706               l_pre_event_failed_sql := l_pre_event_failed_sql || ' ) ';
6707 
6708           ELSE
6709             IF(l_data_level_column_1 IS NOT NULL ) THEN
6710               l_pre_event_failed_sql := l_pre_event_failed_sql || ' AND ( ('||l_data_level_column_1||' = :dl1_value) OR ('||l_data_level_column_1||' IS NULL AND :dl1_value IS NULL)) ' ;
6711             END IF;
6712             IF(l_data_level_column_2 IS NOT NULL ) THEN
6713               l_pre_event_failed_sql := l_pre_event_failed_sql || ' AND ( ('||l_data_level_column_2||' = :dl2_value) OR ('||l_data_level_column_2||' IS NULL AND :dl2_value IS NULL)) ' ;
6714             END IF;
6715             IF(l_data_level_column_3 IS NOT NULL ) THEN
6716               l_pre_event_failed_sql := l_pre_event_failed_sql || ' AND ( ('||l_data_level_column_3||' = :dl3_value) OR ('||l_data_level_column_3||' IS NULL AND :dl3_value IS NULL)) ' ;
6717             END IF;
6718           END IF;
6719 
6720        END IF;-- ending if for checking weather or not raise pre/post events
6721 
6722           -----------------------------------------------------------------------
6723           -- WE ARE DONE WITH BUILDING TEH QUERIES ... NOW WE RAISE EVENTS ...
6724           -- RAISING EVENT FOR ALL THE AG ROWS WHICH ARE *NOT* BEING CREATED
6725           -----------------------------------------------------------------------
6726 
6727         IF (l_pre_event_name IS NOT NULL AND l_is_pre_event_enabled_flag = 'Y') THEN
6728           --------------------------------------------------------------
6729           -- Here we raise events only for AG Rows not in CREATE Mode
6730           --------------------------------------------------------------
6731 
6732           OPEN l_dynamic_cursor FOR l_dynamic_sql
6733           USING p_data_set_id, l_attr_group_metadata_obj.ATTR_GROUP_NAME;
6734           LOOP
6735             FETCH l_dynamic_cursor INTO l_ag_deflatened_row;
6736             EXIT WHEN l_dynamic_cursor%NOTFOUND;
6737             -- Loop through the deflatened string containing the old and new values and
6738             -- prepare the table to be passed in as a parameter to pre-event
6739             l_attr_name_val_str := l_ag_deflatened_row.ATTR_NAME_VALUES;
6740             attr_name_val_pair := EGO_ATTR_TABLE();
6741             WHILE (INSTR(l_attr_name_val_str,'#') <> 0 AND l_ag_deflatened_row.TRANSACTION_TYPE <> EGO_USER_ATTRS_DATA_PVT.G_DELETE_MODE)
6742             LOOP
6743               l_attr_name := SUBSTR(l_attr_name_val_str
6744                                     ,INSTR(l_attr_name_val_str,'#*')+2
6745                                     ,INSTR(l_attr_name_val_str,'*#')-INSTR(l_attr_name_val_str,'#*')-2
6746                                     );
6747               l_old_value := SUBSTR(l_attr_name_val_str
6748                                     ,INSTR(l_attr_name_val_str,'${')+2
6749                                     ,INSTR(l_attr_name_val_str,'}$')-INSTR(l_attr_name_val_str,'${')-2
6750                                     );
6751               l_new_value := SUBSTR(l_attr_name_val_str
6752                                     ,INSTR(l_attr_name_val_str,'$[')+2
6753                                     ,INSTR(l_attr_name_val_str,']$')-INSTR(l_attr_name_val_str,'$[')-2
6754                                     );
6755 
6756               l_attr_name_val_str := SUBSTR(l_attr_name_val_str
6757                                             ,INSTR(l_attr_name_val_str,'}$')+2
6758                                             ,LENGTH(l_attr_name_val_str)-INSTR(l_attr_name_val_str,'}$')+2
6759                                             );
6760               IF (l_old_value = l_new_value OR (l_old_value IS NULL AND l_new_value IS NULL) ) THEN
6761                 NULL;
6762               ELSE
6763                 attr_name_val_pair.EXTEND();
6764                 attr_name_val_pair(attr_name_val_pair.LAST) := EGO_ATTR_REC(l_attr_name, l_new_value);
6765               END IF;
6766             END LOOP; -- while for extracting name value pairs ends here
6767 
6768             -------------------------------------------------
6769             -- NOW WE HAVE ALL THE DATA TO RAISE THE EVENT --
6770             -- HERE WE RAISE PRE-EVENTS FOR AG ROWS BEING
6771             -- UPDATED OR DELETED.
6772             -------------------------------------------------
6773             BEGIN
6774               IF(l_data_level_col_exists) THEN
6775                 FOR i IN l_list_of_dl_for_ag_type.FIRST .. l_list_of_dl_for_ag_type.LAST
6776                 LOOP
6777                    IF(l_ag_deflatened_row.DATA_LEVEL_ID = l_list_of_dl_for_ag_type(i).DATA_LEVEL_ID) THEN
6778                      l_dl_pk1_col_name := l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1;
6779                      l_dl_pk2_col_name := l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2;
6780                      l_dl_pk3_col_name := l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3;
6781                      l_dl_pk4_col_name := l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4;
6782                      l_dl_pk5_col_name := l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5;
6783                    END IF;
6784                 END LOOP;
6785               ELSE
6786                 l_dl_pk1_col_name := l_data_level_column_1;
6787                 l_dl_pk2_col_name := l_data_level_column_2;
6788                 l_dl_pk3_col_name := l_data_level_column_3;
6789                 l_dl_pk4_col_name := null;
6790                 l_dl_pk5_col_name := null;
6791               END IF;
6792 
6793               l_event_key := SUBSTRB(l_pre_event_name, 1, 225) || '-' || TO_CHAR(SYSDATE, 'J.SSSSS');
6794 
6795               EGO_WF_WRAPPER_PVT.Raise_WF_Business_Event(
6796                p_event_name                    => l_pre_event_name
6797               ,p_event_key                     => l_event_key
6798               ,p_pre_event_flag                => 'T'
6799               ,p_dml_type                      => l_ag_deflatened_row.TRANSACTION_TYPE
6800               ,p_attr_group_name               => l_ag_deflatened_row.ATTR_GROUP_INT_NAME
6801               ,p_extension_id                  => l_ag_deflatened_row.EXTENSION_ID
6802               ,p_primary_key_1_col_name        => l_pk1_column_name
6803               ,p_primary_key_1_value           => l_ag_deflatened_row.PK1
6804               ,p_primary_key_2_col_name        => l_pk2_column_name
6805               ,p_primary_key_2_value           => l_ag_deflatened_row.PK2
6806               ,p_primary_key_3_col_name        => l_pk3_column_name
6807               ,p_primary_key_3_value           => l_ag_deflatened_row.PK3
6808               ,p_primary_key_4_col_name        => l_pk4_column_name
6809               ,p_primary_key_4_value           => l_ag_deflatened_row.PK4
6810               ,p_primary_key_5_col_name        => l_pk5_column_name
6811               ,p_primary_key_5_value           => l_ag_deflatened_row.PK5
6812               ,p_data_level_id                 => l_ag_deflatened_row.DATA_LEVEL_ID
6813               ,p_data_level_1_col_name         => l_dl_pk1_col_name
6814               ,p_data_level_1_value            => l_ag_deflatened_row.DL1
6815               ,p_data_level_2_col_name         => l_dl_pk2_col_name
6816               ,p_data_level_2_value            => l_ag_deflatened_row.DL2
6817               ,p_data_level_3_col_name         => l_dl_pk3_col_name
6818               ,p_data_level_3_value            => l_ag_deflatened_row.DL3
6819               ,p_data_level_4_col_name         => l_dl_pk4_col_name
6820               ,p_data_level_4_value            => l_ag_deflatened_row.DL4
6821               ,p_data_level_5_col_name         => l_dl_pk5_col_name
6822               ,p_data_level_5_value            => l_ag_deflatened_row.DL5
6823               ,p_user_row_identifier           => l_ag_deflatened_row.ROW_IDENTIFIER
6824               ,p_attr_name_val_tbl             => attr_name_val_pair
6825               ,p_entity_id                     => p_entity_id
6826               ,p_entity_index                  => p_entity_index
6827               ,p_entity_code                   => p_entity_code
6828               ,p_add_errors_to_fnd_stack       => G_ADD_ERRORS_TO_FND_STACK
6829               );
6830             EXCEPTION
6831               WHEN EGO_USER_ATTRS_COMMON_PVT.G_SUBSCRIPTION_EXC THEN
6832                 IF (l_pre_event_failed_cursor_id IS NULL) THEN
6833                   l_pre_event_failed_cursor_id := DBMS_SQL.Open_Cursor;
6834                 END IF;
6835 
6836 
6837                 DBMS_SQL.Parse(l_pre_event_failed_cursor_id, l_pre_event_failed_sql, DBMS_SQL.NATIVE);
6838 
6839                 DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id, ':data_set_id', p_data_set_id);
6840                 DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id, ':attr_group_int_name', l_ag_deflatened_row.ATTR_GROUP_INT_NAME);
6841                 IF (l_attr_group_metadata_obj.MULTI_ROW_CODE = 'Y') THEN
6842                     DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':row_identifier',l_ag_deflatened_row.ROW_IDENTIFIER) ;
6843                 END IF;
6844 
6845                 IF(l_pk1_column_name IS NOT NULL ) THEN
6846                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':pk1_value',l_ag_deflatened_row.PK1) ;
6847                 END IF;
6848                 IF(l_pk2_column_name IS NOT NULL ) THEN
6849                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':pk2_value',l_ag_deflatened_row.PK2) ;
6850                 END IF;
6851                 IF(l_pk3_column_name IS NOT NULL ) THEN
6852                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':pk3_value',l_ag_deflatened_row.PK3) ;
6853                 END IF;
6854                 IF(l_pk4_column_name IS NOT NULL ) THEN
6855                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':pk4_value',l_ag_deflatened_row.PK4) ;
6856                 END IF;
6857                 IF(l_pk5_column_name IS NOT NULL ) THEN
6858                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':pk5_value',l_ag_deflatened_row.PK5) ;
6859                 END IF;
6860 
6861                 IF(l_data_level_col_exists) THEN
6862                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':dl_id',l_ag_deflatened_row.DATA_LEVEL_ID) ;
6863                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':dl_pk1_val',l_ag_deflatened_row.DL1) ;
6864                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':dl_pk2_val',l_ag_deflatened_row.DL2) ;
6865                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':dl_pk3_val',l_ag_deflatened_row.DL3) ;
6866                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':dl_pk4_val',l_ag_deflatened_row.DL4) ;
6867                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':dl_pk5_val',l_ag_deflatened_row.DL5) ;
6868                 ELSE
6869                   IF(l_data_level_column_1 IS NOT NULL ) THEN
6870                     DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':dl1_value',l_ag_deflatened_row.DL1) ;
6871                   END IF;
6872                   IF(l_data_level_column_2 IS NOT NULL ) THEN
6873                     DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':dl2_value',l_ag_deflatened_row.DL2) ;
6874                   END IF;
6875                   IF(l_data_level_column_3 IS NOT NULL ) THEN
6876                     DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':dl3_value',l_ag_deflatened_row.DL3) ;
6877                   END IF;
6878                 END IF;
6879 
6880                 l_dummy := DBMS_SQL.Execute(l_pre_event_failed_cursor_id);
6881                 DBMS_SQL.Close_Cursor (l_pre_event_failed_cursor_id);
6882 
6883             END;
6884           END LOOP;--iteration in l_dynamic_cursor ends
6885 
6886           CLOSE l_dynamic_cursor;
6887           ----------------------------------------------------------------------------------------
6888           -- WE NEED TO BUILD THE SQL FOR THE CURSOR FOR RAISING EVENTS FOR AG ROWS BEING CREATED
6889           -- SINCE FOR THE ROWS BEING CREATED THE SQL CHANGES AS WE DO NOT HAVE TO GO TO THE EXT
6890           -- TABLE TO GET THE EXTENSION ID.
6891           ----------------------------------------------------------------------------------------
6892 
6893           --- Added Code  '  AND UAI1.PROCESS_STATUS <> '||G_PS_SUCCESS|| for bug 7460377
6894           l_dynamic_sql := ' SELECT NULL , UAI1.ATTR_GROUP_INT_NAME, UAI1.TRANSACTION_TYPE, UAI1.ROW_IDENTIFIER ';
6895           l_dynamic_sql := l_dynamic_sql || l_dynamic_query;
6896           l_dynamic_sql := l_dynamic_sql || ' ,  ' ||' '' '' ' || l_defaltening_sql_create;
6897           l_dynamic_sql := l_dynamic_sql || ' FROM '||p_interface_table_name||' UAI1 ';
6898           l_dynamic_sql := l_dynamic_sql || '  WHERE UAI1.DATA_SET_ID = :data_set_id '||
6899                                             '  AND UAI1.PROCESS_STATUS <> '||G_PS_GENERIC_ERROR||
6900               '  AND UAI1.PROCESS_STATUS <> '||G_PS_SUCCESS||
6901                                             '  AND UAI1.ATTR_GROUP_INT_NAME = :attr_group_int_name '||
6902                                             '  AND UAI1.TRANSACTION_TYPE = '''||EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||'''';
6903           l_dynamic_sql := l_dynamic_sql || '  GROUP BY  UAI1.ATTR_GROUP_INT_NAME, UAI1.TRANSACTION_TYPE, UAI1.ROW_IDENTIFIER '
6904                                          || l_dynamic_group_by;
6905 
6906           -------------------------------------------------------------------
6907           -- RAISING EVENT FOR ALL THE AG ROWS WHICH ARE *BEING* CREATED
6908           -------------------------------------------------------------------
6909           code_debug('before raising event for create rows ...');
6910           code_debug(l_dynamic_sql);
6911           OPEN l_dynamic_cursor FOR l_dynamic_sql
6912           USING p_data_set_id, l_attr_group_metadata_obj.ATTR_GROUP_NAME;
6913           LOOP
6914             FETCH l_dynamic_cursor INTO l_ag_deflatened_row;
6915             EXIT WHEN l_dynamic_cursor%NOTFOUND;
6916             -- Loop through the deflatened string containing the old values and
6917             -- prepare the table to be passed in as a parameter to pre-event
6918             l_attr_name_val_str := l_ag_deflatened_row.ATTR_NAME_VALUES;
6919             attr_name_val_pair := EGO_ATTR_TABLE();
6920             WHILE (INSTR(l_attr_name_val_str,'#*') <> 0)
6921             LOOP
6922               l_attr_name := SUBSTR(l_attr_name_val_str
6923                                     ,INSTR(l_attr_name_val_str,'#*')+2
6924                                     ,INSTR(l_attr_name_val_str,'*#')-INSTR(l_attr_name_val_str,'#*')-2
6925                                     );
6926               l_new_value := SUBSTR(l_attr_name_val_str
6927                                     ,INSTR(l_attr_name_val_str,'$[')+2
6928                                     ,INSTR(l_attr_name_val_str,']$')-INSTR(l_attr_name_val_str,'$[')-2
6929                                     );
6930 
6931               l_attr_name_val_str := SUBSTR(l_attr_name_val_str
6932                                             ,INSTR(l_attr_name_val_str,']$')+2
6933                                             ,LENGTH(l_attr_name_val_str)-INSTR(l_attr_name_val_str,'}$')+2
6934                                             );
6935               attr_name_val_pair.EXTEND();
6936               attr_name_val_pair(attr_name_val_pair.LAST) := EGO_ATTR_REC(l_attr_name, l_new_value);
6937             END LOOP; -- while for extracting name value pairs ends here
6938             -- We need to pass null as a value for all those attrs which are not
6939             -- entered by the user.
6940             FOR i IN l_attr_metadata_table.FIRST .. l_attr_metadata_table.LAST
6941             LOOP
6942               IF(INSTR(l_ag_deflatened_row.ATTR_NAME_VALUES,l_attr_metadata_table(i).ATTR_NAME) = 0) THEN
6943                  attr_name_val_pair.EXTEND();
6944                  attr_name_val_pair(attr_name_val_pair.LAST) := EGO_ATTR_REC(l_attr_metadata_table(i).ATTR_NAME, NULL);
6945               END IF;
6946             END LOOP;
6947 
6948            ----------------------------------------------------------------------
6949            -- NOW WE HAVE ALL THE DATA TO RAISE THE EVENT (Lets do it now ...) --
6950            ----------------------------------------------------------------------
6951             BEGIN
6952 
6953               IF(l_data_level_col_exists) THEN
6954                 FOR i IN l_list_of_dl_for_ag_type.FIRST .. l_list_of_dl_for_ag_type.LAST
6955                 LOOP
6956                    IF(l_ag_deflatened_row.DATA_LEVEL_ID = l_list_of_dl_for_ag_type(i).DATA_LEVEL_ID) THEN
6957                      l_dl_pk1_col_name := l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1;
6958                      l_dl_pk2_col_name := l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2;
6959                      l_dl_pk3_col_name := l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3;
6960                      l_dl_pk4_col_name := l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4;
6961                      l_dl_pk5_col_name := l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5;
6962                    END IF;
6963                 END LOOP;
6964               ELSE
6965                 l_dl_pk1_col_name := l_data_level_column_1;
6966                 l_dl_pk2_col_name := l_data_level_column_2;
6967                 l_dl_pk3_col_name := l_data_level_column_3;
6968                 l_dl_pk4_col_name := null;
6969                 l_dl_pk5_col_name := null;
6970               END IF;
6971               l_event_key := SUBSTRB(l_pre_event_name, 1, 225) || '-' || TO_CHAR(SYSDATE, 'J.SSSSS');
6972 
6973                EGO_WF_WRAPPER_PVT.Raise_WF_Business_Event(
6974                p_event_name                    => l_pre_event_name
6975               ,p_event_key                     => l_event_key
6976               ,p_pre_event_flag                => 'T'
6977               ,p_dml_type                      => l_ag_deflatened_row.TRANSACTION_TYPE
6978               ,p_attr_group_name               => l_ag_deflatened_row.ATTR_GROUP_INT_NAME
6979               ,p_extension_id                  => l_ag_deflatened_row.EXTENSION_ID
6980               ,p_primary_key_1_col_name        => l_pk1_column_name
6981               ,p_primary_key_1_value           => l_ag_deflatened_row.PK1
6982               ,p_primary_key_2_col_name        => l_pk2_column_name
6983               ,p_primary_key_2_value           => l_ag_deflatened_row.PK2
6984               ,p_primary_key_3_col_name        => l_pk3_column_name
6985               ,p_primary_key_3_value           => l_ag_deflatened_row.PK3
6986               ,p_primary_key_4_col_name        => l_pk4_column_name
6987               ,p_primary_key_4_value           => l_ag_deflatened_row.PK4
6988               ,p_primary_key_5_col_name        => l_pk5_column_name
6989               ,p_primary_key_5_value           => l_ag_deflatened_row.PK5
6990               ,p_data_level_id                 => l_ag_deflatened_row.DATA_LEVEL_ID
6991               ,p_data_level_1_col_name         => l_dl_pk1_col_name
6992               ,p_data_level_1_value            => l_ag_deflatened_row.DL1
6993               ,p_data_level_2_col_name         => l_dl_pk2_col_name
6994               ,p_data_level_2_value            => l_ag_deflatened_row.DL2
6995               ,p_data_level_3_col_name         => l_dl_pk3_col_name
6996               ,p_data_level_3_value            => l_ag_deflatened_row.DL3
6997               ,p_data_level_4_col_name         => l_dl_pk4_col_name
6998               ,p_data_level_4_value            => l_ag_deflatened_row.DL4
6999               ,p_data_level_5_col_name         => l_dl_pk5_col_name
7000               ,p_data_level_5_value            => l_ag_deflatened_row.DL5
7001               ,p_user_row_identifier           => l_ag_deflatened_row.ROW_IDENTIFIER
7002               ,p_attr_name_val_tbl             => attr_name_val_pair
7003               ,p_entity_id                     => p_entity_id
7004               ,p_entity_index                  => p_entity_index
7005               ,p_entity_code                   => p_entity_code
7006               ,p_add_errors_to_fnd_stack       => G_ADD_ERRORS_TO_FND_STACK
7007               );
7008             EXCEPTION
7009               WHEN EGO_USER_ATTRS_COMMON_PVT.G_SUBSCRIPTION_EXC THEN
7010                 IF (l_pre_event_failed_cursor_id IS NULL) THEN
7011                   l_pre_event_failed_cursor_id := DBMS_SQL.Open_Cursor;
7012                 END IF;
7013 
7014                 DBMS_SQL.Parse(l_pre_event_failed_cursor_id, l_pre_event_failed_sql, DBMS_SQL.NATIVE);
7015 
7016                 DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id, ':data_set_id', p_data_set_id);
7017                 DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id, ':attr_group_int_name', l_ag_deflatened_row.ATTR_GROUP_INT_NAME);
7018                   IF (l_attr_group_metadata_obj.MULTI_ROW_CODE = 'Y') THEN
7019                           DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':row_identifier',l_ag_deflatened_row.ROW_IDENTIFIER) ;
7020                 END IF   ;
7021 
7022                 IF(l_pk1_column_name IS NOT NULL ) THEN
7023                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':pk1_value',l_ag_deflatened_row.PK1) ;
7024                 END IF;
7025                 IF(l_pk2_column_name IS NOT NULL ) THEN
7026                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':pk2_value',l_ag_deflatened_row.PK2) ;
7027                 END IF;
7028                 IF(l_pk3_column_name IS NOT NULL ) THEN
7029                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':pk3_value',l_ag_deflatened_row.PK3) ;
7030                 END IF;
7031                 IF(l_pk4_column_name IS NOT NULL ) THEN
7032                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':pk4_value',l_ag_deflatened_row.PK4) ;
7033                 END IF;
7034                 IF(l_pk5_column_name IS NOT NULL ) THEN
7035                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':pk5_value',l_ag_deflatened_row.PK5) ;
7036                 END IF;
7037 
7038                 IF(l_data_level_col_exists) THEN
7039                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':dl_id',l_ag_deflatened_row.DATA_LEVEL_ID) ;
7040                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':dl_pk1_val',l_ag_deflatened_row.DL1) ;
7041                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':dl_pk2_val',l_ag_deflatened_row.DL2) ;
7042                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':dl_pk3_val',l_ag_deflatened_row.DL3) ;
7043                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':dl_pk4_val',l_ag_deflatened_row.DL4) ;
7044                   DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':dl_pk5_val',l_ag_deflatened_row.DL5) ;
7045                 ELSE
7046                   IF(l_data_level_column_1 IS NOT NULL ) THEN
7047                     DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':dl1_value',l_ag_deflatened_row.DL1) ;
7048                   END IF;
7049                   IF(l_data_level_column_2 IS NOT NULL ) THEN
7050                     DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':dl2_value',l_ag_deflatened_row.DL2) ;
7051                   END IF;
7052                   IF(l_data_level_column_3 IS NOT NULL ) THEN
7053                     DBMS_SQL.Bind_Variable(l_pre_event_failed_cursor_id,':dl3_value',l_ag_deflatened_row.DL3) ;
7054                   END IF;
7055                 END IF;
7056 
7057                 l_dummy := DBMS_SQL.Execute(l_pre_event_failed_cursor_id);
7058                 DBMS_SQL.Close_Cursor (l_pre_event_failed_cursor_id);
7059 
7060             END;
7061 
7062           END LOOP;--iteration in l_dynamic_cursor ends
7063           CLOSE l_dynamic_cursor;
7064 
7065           -------------------------------------------------
7066           --
7067           -------------------------------------------------
7068         END IF;
7069 
7070       ------- WE ARE DONE WITH RAISING PRE EVENTS
7071       END IF; --*p_do_dml-IF-1* ending the p_do_dml IF
7072 
7073 
7074                           --===========--
7075                           -- DML SETUP --
7076                           --===========--
7077 
7078       code_debug('          Before the DML for ATTR GROUP '||l_attr_group_intf_rec.ATTR_GROUP_INT_NAME ,2);
7079 
7080       ----------------------------------------------------------------
7081       -- Build a row-to-column transformation query and the various --
7082       -- bits and pieces needed for our DMLs; we can build the base --
7083       -- parts once and re-use them throughout our looping, but we  --
7084       -- will need to build the Attr Group-specific parts for each  --
7085       -- distinct Attr Group we process                             --
7086       ----------------------------------------------------------------
7087       IF (l_row_to_column_query_base IS NULL) THEN
7088 
7089         -------------------------------------------------------------
7090         -- Start the query base, CC/PK/DL lists, etc. from scratch --
7091         -- as they will only be built once per call and re-used    --
7092         -------------------------------------------------------------
7093         -- GNANDA: the extension_id col added in the select below is just a dummy column, we donot use it anywhere
7094         -- this was added coz for supporting TL UK cols we had to add the extension_id column in the UK where clause
7095         -- and hence it was reqd. in the RTCQ
7096         l_row_to_column_query_base := 'SELECT 2910 EXTENSION_ID, MAX(ROW_IDENTIFIER) ROW_IDENTIFIER,MAX(TRANSACTION_TYPE) TRANSACTION_TYPE,MAX(ATTR_GROUP_ID) ATTR_GROUP_ID,MAX('||l_class_code_column_name||') '||l_class_code_column_name;
7097         l_rtcq_alias_cc_pk_dl_list := ',RTCQ.'||l_class_code_column_name;
7098         l_no_alias_cc_pk_dl_list := ','||l_class_code_column_name;
7099         IF(l_ag_id_col_exists) THEN
7100           l_rtcq_to_ext_where_base := ' AND RTCQ.ATTR_GROUP_ID=EXT.ATTR_GROUP_ID AND EXT.ATTR_GROUP_ID=:curr_attr_group_id';
7101         ELSE
7102           l_rtcq_to_ext_where_base := ' AND 2=2 ';
7103         END IF;
7104 
7105         l_db_col_tbl_declare_ext_id := 'ext_id_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_NUM_TBL;';
7106         l_db_col_tbl_collect_ext_id := 'ext_id_tbl';
7107 
7108         IF(l_ag_id_col_exists) THEN
7109           l_db_col_tbl_where_ext_id := 'EXT.ATTR_GROUP_ID=:curr_attr_group_id AND EXT.EXTENSION_ID=ext_id_tbl(i)';
7110         ELSE
7111           l_db_col_tbl_where_ext_id := ' 1=1 AND EXT.EXTENSION_ID=ext_id_tbl(i)';
7112         END IF;
7113 
7114         ------------------------
7115         -- Add the PK columns --
7116         ------------------------
7117         l_concat_pk_cols := '';  -- Bug 9851212
7118 
7119         IF (l_pk1_column_name IS NOT NULL) THEN
7120           l_row_to_column_query_base := l_row_to_column_query_base||
7121                                         ',MAX('||l_pk1_column_name||') '||
7122                                         l_pk1_column_name;
7123           l_rtcq_alias_cc_pk_dl_list := l_rtcq_alias_cc_pk_dl_list||
7124                                         ',RTCQ.'||l_pk1_column_name;
7125           l_no_alias_cc_pk_dl_list := l_no_alias_cc_pk_dl_list||','||l_pk1_column_name;
7126           l_rtcq_to_ext_where_base := l_rtcq_to_ext_where_base||
7127                                       ' AND RTCQ.'||l_pk1_column_name||'=EXT.'||l_pk1_column_name;
7128           l_concat_pk_cols := l_concat_pk_cols||', '||l_pk1_column_name;    -- Bug 9851212
7129         END IF;
7130         IF (l_pk2_column_name IS NOT NULL) THEN
7131           l_row_to_column_query_base := l_row_to_column_query_base||
7132                                         ',MAX('||l_pk2_column_name||') '||
7133                                         l_pk2_column_name;
7134           l_rtcq_alias_cc_pk_dl_list := l_rtcq_alias_cc_pk_dl_list||
7135                                         ',RTCQ.'||l_pk2_column_name;
7136           l_no_alias_cc_pk_dl_list := l_no_alias_cc_pk_dl_list||','||l_pk2_column_name;
7137           l_rtcq_to_ext_where_base := l_rtcq_to_ext_where_base||
7138                                       ' AND RTCQ.'||l_pk2_column_name||'=EXT.'||l_pk2_column_name;
7139           l_concat_pk_cols := l_concat_pk_cols||', '||l_pk2_column_name;    -- Bug 9851212
7140         END IF;
7141         IF (l_pk3_column_name IS NOT NULL) THEN
7142           l_row_to_column_query_base := l_row_to_column_query_base||
7143                                         ',MAX('||l_pk3_column_name||') '||
7144                                         l_pk3_column_name;
7145           l_rtcq_alias_cc_pk_dl_list := l_rtcq_alias_cc_pk_dl_list||
7146                                         ',RTCQ.'||l_pk3_column_name;
7147           l_no_alias_cc_pk_dl_list := l_no_alias_cc_pk_dl_list||','||l_pk3_column_name;
7148           l_rtcq_to_ext_where_base := l_rtcq_to_ext_where_base||
7149                                       ' AND RTCQ.'||l_pk3_column_name||'=EXT.'||l_pk3_column_name;
7150           l_concat_pk_cols := l_concat_pk_cols||', '||l_pk3_column_name;    -- Bug 9851212
7151         END IF;
7152         IF (l_pk4_column_name IS NOT NULL) THEN
7153           l_row_to_column_query_base := l_row_to_column_query_base||
7154                                         ',MAX('||l_pk4_column_name||') '||
7155                                         l_pk4_column_name;
7156           l_rtcq_alias_cc_pk_dl_list := l_rtcq_alias_cc_pk_dl_list||
7157                                         ',RTCQ.'||l_pk4_column_name;
7158           l_no_alias_cc_pk_dl_list := l_no_alias_cc_pk_dl_list||','||l_pk4_column_name;
7159           l_rtcq_to_ext_where_base := l_rtcq_to_ext_where_base||
7160                                       ' AND RTCQ.'||l_pk4_column_name||'=EXT.'||l_pk4_column_name;
7161           l_concat_pk_cols := l_concat_pk_cols||', '||l_pk4_column_name;    -- Bug 9851212
7162         END IF;
7163         IF (l_pk5_column_name IS NOT NULL) THEN
7164           l_row_to_column_query_base := l_row_to_column_query_base||
7165                                         ',MAX('||l_pk5_column_name||') '||
7166                                         l_pk5_column_name;
7167           l_rtcq_alias_cc_pk_dl_list := l_rtcq_alias_cc_pk_dl_list||
7168                                         ',RTCQ.'||l_pk5_column_name;
7169           l_no_alias_cc_pk_dl_list := l_no_alias_cc_pk_dl_list||','||l_pk5_column_name;
7170           l_rtcq_to_ext_where_base := l_rtcq_to_ext_where_base||
7171                                       ' AND RTCQ.'||l_pk5_column_name||'=EXT.'||l_pk5_column_name;
7172           l_concat_pk_cols := l_concat_pk_cols||', '||l_pk5_column_name;    -- Bug 9851212
7173         END IF;
7174 
7175         ------------------------------------------------
7176         -- Finally, add the DL columns (if necessary) --
7177         ------------------------------------------------
7178         IF(l_data_level_col_exists) THEN
7179 
7180           l_row_to_column_query_base := l_row_to_column_query_base||',MAX(DATA_LEVEL_ID) DATA_LEVEL_ID ';
7181           l_rtcq_alias_cc_pk_dl_list := l_rtcq_alias_cc_pk_dl_list||',RTCQ.DATA_LEVEL_ID ';
7182           l_no_alias_cc_pk_dl_list := l_no_alias_cc_pk_dl_list||', DATA_LEVEL_ID ';
7183           l_rtcq_to_ext_where_base := l_rtcq_to_ext_where_base||
7184                                       ' AND NVL(RTCQ.DATA_LEVEL_ID,-1)=NVL(EXT.DATA_LEVEL_ID ,-1)';
7185 
7186           FOR i IN l_list_of_dl_for_ag_type.FIRST .. l_list_of_dl_for_ag_type.LAST
7187           LOOP
7188               IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 <> 'NONE'
7189                   AND INSTR(l_row_to_column_query_base,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1) = 0) THEN
7190 
7191                   l_row_to_column_query_base := l_row_to_column_query_base||',MAX('||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1||') '||
7192                                                 l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1;
7193                   l_rtcq_alias_cc_pk_dl_list := l_rtcq_alias_cc_pk_dl_list||',RTCQ.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1;
7194                   l_no_alias_cc_pk_dl_list := l_no_alias_cc_pk_dl_list||','||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1;
7195                   l_rtcq_to_ext_where_base := l_rtcq_to_ext_where_base||
7196                                               ' AND NVL(RTCQ.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1||
7197                                               ',-1)=NVL(EXT.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1||',-1)';
7198               END IF;
7199               IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2 <> 'NONE'
7200                   AND INSTR(l_row_to_column_query_base,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2) = 0) THEN
7201 
7202                   l_row_to_column_query_base := l_row_to_column_query_base||',MAX('||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2||') '||
7203                                                 l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2;
7204                   l_rtcq_alias_cc_pk_dl_list := l_rtcq_alias_cc_pk_dl_list||',RTCQ.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2;
7205                   l_no_alias_cc_pk_dl_list := l_no_alias_cc_pk_dl_list||','||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2;
7206                   l_rtcq_to_ext_where_base := l_rtcq_to_ext_where_base||
7207                                               ' AND NVL(RTCQ.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2||
7208                                               ',-1)=NVL(EXT.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2||',-1)';
7209               END IF;
7210               IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3 <> 'NONE'
7211                   AND INSTR(l_row_to_column_query_base,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3) = 0) THEN
7212 
7213                   l_row_to_column_query_base := l_row_to_column_query_base||',MAX('||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3||') '||
7214                                                 l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3;
7215                   l_rtcq_alias_cc_pk_dl_list := l_rtcq_alias_cc_pk_dl_list||',RTCQ.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3;
7216                   l_no_alias_cc_pk_dl_list := l_no_alias_cc_pk_dl_list||','||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3;
7217                   l_rtcq_to_ext_where_base := l_rtcq_to_ext_where_base||
7218                                               ' AND NVL(RTCQ.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3||
7219                                               ',-1)=NVL(EXT.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3||',-1)';
7220               END IF;
7221               IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4 <> 'NONE'
7222                   AND INSTR(l_row_to_column_query_base,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4) = 0) THEN
7223 
7224                   l_row_to_column_query_base := l_row_to_column_query_base||',MAX('||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4||') '||
7225                                                 l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4;
7226                   l_rtcq_alias_cc_pk_dl_list := l_rtcq_alias_cc_pk_dl_list||',RTCQ.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4;
7227                   l_no_alias_cc_pk_dl_list := l_no_alias_cc_pk_dl_list||','||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4;
7228                   l_rtcq_to_ext_where_base := l_rtcq_to_ext_where_base||
7229                                               ' AND NVL(RTCQ.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4||
7230                                               ',-1)=NVL(EXT.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4||',-1)';
7231               END IF;
7232               IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5 <> 'NONE'
7233                   AND INSTR(l_row_to_column_query_base,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5) = 0) THEN
7234 
7235                   l_row_to_column_query_base := l_row_to_column_query_base||',MAX('||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5||') '||
7236                                                 l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5;
7237                   l_rtcq_alias_cc_pk_dl_list := l_rtcq_alias_cc_pk_dl_list||',RTCQ.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5;
7238                   l_no_alias_cc_pk_dl_list := l_no_alias_cc_pk_dl_list||','||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5;
7239                   l_rtcq_to_ext_where_base := l_rtcq_to_ext_where_base||
7240                                               ' AND NVL(RTCQ.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5||
7241                                               ',-1)=NVL(EXT.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5||',-1)';
7242               END IF;
7243           END LOOP;
7244         ELSE
7245           IF (l_num_data_level_columns >= 1) THEN
7246             l_row_to_column_query_base := l_row_to_column_query_base||
7247                                           ',MAX('||l_data_level_column_1||') '||
7248                                           l_data_level_column_1;
7249             l_rtcq_alias_cc_pk_dl_list := l_rtcq_alias_cc_pk_dl_list||
7250                                           ',RTCQ.'||l_data_level_column_1;
7251             l_no_alias_cc_pk_dl_list := l_no_alias_cc_pk_dl_list||
7252                                         ','||l_data_level_column_1;
7253             l_rtcq_to_ext_where_base := l_rtcq_to_ext_where_base||
7254                                         ' AND NVL(RTCQ.'||l_data_level_column_1||
7255                                         ',-1)=NVL(EXT.'||l_data_level_column_1||',-1)';
7256           END IF;
7257           IF (l_num_data_level_columns >= 2) THEN
7258             l_row_to_column_query_base := l_row_to_column_query_base||
7259                                           ',MAX('||l_data_level_column_2||') '||
7260                                           l_data_level_column_2;
7261             l_rtcq_alias_cc_pk_dl_list := l_rtcq_alias_cc_pk_dl_list||
7262                                           ',RTCQ.'||l_data_level_column_2;
7263             l_no_alias_cc_pk_dl_list := l_no_alias_cc_pk_dl_list||
7264                                         ','||l_data_level_column_2;
7265             l_rtcq_to_ext_where_base := l_rtcq_to_ext_where_base||
7266                                         ' AND NVL(RTCQ.'||l_data_level_column_2||
7267                                         ',-1)=NVL(EXT.'||l_data_level_column_2||',-1)';
7268           END IF;
7269           IF (l_num_data_level_columns = 3) THEN
7270             l_row_to_column_query_base := l_row_to_column_query_base||
7271                                           ',MAX('||l_data_level_column_3||') '||
7272                                           l_data_level_column_3;
7273             l_rtcq_alias_cc_pk_dl_list := l_rtcq_alias_cc_pk_dl_list||
7274                                           ',RTCQ.'||l_data_level_column_3;
7275             l_no_alias_cc_pk_dl_list := l_no_alias_cc_pk_dl_list||
7276                                         ','||l_data_level_column_3;
7277             l_rtcq_to_ext_where_base := l_rtcq_to_ext_where_base||
7278                                         ' AND NVL(RTCQ.'||l_data_level_column_3||
7279                                         ',-1)=NVL(EXT.'||l_data_level_column_3||',-1)';
7280           END IF;
7281         END IF;
7282       END IF;
7283       ----------------------------------------------------------------------
7284       -- Now we build our DML and query pieces that differ by Attr Group; --
7285       -- we reset all of these variables for each distinct Attr Group     --
7286       ----------------------------------------------------------------------
7287       l_rn_index_for_ag := 0;
7288       l_row_to_column_query_ag_part := NULL;
7289       l_row_to_column_attr_decode := NULL;
7290       l_rtcq_to_ext_where_uks := NULL;
7291       l_rtcq_to_ext_whr_uks_idnt_chk := NULL;
7292       l_rtcq_alias_b_cols_list := NULL;
7293       l_final_b_col_list := NULL;
7294       l_final_tl_col_list := NULL;
7295       l_rtcq_alias_b_cols_list_1 := NULL;
7296       l_rtcq_alias_tl_cols_list := NULL;
7297       l_rtcq_alias_tl_cols_list_1 := NULL;
7298       l_no_alias_b_cols_list := NULL;
7299       l_no_alias_b_values_list := NULL;
7300       l_no_alias_tl_cols_list := NULL;
7301       l_no_alias_tl_cols_sel_list := NULL;
7302       l_db_col_tbl_declare_attrs := NULL;
7303       l_db_col_tbl_collect_b_attrs := NULL;
7304       l_db_col_tbl_collect_tl_attrs := NULL;
7305       l_db_col_tbl_set_b_attrs := NULL;
7306       l_db_col_tbl_set_tl_attrs := NULL;
7307 
7308       FOR d IN l_attr_metadata_table_sr.FIRST .. l_attr_metadata_table_sr.LAST
7309       LOOP
7310 
7311         IF (Attr_Is_In_Data_Set(l_attr_metadata_table_sr(d), l_dist_attrs_in_data_set_table)
7312             OR
7313             l_attr_metadata_table_sr(d).UNIQUE_KEY_FLAG = 'Y' --BugFix: 5361255 : we need to add the uk attr in the where clause weather
7314            ) THEN                                             --                  or not we have data for it in the intf table.
7315 
7316           l_rn_index_for_ag := l_rn_index_for_ag + 1;
7317 
7318           -------------------------------------------------------
7319           -- lets get ready with the correct wierd constant    --
7320           -------------------------------------------------------
7321 
7322           IF (l_attr_metadata_table_sr(d).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
7323            wierd_constant :=  G_NULL_TOKEN_NUM;
7324            wierd_constant_2 := '8.88E125';
7325           ELSIF (   l_attr_metadata_table_sr(d).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE
7326                  OR l_attr_metadata_table_sr(d).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE ) THEN
7327            wierd_constant :=  G_NULL_TOKEN_DATE;
7328            wierd_constant_2 := 'TO_DATE(''2'',''J'')';
7329           ELSE
7330            wierd_constant := G_NULL_TOKEN_STR;
7331            wierd_constant_2 := 'CHR(2)';
7332           END IF;
7333 
7334           -------------------------------------------------------
7335           -- UK clause (note that we only update non-UK Attrs) --
7336           -------------------------------------------------------
7337           IF (l_attr_metadata_table_sr(d).UNIQUE_KEY_FLAG = 'Y') THEN
7338 
7339             IF (l_attr_metadata_table_sr(d).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_TRANS_TEXT_DATA_TYPE) THEN
7340               --GNANDA: While inserting rows in the TL table for a case where we have a TL Uk we insert rows for
7341               --all the rows int he B table for the given pk's and uk's which do not have a corresponding rows in the TL table.
7342 
7343               --While checking for identical rows in the data_set there is a self join in RTCQ (RTCQ and EXT), contrary to the DML's
7344               --where EXT is the actual EXT base table, hence we need to build a seperate where clause for identical check
7345               --i.e. l_rtcq_to_ext_whr_uks_idnt_chk.
7346               l_rtcq_to_ext_where_uks := l_rtcq_to_ext_where_uks||
7347                                          ' AND NVL(RTCQ.'||l_attr_metadata_table_sr(d).DATABASE_COLUMN||','||wierd_constant||')'||
7348                                          '= DECODE (RTCQ.TRANSACTION_TYPE, '''||EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||''' , '||
7349                                          'NVL((SELECT NVL(RTCQ.'||l_attr_metadata_table_sr(d).DATABASE_COLUMN||','||wierd_constant||') FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM '||
7350                                                                                           l_ext_tl_table_name||' WHERE  EXTENSION_ID = EXT.EXTENSION_ID AND ROWNUM = 1 )), '||wierd_constant_2||' ) '||
7351                                          ',NVL((SELECT '||l_attr_metadata_table_sr(d).DATABASE_COLUMN || ' FROM '||l_ext_tl_table_name||' WHERE LANGUAGE = USERENV(''LANG'') AND EXTENSION_ID = EXT.EXTENSION_ID),'||wierd_constant||' ) '||
7352                                          ')';
7353               l_rtcq_to_ext_whr_uks_idnt_chk := l_rtcq_to_ext_whr_uks_idnt_chk||
7354                                          ' AND NVL(RTCQ.'||l_attr_metadata_table_sr(d).DATABASE_COLUMN||','||wierd_constant||')'||
7355                                          '= NVL(EXT.'||l_attr_metadata_table_sr(d).DATABASE_COLUMN||','||wierd_constant||')';
7356             ELSE
7357               l_rtcq_to_ext_where_uks := l_rtcq_to_ext_where_uks||
7358                                          ' AND NVL(RTCQ.'||l_attr_metadata_table_sr(d).DATABASE_COLUMN||','||wierd_constant||')'||
7359                                          '= NVL(EXT.'||l_attr_metadata_table_sr(d).DATABASE_COLUMN||','||wierd_constant||')';
7360 
7361               l_rtcq_to_ext_whr_uks_idnt_chk := l_rtcq_to_ext_whr_uks_idnt_chk||
7362                                          ' AND NVL(RTCQ.'||l_attr_metadata_table_sr(d).DATABASE_COLUMN||','||wierd_constant||')'||
7363                                          '= NVL(EXT.'||l_attr_metadata_table_sr(d).DATABASE_COLUMN||','||wierd_constant||')';
7364             END IF;
7365 
7366           END IF;
7367 
7368           -----------------------------------
7369           -- Data type-independent clauses --
7370           -----------------------------------
7371           l_row_to_column_attr_decode := l_row_to_column_attr_decode||
7372                                          ','''||l_attr_metadata_table_sr(d).ATTR_NAME||
7373                                          ''','||l_rn_index_for_ag;
7374 
7375           -- this one is closed below...
7376           l_row_to_column_query_ag_part := l_row_to_column_query_ag_part||
7377                                            ',MAX(DECODE(RN,'||l_rn_index_for_ag||',';
7378 
7379           ---------------------------------
7380           -- Data type-dependent clauses --
7381           ---------------------------------
7382           IF (l_attr_metadata_table_sr(d).DATA_TYPE_CODE =
7383               EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
7384 
7385             l_row_to_column_query_ag_part := l_row_to_column_query_ag_part||
7386                                              'DECODE(TRANSACTION_TYPE,'''||EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||''',DECODE(ATTR_VALUE_NUM,'||wierd_constant||',NULL,ATTR_VALUE_NUM), ATTR_VALUE_NUM)';
7387             -- ...this closes what started above
7388             l_row_to_column_query_ag_part := l_row_to_column_query_ag_part||')) '||
7389                                              l_attr_metadata_table_sr(d).DATABASE_COLUMN;
7390 
7391             IF (l_attr_metadata_table_sr(d).UNIT_OF_MEASURE_CLASS IS NOT NULL) THEN
7392               l_row_to_column_query_ag_part := l_row_to_column_query_ag_part||
7393                                                ',MAX(DECODE(RN,'||l_rn_index_for_ag||',';
7394               l_row_to_column_query_ag_part := l_row_to_column_query_ag_part||
7395                                                'DECODE(TRANSACTION_TYPE,'''||EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||''',DECODE(ATTR_VALUE_UOM,'||G_NULL_TOKEN_STR||',NULL,ATTR_VALUE_UOM), ATTR_VALUE_UOM)';
7396               l_row_to_column_query_ag_part := l_row_to_column_query_ag_part||')) '||
7397                                              l_attr_metadata_table_sr(d).DATABASE_COLUMN||'_UOM';
7398             END IF;
7399 
7400             l_db_col_tbl_declare_attrs := l_db_col_tbl_declare_attrs||
7401                                           'attr_'||l_rn_index_for_ag||
7402                                           '_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_NUM_TBL;';
7403             l_db_col_tbl_declare_attrs := l_db_col_tbl_declare_attrs||
7404                                           'attr_'||l_rn_index_for_ag||
7405                                           '_uom_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_STR_TBL;';
7406 
7407             -- we only update non-UK Attrs
7408             IF (l_attr_metadata_table_sr(d).UNIQUE_KEY_FLAG IS NULL
7409                 OR l_attr_metadata_table_sr(d).UNIQUE_KEY_FLAG <> 'Y') THEN
7410 
7411                 IF ( l_attr_metadata_table_sr(d).UNIT_OF_MEASURE_CLASS IS NOT NULL) THEN
7412 
7413                     IF (INSTR(l_attr_metadata_table_sr(d).DATABASE_COLUMN, 'N_EXT_ATTR') = 1) THEN
7414                       l_uom_column1 := 'UOM_' || SUBSTR(l_attr_metadata_table_sr(d).DATABASE_COLUMN, 3);
7415                     ELSE
7416                       l_uom_column1 := 'UOM_' || l_attr_metadata_table_sr(d).DATABASE_COLUMN;
7417                     END IF;
7418 
7419                     l_db_col_tbl_set_b_attrs := l_db_col_tbl_set_b_attrs||
7420                                                  ',EXT.'||
7421                                                  l_attr_metadata_table_sr(d).DATABASE_COLUMN||
7422                                                  '=DECODE(attr_'||l_rn_index_for_ag||
7423                                                  '_tbl(i),'||EGO_USER_ATTRS_BULK_PVT.G_NULL_TOKEN_NUM||
7424                                                  ',NULL,NULL,EXT.'||l_attr_metadata_table_sr(d).DATABASE_COLUMN||
7425              ','||G_NULL_TOKEN_NUM_1||',EXT.'||l_attr_metadata_table_sr(d).DATABASE_COLUMN||--bugfix:6526366
7426                                                  ',attr_'||l_rn_index_for_ag||'_tbl(i))'||
7427                                                  ',EXT.'||l_uom_column1 ||
7428                                                  '= DECODE(attr_'||l_rn_index_for_ag||'_uom_tbl(i) ,NULL, '||'NVL (EXT.'||l_uom_column1||' ,'''||l_attr_metadata_table_sr(d).UNIT_OF_MEASURE_BASE||''')  '
7429                                                                                                  ||','||EGO_USER_ATTRS_BULK_PVT.G_NULL_TOKEN_STR||','||'NVL (EXT.'||l_uom_column1||' ,'''||l_attr_metadata_table_sr(d).UNIT_OF_MEASURE_BASE||''')  '
7430                          ||','||EGO_USER_ATTRS_BULK_PVT.G_NULL_TOKEN_STR_1||','||'NVL (EXT.'||l_uom_column1||' ,'''||l_attr_metadata_table_sr(d).UNIT_OF_MEASURE_BASE||''')  '--bugfix:6526366
7431                                                                                                  ||',attr_'||l_rn_index_for_ag||'_uom_tbl(i) )';--BugFux:5509743
7432                 ELSE
7433                     l_db_col_tbl_set_b_attrs := l_db_col_tbl_set_b_attrs||
7434                                                 ',EXT.'||
7435                                                 l_attr_metadata_table_sr(d).DATABASE_COLUMN||
7436                                                 '=DECODE(attr_'||l_rn_index_for_ag||
7437                                                 '_tbl(i),'||EGO_USER_ATTRS_BULK_PVT.G_NULL_TOKEN_NUM||
7438                                                 ',NULL,NULL,EXT.'||l_attr_metadata_table_sr(d).DATABASE_COLUMN||
7439             ','||G_NULL_TOKEN_NUM_1||',EXT.'||l_attr_metadata_table_sr(d).DATABASE_COLUMN||--bugfix:6526366
7440                                                 ',attr_'||l_rn_index_for_ag||'_tbl(i))';
7441 
7442                END IF;
7443             END IF;
7444 
7445           ELSIF (l_attr_metadata_table_sr(d).DATA_TYPE_CODE =
7446                  EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE OR
7447                  l_attr_metadata_table_sr(d).DATA_TYPE_CODE =
7448                  EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE) THEN
7449 
7450             --Bug 4473391(gnanda) : we need to convert the attr_value_date to char in the decode and then convert the final value into
7451             --date otherwise decode would remove the time part from date time attribute.
7452             l_row_to_column_query_ag_part := l_row_to_column_query_ag_part||
7453                              'DECODE(TRANSACTION_TYPE,'''||EGO_USER_ATTRS_DATA_PVT.G_UPDATE_MODE||''',ATTR_VALUE_DATE,TO_DATE(DECODE(ATTR_VALUE_DATE,'||wierd_constant||
7454                              ',NULL,TO_CHAR(ATTR_VALUE_DATE,''DD/MM/YYYY HH24:MI:SS'')),''DD/MM/YYYY HH24:MI:SS'') )';
7455             -- ...this closes what started above
7456             l_row_to_column_query_ag_part := l_row_to_column_query_ag_part||')) '||
7457                                              l_attr_metadata_table_sr(d).DATABASE_COLUMN;
7458 
7459             l_db_col_tbl_declare_attrs := l_db_col_tbl_declare_attrs||
7460                                           'attr_'||l_rn_index_for_ag||
7461                                           '_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_DATE_TBL;';
7462 
7463             -- we only update non-UK Attrs
7464             IF (l_attr_metadata_table_sr(d).UNIQUE_KEY_FLAG IS NULL
7465                 OR l_attr_metadata_table_sr(d).UNIQUE_KEY_FLAG <> 'Y') THEN
7466 
7467               --Bug 4473391(gnanda) : we need to convert the attr_value_date to char in the decode and then convert the final value into
7468               --date otherwise decode would remove the time part from date time attribute.
7469               l_db_col_tbl_set_b_attrs := l_db_col_tbl_set_b_attrs||
7470                                           ',EXT.'||
7471                                           l_attr_metadata_table_sr(d).DATABASE_COLUMN||
7472                                           --FP bug 8270556 with base bug 8238064
7473                                           '=DECODE(attr_'||l_rn_index_for_ag||'_tbl(i) ,NULL, EXT.'||l_attr_metadata_table_sr(d).DATABASE_COLUMN||' , '||
7474                                           'TO_DATE(DECODE(attr_'||l_rn_index_for_ag||
7475                                           '_tbl(i),'||EGO_USER_ATTRS_BULK_PVT.G_NULL_TOKEN_DATE||
7476                                           ',NULL,NULL,EXT.'||l_attr_metadata_table_sr(d).DATABASE_COLUMN||
7477             ','||G_NULL_TOKEN_DATE_1||',EXT.'||l_attr_metadata_table_sr(d).DATABASE_COLUMN||--bugfix:6526366
7478                                           ',TO_CHAR(attr_'||l_rn_index_for_ag||'_tbl(i), ''DD/MM/YYYY HH24:MI:SS'') ),''DD/MM/YYYY HH24:MI:SS''))';
7479 
7480             END IF;
7481           ELSE
7482 
7483             l_row_to_column_query_ag_part := l_row_to_column_query_ag_part||
7484                              'DECODE(TRANSACTION_TYPE,'''||EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||''',DECODE(ATTR_VALUE_STR,'||wierd_constant||',NULL,ATTR_VALUE_STR), ATTR_VALUE_STR)';
7485             -- ...this closes what started above
7486             l_row_to_column_query_ag_part := l_row_to_column_query_ag_part||')) '||
7487                                              l_attr_metadata_table_sr(d).DATABASE_COLUMN;
7488 
7489             l_db_col_tbl_declare_attrs := l_db_col_tbl_declare_attrs||
7490                                           'attr_'||l_rn_index_for_ag||
7491                                           '_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_STR_TBL;';
7492 
7493             -- we only update non-UK Attrs
7494             IF (l_attr_metadata_table_sr(d).UNIQUE_KEY_FLAG IS NULL
7495                 OR l_attr_metadata_table_sr(d).UNIQUE_KEY_FLAG <> 'Y') THEN
7496 
7497               IF (l_attr_metadata_table_sr(d).DATA_TYPE_CODE =
7498                   EGO_EXT_FWK_PUB.G_TRANS_TEXT_DATA_TYPE) THEN
7499 
7500                 l_db_col_tbl_set_tl_attrs := l_db_col_tbl_set_tl_attrs||
7501                                              ',EXT.'||
7502                                              l_attr_metadata_table_sr(d).DATABASE_COLUMN||
7503                                              '=DECODE(attr_'||l_rn_index_for_ag||
7504                                              '_tbl(i),'||EGO_USER_ATTRS_BULK_PVT.G_NULL_TOKEN_STR||
7505                                              ',NULL,NULL,EXT.'||l_attr_metadata_table_sr(d).DATABASE_COLUMN||
7506                                              ',attr_'||l_rn_index_for_ag||'_tbl(i))';
7507 
7508               ELSE
7509 
7510                 l_db_col_tbl_set_b_attrs := l_db_col_tbl_set_b_attrs||
7511                                              ',EXT.'||
7512                                              l_attr_metadata_table_sr(d).DATABASE_COLUMN||
7513                                              '=DECODE(attr_'||l_rn_index_for_ag||
7514                                              '_tbl(i),'||EGO_USER_ATTRS_BULK_PVT.G_NULL_TOKEN_STR||
7515                                              ',NULL,NULL,EXT.'||l_attr_metadata_table_sr(d).DATABASE_COLUMN||
7516                                              ','||G_NULL_TOKEN_STR_1||',EXT.'||l_attr_metadata_table_sr(d).DATABASE_COLUMN||--bugfix:6526366
7517                                              ',attr_'||l_rn_index_for_ag||'_tbl(i))';
7518 
7519               END IF;
7520             END IF;
7521           END IF;
7522 
7523           ----------------------
7524           -- B vs. TL clauses --
7525           ----------------------
7526           IF (l_attr_metadata_table_sr(d).DATA_TYPE_CODE =
7527               EGO_EXT_FWK_PUB.G_TRANS_TEXT_DATA_TYPE) THEN
7528 
7529             l_rtcq_alias_tl_cols_list := l_rtcq_alias_tl_cols_list||',RTCQ.'||
7530                                          l_attr_metadata_table_sr(d).DATABASE_COLUMN;
7531             l_rtcq_alias_tl_cols_list_1 := l_rtcq_alias_tl_cols_list_1||',DECODE(INTF_TL.COLUMN_NAME, '''||l_attr_metadata_table_sr(d).ATTR_NAME||''' ,'
7532                                                                       ||' INTF_TL.COLUMN_VALUE , '||G_NULL_TOKEN_STR||' ) '||l_attr_metadata_table_sr(d).DATABASE_COLUMN;
7533 
7534             l_no_alias_tl_cols_list := l_no_alias_tl_cols_list||','||
7535                                        l_attr_metadata_table_sr(d).DATABASE_COLUMN;
7536             l_no_alias_tl_cols_sel_list := l_no_alias_tl_cols_sel_list||'  , '||' NVL( (SELECT COLUMN_VALUE            '
7537                                                                               ||'         FROM EGO_INTERFACE_TL        '
7538                                                                               ||'        WHERE SET_PROCESS_ID = '||p_data_set_id
7539                                                                               ||'          AND TABLE_NAME = '''||p_interface_table_name||'''  '
7540                                                                               ||'          AND COLUMN_NAME = '''||l_attr_metadata_table_sr(d).ATTR_NAME||''' '
7541                                                                               ||'          AND UNIQUE_ID = RTCQ.ROW_IDENTIFIER '
7542                                                                               ||'          AND LANGUAGE = L.LANGUAGE_CODE) ,'||l_attr_metadata_table_sr(d).DATABASE_COLUMN||') ';
7543 
7544             l_db_col_tbl_collect_tl_attrs := l_db_col_tbl_collect_tl_attrs||
7545                                              ',attr_'||l_rn_index_for_ag||'_tbl';
7546 
7547             l_final_tl_col_list := l_final_tl_col_list ||','||l_attr_metadata_table_sr(d).DATABASE_COLUMN;
7548 
7549           ELSE
7550 
7551             l_final_b_col_list := l_final_b_col_list ||','||l_attr_metadata_table_sr(d).DATABASE_COLUMN;
7552 
7553             l_rtcq_alias_b_cols_list := l_rtcq_alias_b_cols_list||',RTCQ.'||
7554                                         l_attr_metadata_table_sr(d).DATABASE_COLUMN;
7555 
7556             IF (l_attr_metadata_table_sr(d).DATA_TYPE_CODE =
7557                 EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
7558                 l_rtcq_alias_b_cols_list_1 := l_rtcq_alias_b_cols_list_1||', '''||EGO_USER_ATTRS_BULK_PVT.G_NULL_TOKEN_NUM_1||''' '
7559                                                                         ||l_attr_metadata_table_sr(d).DATABASE_COLUMN;
7560             ELSIF (l_attr_metadata_table_sr(d).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE OR
7561                    l_attr_metadata_table_sr(d).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE ) THEN
7562                 l_rtcq_alias_b_cols_list_1 := l_rtcq_alias_b_cols_list_1||', '||EGO_USER_ATTRS_BULK_PVT.G_NULL_TOKEN_DATE_1||' '
7563                                                                         ||l_attr_metadata_table_sr(d).DATABASE_COLUMN;
7564             ELSE
7565                 l_rtcq_alias_b_cols_list_1 := l_rtcq_alias_b_cols_list_1||', '||EGO_USER_ATTRS_BULK_PVT.G_NULL_TOKEN_STR_1||' '
7566                                                                         ||l_attr_metadata_table_sr(d).DATABASE_COLUMN;
7567 
7568             END IF;
7569             l_no_alias_b_cols_list := l_no_alias_b_cols_list||','||
7570                                       l_attr_metadata_table_sr(d).DATABASE_COLUMN;
7571             l_no_alias_b_values_list := l_no_alias_b_values_list||','||
7572                                         l_attr_metadata_table_sr(d).DATABASE_COLUMN;
7573             l_db_col_tbl_collect_b_attrs := l_db_col_tbl_collect_b_attrs||
7574                                             ',attr_'||l_rn_index_for_ag||'_tbl';
7575 
7576             IF (l_attr_metadata_table_sr(d).UNIT_OF_MEASURE_CLASS IS NOT NULL) THEN
7577 
7578               l_final_b_col_list := l_final_b_col_list ||','||l_attr_metadata_table_sr(d).DATABASE_COLUMN||'_UOM ';
7579 
7580               l_rtcq_alias_b_cols_list := l_rtcq_alias_b_cols_list||',RTCQ.'||
7581                                           l_attr_metadata_table_sr(d).DATABASE_COLUMN||'_UOM';
7582               l_rtcq_alias_b_cols_list_1 := l_rtcq_alias_b_cols_list_1||', '||G_NULL_TOKEN_STR_1||
7583                                           l_attr_metadata_table_sr(d).DATABASE_COLUMN||'_UOM';
7584 
7585               l_db_col_tbl_collect_b_attrs := l_db_col_tbl_collect_b_attrs||
7586                                               ',attr_'||l_rn_index_for_ag||'_uom_tbl';
7587               -------------------------------------------------------
7588               -- If it's a UOM Attr, we need to add the UOM column --
7589               -- and its base value into our no-alias lists, too   --
7590               -------------------------------------------------------
7591               IF (INSTR(l_attr_metadata_table_sr(d).DATABASE_COLUMN, 'N_EXT_ATTR') = 1) THEN
7592                 l_uom_column := 'UOM_' || SUBSTR(l_attr_metadata_table_sr(d).DATABASE_COLUMN, 3);
7593               ELSE
7594                 l_uom_column := 'UOM_' || l_attr_metadata_table_sr(d).DATABASE_COLUMN;
7595               END IF;
7596 
7597               l_no_alias_b_cols_list := l_no_alias_b_cols_list||
7598                                         ','||l_uom_column;
7599               l_no_alias_b_values_list := l_no_alias_b_values_list||
7600                                           ', NVL('||l_attr_metadata_table_sr(d).DATABASE_COLUMN||'_UOM ,'''||
7601                                           l_attr_metadata_table_sr(d).UNIT_OF_MEASURE_BASE||
7602                                           ''' )';
7603             END IF;
7604           END IF;
7605         END IF;
7606       END LOOP;
7607 
7608       l_row_to_column_query :=
7609         l_row_to_column_query_base||
7610         l_row_to_column_query_ag_part||
7611         ' FROM (SELECT DECODE(ATTR_INT_NAME'||l_row_to_column_attr_decode||
7612                              ') RN,TRANSACTION_TYPE,ATTR_GROUP_ID'||
7613         l_no_alias_cc_pk_dl_list||
7614         ',ATTR_INT_NAME,NVL(ATTR_VALUE_NUM,'||
7615                             EGO_USER_ATTRS_BULK_PVT.G_NULL_TOKEN_NUM||
7616                             ')ATTR_VALUE_NUM, NVL(ATTR_VALUE_UOM,'||
7617                             EGO_USER_ATTRS_BULK_PVT.G_NULL_TOKEN_STR||
7618                             ') ATTR_VALUE_UOM, NVL(ATTR_VALUE_STR,'||
7619                             EGO_USER_ATTRS_BULK_PVT.G_NULL_TOKEN_STR||
7620                             ')ATTR_VALUE_STR,NVL(ATTR_VALUE_DATE,'||
7621                             EGO_USER_ATTRS_BULK_PVT.G_NULL_TOKEN_DATE||
7622                             ')ATTR_VALUE_DATE,ROW_IDENTIFIER FROM '||
7623         p_interface_table_name||
7624         ' WHERE DATA_SET_ID = :data_set_id AND PROCESS_STATUS = '||G_PS_IN_PROCESS||
7625         ' AND ATTR_GROUP_INT_NAME = :attr_group_name AND ATTR_GROUP_TYPE = '''||p_attr_group_type||''') GROUP BY ROW_IDENTIFIER';
7626 
7627       --------------------------------------------------
7628       -- If p_validate = TRUE do the final validation --
7629       --------------------------------------------------
7630 
7631       -- The validation for erroring dupicate rows has been moved to the DML phase R12C
7632       -- onwards, this was needed by the items team.
7633 
7634       IF (p_do_dml) THEN --*p_validate-IF-4*
7635 
7636         code_debug('          Before validation for more than one logical AG rows int the interface table pointing to same row in the EXT table ' ,2);
7637         -----------------------------------------------------------------
7638         -- The final validation step is to error out all logical Attr  --
7639         -- Group rows in the data set that map to the same destination --
7640         -- table row; we have to do this per AG because of UKs, and we --
7641         -- do it here because we have the RTCQ and its where clause(s) --
7642         -----------------------------------------------------------------
7643 
7644         IF (l_ag_id_col_exists) THEN
7645           code_debug(          'UPDATE '||p_interface_table_name||
7646             ' SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_IDENTICAL_ROWS||
7647           ' WHERE DATA_SET_ID = :data_set_id
7648               AND PROCESS_STATUS <> '||G_PS_GENERIC_ERROR||'
7649               AND PROCESS_STATUS <> '||G_PS_SUCCESS||'
7650               AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
7651               AND ROW_IDENTIFIER IN (SELECT DISTINCT RTCQ.ROW_IDENTIFIER
7652                                        FROM ('||l_row_to_column_query||') RTCQ,
7653                                             ('||l_row_to_column_query||') EXT
7654                                       WHERE RTCQ.ATTR_GROUP_ID = EXT.ATTR_GROUP_ID
7655                                             AND RTCQ.ROW_IDENTIFIER <> EXT.ROW_IDENTIFIER'||
7656                                             l_rtcq_to_ext_where_base||
7657                                             l_rtcq_to_ext_whr_uks_idnt_chk||')'
7658 
7659           );
7660           EXECUTE IMMEDIATE
7661           'UPDATE '||p_interface_table_name||
7662             ' SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_IDENTICAL_ROWS||
7663           ' WHERE DATA_SET_ID = :data_set_id
7664               AND PROCESS_STATUS <> '||G_PS_GENERIC_ERROR||'
7665               AND PROCESS_STATUS <> '||G_PS_SUCCESS||'
7666               AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
7667               AND ROW_IDENTIFIER IN (SELECT DISTINCT RTCQ.ROW_IDENTIFIER
7668                                        FROM ('||l_row_to_column_query||') RTCQ,
7669                                             ('||l_row_to_column_query||') EXT
7670                                       WHERE RTCQ.ATTR_GROUP_ID = EXT.ATTR_GROUP_ID
7671                                             AND RTCQ.ROW_IDENTIFIER <> EXT.ROW_IDENTIFIER'||
7672                                             l_rtcq_to_ext_where_base||
7673                                             l_rtcq_to_ext_whr_uks_idnt_chk||')'
7674           USING p_data_set_id,
7675                 p_data_set_id,
7676                 l_attr_group_metadata_obj.ATTR_GROUP_NAME,
7677                 p_data_set_id,
7678                 l_attr_group_metadata_obj.ATTR_GROUP_NAME,
7679                 l_attr_group_metadata_obj.ATTR_GROUP_ID;
7680         ELSE
7681 
7682           EXECUTE IMMEDIATE
7683           'UPDATE '||p_interface_table_name||
7684             ' SET PROCESS_STATUS = PROCESS_STATUS + '||G_PS_IDENTICAL_ROWS||
7685           ' WHERE DATA_SET_ID = :data_set_id
7686               AND PROCESS_STATUS <> '||G_PS_GENERIC_ERROR||'
7687               AND PROCESS_STATUS <> '||G_PS_SUCCESS||'
7688               AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0
7689               AND ROW_IDENTIFIER IN (SELECT DISTINCT RTCQ.ROW_IDENTIFIER
7690                                        FROM ('||l_row_to_column_query||') RTCQ,
7691                                             ('||l_row_to_column_query||') EXT
7692                                       WHERE RTCQ.ATTR_GROUP_ID = EXT.ATTR_GROUP_ID
7693                                             AND RTCQ.ROW_IDENTIFIER <> EXT.ROW_IDENTIFIER'||
7694                                             l_rtcq_to_ext_where_base||
7695                                             l_rtcq_to_ext_whr_uks_idnt_chk||')'
7696           USING p_data_set_id,
7697                 p_data_set_id,
7698                 l_attr_group_metadata_obj.ATTR_GROUP_NAME,
7699                 p_data_set_id,
7700                 l_attr_group_metadata_obj.ATTR_GROUP_NAME;
7701 
7702         END IF;
7703 
7704         code_debug('          After validation for more than one logical AG rows int the interface table pointing to same row in the EXT table ' ,2);
7705 
7706       END IF; --*p_validate-IF-4*
7707 
7708       IF(p_validate OR p_do_req_def_valiadtion) THEN --*p_validate-IF-4.5* BugFix:5355722
7709         -------------------------------------------------------------------------
7710         -- Update other attributes i ag if atleast one of attribute has failed
7711         -------------------------------------------------------------------------
7712      --considering the G_PS_BAD_ATTR_OR_AG_METADATA is the starting point for the intermittent errors.
7713 
7714       /* Fix for bug#9678667 - Start */
7715       /*
7716         EXECUTE IMMEDIATE
7717             'UPDATE '||p_interface_table_name||' UAI1' ||
7718                 ' SET UAI1.PROCESS_STATUS = UAI1.PROCESS_STATUS + '||G_PS_OTHER_ATTRS_INVALID||
7719                 ' WHERE UAI1.DATA_SET_ID = :data_set_id '||--p_data_set_id||
7720                 ' AND BITAND(PROCESS_STATUS,'||G_PS_OTHER_ATTRS_INVALID||') = 0'||
7721                 ' AND UAI1.ROW_IDENTIFIER  IN'||
7722                 '     (SELECT DISTINCT UAI2.ROW_IDENTIFIER'||
7723                 '        FROM '||p_interface_table_name||' UAI2'||
7724                 '        WHERE UAI2.DATA_SET_ID = :data_set_id '||--p_data_set_id||
7725                 '         AND UAI2.PROCESS_STATUS >= '||G_PS_BAD_ATTR_OR_AG_METADATA ||
7726                 '         AND UAI2.ATTR_GROUP_INT_NAME = UAI1.ATTR_GROUP_INT_NAME)'
7727       USING p_data_set_id, p_data_set_id; */  /*Fix for bug#9678667. Literal to bind*/
7728 
7729         EXECUTE IMMEDIATE
7730               'UPDATE '||p_interface_table_name||' UAI1' ||
7731                   ' SET UAI1.PROCESS_STATUS = UAI1.PROCESS_STATUS + '||G_PS_OTHER_ATTRS_INVALID||
7732                   ' WHERE UAI1.DATA_SET_ID = :data_set_id '||
7733                   ' AND BITAND(PROCESS_STATUS,'||G_PS_OTHER_ATTRS_INVALID||') = 0'||
7734                   ' AND (UAI1.ROW_IDENTIFIER, UAI1.ATTR_GROUP_INT_NAME)  IN '||
7735                 '       (SELECT /*+ UNNEST CARDINALITY(UAI2,10) INDEX(UAI2,EGO_ITM_USR_ATTR_INTRFC_N3) */ '|| /* Bug 9678667 */
7736                   '           UAI2.ROW_IDENTIFIER, UAI2.ATTR_GROUP_INT_NAME '||
7737                   '        FROM '||p_interface_table_name||' UAI2'||
7738                   '        WHERE UAI2.DATA_SET_ID = :data_set_id '||
7739                   '           AND UAI2.PROCESS_STATUS >= '||G_PS_BAD_ATTR_OR_AG_METADATA ||
7740                   '      )'
7741         USING p_data_set_id, p_data_set_id;
7742         /* Fix for bug#9678667 - End */
7743 
7744       END IF; --*p_validate-IF-4.5*
7745 
7746         -------------------------------------------------------
7747         -- Before we do the DML for developer defined attr
7748         -- we gotta make sure that there exists a row in the
7749         -- production table for the processed attributes.
7750         -------------------------------------------------------
7751 
7752         IF(NOT l_ag_id_col_exists AND p_do_dml ) THEN
7753 
7754           l_dynamic_Sql := ' DECLARE ext_id_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_NUM_TBL; '||l_pk_blk_tbl_declare||
7755                            '         created_by_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_NUM_TBL; '||
7756                            ' creation_date_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_DATE_TBL; lu_by_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_NUM_TBL; '||
7757                            ' lu_date_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_DATE_TBL; '||l_dl_blk_tbl_declare||l_class_blk_tbl_declare||
7758                            '
7759                               '||
7760                            ' BEGIN '||
7761                            ' SELECT EGO_EXTFWK_S.NEXTVAL, '||l_concat_pk_cols_sel||
7762                            '        CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE '||
7763                            ' BULK COLLECT INTO ext_id_tbl, '||l_pk_blk_tbl_list||l_dl_blk_tbl_list||','||l_class_blk_tbl_list||
7764                            ', created_by_tbl, creation_date_tbl, lu_by_tbl, lu_date_tbl '||
7765                            ' FROM ( SELECT '|| l_concat_pk_cols_sel ||
7766                            '          MAX(CREATED_BY) CREATED_BY, MAX(CREATION_DATE) CREATION_DATE, MAX(LAST_UPDATED_BY) LAST_UPDATED_BY, MAX(LAST_UPDATE_DATE) LAST_UPDATE_DATE '||
7767                            '                 FROM '||p_interface_table_name||' UAI2           '||
7768                            '                WHERE NOT EXISTS (                                '||
7769                            '                          SELECT NULL                             '||
7770                            '                            FROM '||l_ext_b_table_name||' B       '||
7771                            '                           WHERE 1=1 '||l_concat_pk_cols_UAI2|| ' ) '||
7772                            '                  AND DATA_SET_ID = :data_set_id                  '||
7773                            '                  AND ATTR_GROUP_TYPE = :attr_group_type          '||
7774                            '                  AND PROCESS_STATUS = '||G_PS_IN_PROCESS||'      '||
7775                            '                  AND BITAND(PROCESS_STATUS, '||G_PS_NO_PRIVILEGES||') = 0 '||
7776                            '             GROUP BY ' || l_concat_pk_cols_sel ||' NULL );       '||
7777                            ' IF (ext_id_tbl.COUNT > 0) THEN                                   '||
7778                            '   FORALL i IN ext_id_tbl.FIRST .. ext_id_tbl.LAST                '||
7779                            '   INSERT INTO '||l_ext_b_table_name||
7780                            '              ( EXTENSION_ID, '||l_concat_pk_cols_sel||
7781                            '                CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE) '||
7782                            '              VALUES ( ext_id_tbl(i) , '||l_pk_blk_tbl_list_2||l_dl_blk_tbl_list_2||','||l_class_blk_tbl_list_2||
7783                            '                      ,created_by_tbl(i), creation_date_tbl(i), '||
7784                            '                       lu_by_tbl(i) , lu_date_tbl(i) ); '||
7785                            '   FORALL i IN ext_id_tbl.FIRST .. ext_id_tbl.LAST '||
7786                            '   INSERT INTO '||l_ext_tl_table_name||
7787                            '              ( EXTENSION_ID, '||l_concat_pk_cols_sel||
7788                            '                CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE, '||
7789                            '                SOURCE_LANG,LANGUAGE ) '||
7790                            '              SELECT  ext_id_tbl(i) , '||l_pk_blk_tbl_list_2||l_dl_blk_tbl_list_2||','||l_class_blk_tbl_list_2||
7791                            '                     ,created_by_tbl(i), creation_date_tbl(i), '||
7792                            '                      lu_by_tbl(i) , lu_date_tbl(i),USERENV(''LANG''),LANGUAGE_CODE '||
7793                            '                FROM  FND_LANGUAGES WHERE INSTALLED_FLAG IN (''I'', ''B'')'||
7794                            ' ; '||
7795                            ' END IF;'||
7796                            ' END;';
7797 
7798         code_debug('          DML for inserting dummy rows for dev defined attrs:'||l_dynamic_Sql,3);
7799          EXECUTE IMMEDIATE l_dynamic_sql
7800          USING p_data_Set_id, p_attr_group_type;
7801         code_debug('          After DML for inserting dummy rows for dev defined attrs.'||l_dynamic_Sql,2);
7802          EXECUTE IMMEDIATE
7803           'UPDATE '||p_interface_table_name||' UAI1
7804               SET TRANSACTION_TYPE  =  '''||EGO_USER_ATTRS_DATA_PVT.G_UPDATE_MODE||'''
7805             WHERE UAI1.DATA_SET_ID = :data_set_id
7806               AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||'
7807               AND ATTR_GROUP_INT_NAME = :attr_grp_int_name
7808               AND ATTR_GROUP_TYPE = :attr_group_type  '
7809          USING  p_data_set_id, l_attr_group_metadata_obj.ATTR_GROUP_NAME, p_attr_group_type ;
7810 
7811       END IF;
7812 
7813 /*
7814 DYLAN: TO DO: This will mark every interface table row in the logical
7815 AG rows as an error; our error reporting will have to take care of that.
7816 */
7817 
7818     IF (l_do_dml_for_this_ag AND p_do_dml) THEN -- *p_do_dml-IF-2*
7819 
7820       code_debug('          Before Delete DML ' ,2);
7821 
7822                             --========--
7823                             -- DELETE --
7824                             --========--
7825       ---------------------------------------------------------------
7826       -- For deletion we fetch the extension IDs we'll be deleting --
7827       -- and then delete from both tables using a FORALL statement --
7828       ---------------------------------------------------------------
7829       l_dynamic_sql :=
7830       'DECLARE '||l_db_col_tbl_declare_ext_id||
7831       ' BEGIN SELECT EXT.EXTENSION_ID'||
7832       ' BULK COLLECT INTO '||l_db_col_tbl_collect_ext_id||
7833       ' FROM '||
7834       l_ext_vl_name||
7835       ' EXT, ('||l_row_to_column_query||') RTCQ WHERE 1=1'||
7836       l_rtcq_to_ext_where_base||
7837       l_rtcq_to_ext_where_uks||
7838       ' AND RTCQ.TRANSACTION_TYPE='''||
7839       EGO_USER_ATTRS_DATA_PVT.G_DELETE_MODE||
7840       '''; IF (ext_id_tbl.COUNT > 0) THEN
7841              FORALL i IN ext_id_tbl.FIRST .. ext_id_tbl.LAST
7842                DELETE FROM '||l_ext_b_table_name||' EXT
7843                 WHERE '||l_db_col_tbl_where_ext_id||
7844       '; END IF;';
7845 
7846       IF (l_ext_tl_table_name IS NOT NULL) THEN
7847         l_dynamic_sql := l_dynamic_sql||
7848         'IF (ext_id_tbl.COUNT > 0) THEN
7849            FORALL i IN ext_id_tbl.FIRST .. ext_id_tbl.LAST
7850              DELETE FROM '||l_ext_tl_table_name||' EXT
7851               WHERE '||l_db_col_tbl_where_ext_id||
7852         '; END IF;';
7853       END IF;
7854 
7855       l_dynamic_sql := l_dynamic_sql||'END;';
7856 
7857       code_debug('          Delete DML for AG '||l_attr_group_metadata_obj.ATTR_GROUP_NAME ,3);
7858       code_debug('          :--:'||l_dynamic_sql ,3);
7859 
7860       IF(l_ag_id_col_exists) THEN
7861         EXECUTE IMMEDIATE l_dynamic_sql
7862         USING p_data_set_id,
7863               l_attr_group_metadata_obj.ATTR_GROUP_NAME,
7864               l_attr_group_metadata_obj.ATTR_GROUP_ID;
7865       ELSE
7866         EXECUTE IMMEDIATE l_dynamic_sql
7867         USING p_data_set_id,
7868               l_attr_group_metadata_obj.ATTR_GROUP_NAME;
7869       END IF;
7870 
7871       code_debug('          After Delete DML ' ,2);
7872 
7873                             --========--
7874                             -- UPDATE --
7875                             --========--
7876 
7877 /*
7878 DYLAN: TO DO:
7879 done    1159: Shalu's bug with multiple MR AG rows with same UKs in SYNC mode
7880 done    1159: Look at UPDATE behavior for LANGs
7881 done    1159: Set explicit NULLs
7882 done?    1159: need to ensure that MD code sorts Attrs by sequence
7883 11510: Also look into only firing DMLs for TTs we have in DS
7884 11510: we need to use IF (l_attr_group_metadata_obj.ATTR_GROUP_ID_FLAG ='Y') THEN
7885 11510+: deal with no-CC case (throughout the code)
7886 11510+: get rid of PK, DL data type fetches
7887 */
7888 
7889       code_debug('          Before Update DML ' ,2);
7890             /**bug 14145164 start **/
7891     IF (LENGTH(l_db_col_tbl_set_b_attrs) > 0 OR
7892           LENGTH(l_db_col_tbl_set_tl_attrs) > 0) THEN
7893       BEGIN
7894         cur_l_dynamic_sql_clob := dbms_sql.open_cursor;
7895         l_dynamic_sql_clob :=
7896         'DECLARE '||l_db_col_tbl_declare_ext_id||' lang_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_STR_TBL;'||
7897                     l_db_col_tbl_declare_attrs||
7898         ' BEGIN SELECT LANGUAGE, EXTENSION_ID'||
7899         l_final_b_col_list                    ||
7900         l_final_tl_col_list                   ||
7901         ' BULK COLLECT INTO lang_tbl,'||l_db_col_tbl_collect_ext_id||
7902                                l_db_col_tbl_collect_b_attrs||
7903                                l_db_col_tbl_collect_tl_attrs||
7904         ' FROM '||
7905         '(SELECT USERENV(''LANG'') LANGUAGE, EXT.EXTENSION_ID'||
7906                        l_rtcq_alias_b_cols_list||
7907                        l_rtcq_alias_tl_cols_list||
7908         ' FROM '||
7909         l_ext_vl_name||
7910         ' EXT, ('||l_row_to_column_query||') RTCQ WHERE 1=1'||
7911         l_rtcq_to_ext_where_base||
7912         l_rtcq_to_ext_where_uks||
7913         ' AND RTCQ.TRANSACTION_TYPE='''||
7914         EGO_USER_ATTRS_DATA_PVT.G_UPDATE_MODE||''' )'||
7915         ' UNION '||
7916         '(SELECT INTF_TL.LANGUAGE LANGUAGE,          '||  --Added the following UNIONED Query for R12C.. this wud bring bak
7917         '        INTFRTCQ.EXTENSION_ID EXTENSION_ID  '||  --the results from the intf_tl table as well for updating records
7918         l_rtcq_alias_b_cols_list_1         ||             --in other languages. We assume that the Row_identifier in the itnf table
7919         l_rtcq_alias_tl_cols_list_1        ||             --is unique for ag rows and we can join it with unique_identifier in tl tbl
7920         ' FROM EGO_INTERFACE_TL INTF_TL,  '||             --to get the correct joins.
7921         '      (  SELECT USERENV(''LANG'') LANGUAGE, RTCQ.ROW_IDENTIFIER, EXT.EXTENSION_ID'||
7922                                 l_rtcq_alias_b_cols_list||
7923                                 l_rtcq_alias_tl_cols_list||
7924                  ' FROM '||
7925                  l_ext_vl_name||
7926                  ' EXT, ('||l_row_to_column_query||') RTCQ WHERE 1=1'||
7927                  l_rtcq_to_ext_where_base||
7928                  l_rtcq_to_ext_where_uks||
7929                  ' AND RTCQ.TRANSACTION_TYPE='''||
7930                  EGO_USER_ATTRS_DATA_PVT.G_UPDATE_MODE||''''||
7931         '      ) INTFRTCQ                 '||
7932         'WHERE INTF_TL.SET_PROCESS_ID = :data_set_id '||
7933         '  AND UPPER(INTF_TL.TABLE_NAME) = '''||UPPER(p_interface_table_name)||''' '||
7934         '  AND INTF_TL.UNIQUE_ID =  INTFRTCQ.ROW_IDENTIFIER ) ;';
7935 
7936         code_debug('Before updating B table Length of l_dynamic_sql_clob :'||dbms_lob.getlength(l_dynamic_sql_clob),3);
7937         ------------------------------------------------
7938         -- If we need to update the B table, we do so --
7939         ------------------------------------------------
7940         IF (LENGTH(l_db_col_tbl_set_b_attrs) > 1) THEN
7941           l_dynamic_sql_clob := l_dynamic_sql_clob||                -- Bug 13923293
7942           'IF (ext_id_tbl.COUNT > 0) THEN
7943              FORALL i IN ext_id_tbl.FIRST .. ext_id_tbl.LAST
7944                UPDATE '||l_ext_b_table_name||' EXT
7945                   SET '||SUBSTR(l_db_col_tbl_set_b_attrs, 2)||
7946                       ',LAST_UPDATED_BY=:current_user_id,
7947                        LAST_UPDATE_DATE=:current_date,
7948                        LAST_UPDATE_LOGIN=:current_login_id,
7949                        REQUEST_ID = :request_id
7950                 WHERE '||l_db_col_tbl_where_ext_id||';
7951            END IF;';
7952         END IF;
7953         code_debug('Before updating TL table Length of l_dynamic_sql_clob: '||dbms_lob.getlength(l_dynamic_sql_clob),3);
7954         -------------------------------------------------
7955         -- If we need to update the TL table, we do so --
7956         -------------------------------------------------
7957         IF (l_ext_tl_table_name IS NOT NULL AND
7958             LENGTH(l_db_col_tbl_set_tl_attrs) > 1) THEN
7959 
7960           l_dynamic_sql_clob := l_dynamic_sql_clob||            -- Bug 13923293
7961           'IF (ext_id_tbl.COUNT > 0) THEN
7962              FORALL i IN ext_id_tbl.FIRST .. ext_id_tbl.LAST
7963                UPDATE '||l_ext_tl_table_name||' EXT
7964                   SET '||SUBSTR(l_db_col_tbl_set_tl_attrs, 2)||
7965                       ',LAST_UPDATED_BY=:current_user_id,
7966                        LAST_UPDATE_DATE=:current_date,
7967                        LAST_UPDATE_LOGIN=:current_login_id,
7968                        SOURCE_LANG=lang_tbl(i)
7969                 WHERE '||l_db_col_tbl_where_ext_id||
7970                 ' AND (LANGUAGE=lang_tbl(i) OR SOURCE_LANG=lang_tbl(i));
7971            END IF;';
7972           --Added for bug 4473128(gnanda): In case there are no B table columns to be updated but we have some TL
7973           --                               table columns being updated the request id should still be updated in the
7974           --                               B table so that events can be raised properly, if required.
7975           IF (LENGTH(l_db_col_tbl_set_b_attrs) <= 1 OR l_db_col_tbl_set_b_attrs IS NULL) THEN
7976             l_dynamic_sql_clob := l_dynamic_sql_clob||          -- Bug 13923293
7977             ' IF (ext_id_tbl.COUNT > 0) THEN
7978               FORALL i IN ext_id_tbl.FIRST .. ext_id_tbl.LAST
7979                 UPDATE '||l_ext_b_table_name||' EXT '||
7980                    ' SET LAST_UPDATED_BY=:current_user_id,
7981                          LAST_UPDATE_DATE=:current_date,
7982                          LAST_UPDATE_LOGIN=:current_login_id,
7983                          REQUEST_ID = :request_id
7984                    WHERE '||l_db_col_tbl_where_ext_id||';
7985                END IF; ';
7986           END IF;
7987 
7988         END IF;
7989 
7990         l_dynamic_sql_clob := l_dynamic_sql_clob||'END;';
7991         -----------------------------------------------
7992         -- Even though there are either 7 or 11 bind --
7993         -- variables in this statement, we only need --
7994         -- to bind the 5 distinct variables, because --
7995         -- dynamic PL/SQL blocks bind by name        --
7996         -----------------------------------------------
7997 
7998         code_debug('          Update DML for AG '||l_attr_group_metadata_obj.ATTR_GROUP_NAME ,3);
7999         code_debug('          :--: final length : '||dbms_lob.getlength(l_dynamic_sql_clob) ,3);
8000 
8001         DBMS_SQL.PARSE(cur_l_dynamic_sql_clob, l_dynamic_sql_clob,
8002                    DBMS_SQL.NATIVE);
8003 
8004         IF(l_ag_id_col_exists) THEN
8005           DBMS_SQL.BIND_VARIABLE(cur_l_dynamic_sql_clob, ':data_set_id', p_data_set_id);
8006           DBMS_SQL.BIND_VARIABLE(cur_l_dynamic_sql_clob, ':attr_group_name', l_attr_group_metadata_obj.ATTR_GROUP_NAME);
8007           DBMS_SQL.BIND_VARIABLE(cur_l_dynamic_sql_clob, ':curr_attr_group_id', l_attr_group_metadata_obj.ATTR_GROUP_ID);
8008           DBMS_SQL.BIND_VARIABLE(cur_l_dynamic_sql_clob, ':current_user_id', G_CURRENT_USER_ID);
8009           DBMS_SQL.BIND_VARIABLE(cur_l_dynamic_sql_clob, ':current_date', SYSDATE);
8010           DBMS_SQL.BIND_VARIABLE(cur_l_dynamic_sql_clob, ':current_login_id', G_CURRENT_LOGIN_ID);
8011           DBMS_SQL.BIND_VARIABLE(cur_l_dynamic_sql_clob, ':request_id', G_REQUEST_ID);
8012           l_dummy_ret_val := DBMS_SQL.EXECUTE(cur_l_dynamic_sql_clob);
8013 
8014         ELSE
8015           DBMS_SQL.BIND_VARIABLE(cur_l_dynamic_sql_clob, ':data_set_id', p_data_set_id);
8016           DBMS_SQL.BIND_VARIABLE(cur_l_dynamic_sql_clob, ':curr_attr_group_id', l_attr_group_metadata_obj.ATTR_GROUP_ID);
8017           DBMS_SQL.BIND_VARIABLE(cur_l_dynamic_sql_clob, ':current_user_id', G_CURRENT_USER_ID);
8018           DBMS_SQL.BIND_VARIABLE(cur_l_dynamic_sql_clob, ':current_date', SYSDATE);
8019           DBMS_SQL.BIND_VARIABLE(cur_l_dynamic_sql_clob, ':current_login_id', G_CURRENT_LOGIN_ID);
8020           DBMS_SQL.BIND_VARIABLE(cur_l_dynamic_sql_clob, ':request_id', G_REQUEST_ID);
8021           l_dummy_ret_val :=  DBMS_SQL.EXECUTE(cur_l_dynamic_sql_clob);
8022 
8023         END IF;
8024 
8025         code_debug('          Don with executing the update DML ' ,2);
8026         DBMS_SQL.CLOSE_CURSOR(cur_l_dynamic_sql_clob);
8027       EXCEPTION
8028       WHEN OTHERS THEN
8029       DBMS_SQL.CLOSE_CURSOR(cur_l_dynamic_sql_clob);
8030       RAISE;
8031       END;
8032 
8033     END IF;
8034     /**bug 14145164 end **/
8035 
8036       /** start comment for bug 14145164
8037 
8038       IF (LENGTH(l_db_col_tbl_set_b_attrs) > 0 OR
8039           LENGTH(l_db_col_tbl_set_tl_attrs) > 0) THEN
8040         l_dynamic_sql :=
8041         'DECLARE '||l_db_col_tbl_declare_ext_id||' lang_tbl EGO_USER_ATTRS_BULK_PVT.EGO_USER_ATTRS_BULK_STR_TBL;'||
8042                     l_db_col_tbl_declare_attrs||
8043         ' BEGIN SELECT LANGUAGE, EXTENSION_ID'||
8044         l_final_b_col_list                    ||
8045         l_final_tl_col_list                   ||
8046         ' BULK COLLECT INTO lang_tbl,'||l_db_col_tbl_collect_ext_id||
8047                                l_db_col_tbl_collect_b_attrs||
8048                                l_db_col_tbl_collect_tl_attrs||
8049         ' FROM '||
8050         '(SELECT USERENV(''LANG'') LANGUAGE, EXT.EXTENSION_ID'||
8051                        l_rtcq_alias_b_cols_list||
8052                        l_rtcq_alias_tl_cols_list||
8053         ' FROM '||
8054         l_ext_vl_name||
8055         ' EXT, ('||l_row_to_column_query||') RTCQ WHERE 1=1'||
8056         l_rtcq_to_ext_where_base||
8057         l_rtcq_to_ext_where_uks||
8058         ' AND RTCQ.TRANSACTION_TYPE='''||
8059         EGO_USER_ATTRS_DATA_PVT.G_UPDATE_MODE||''' )'||
8060         ' UNION '||
8061         '(SELECT INTF_TL.LANGUAGE LANGUAGE,          '||  --Added the following UNIONED Query for R12C.. this wud bring bak
8062         '        INTFRTCQ.EXTENSION_ID EXTENSION_ID  '||  --the results from the intf_tl table as well for updating records
8063         l_rtcq_alias_b_cols_list_1         ||             --in other languages. We assume that the Row_identifier in the itnf table
8064         l_rtcq_alias_tl_cols_list_1        ||             --is unique for ag rows and we can join it with unique_identifier in tl tbl
8065         ' FROM EGO_INTERFACE_TL INTF_TL,  '||             --to get the correct joins.
8066         '      (  SELECT USERENV(''LANG'') LANGUAGE, RTCQ.ROW_IDENTIFIER, EXT.EXTENSION_ID'||
8067                                 l_rtcq_alias_b_cols_list||
8068                                 l_rtcq_alias_tl_cols_list||
8069                  ' FROM '||
8070                  l_ext_vl_name||
8071                  ' EXT, ('||l_row_to_column_query||') RTCQ WHERE 1=1'||
8072                  l_rtcq_to_ext_where_base||
8073                  l_rtcq_to_ext_where_uks||
8074                  ' AND RTCQ.TRANSACTION_TYPE='''||
8075                  EGO_USER_ATTRS_DATA_PVT.G_UPDATE_MODE||''''||
8076         '      ) INTFRTCQ                 '||
8077         'WHERE INTF_TL.SET_PROCESS_ID = :data_set_id '||
8078         '  AND UPPER(INTF_TL.TABLE_NAME) = '''||UPPER(p_interface_table_name)||''' '||
8079         '  AND INTF_TL.UNIQUE_ID =  INTFRTCQ.ROW_IDENTIFIER ) ;';
8080 
8081         l_dynamic_sql_2 := '';  --clear l_dynamic_sql_2 since we are in a loop, for bug 14335411
8082         ------------------------------------------------
8083         -- If we need to update the B table, we do so --
8084         ------------------------------------------------
8085         IF (LENGTH(l_db_col_tbl_set_b_attrs) > 1) THEN
8086           l_dynamic_sql_2 := l_dynamic_sql_2||                -- Bug 13923293
8087           'IF (ext_id_tbl.COUNT > 0) THEN
8088              FORALL i IN ext_id_tbl.FIRST .. ext_id_tbl.LAST
8089                UPDATE '||l_ext_b_table_name||' EXT
8090                   SET '||SUBSTR(l_db_col_tbl_set_b_attrs, 2)||
8091                       ',LAST_UPDATED_BY=:current_user_id,
8092                        LAST_UPDATE_DATE=:current_date,
8093                        LAST_UPDATE_LOGIN=:current_login_id,
8094                        REQUEST_ID = :request_id
8095                 WHERE '||l_db_col_tbl_where_ext_id||';
8096            END IF;';
8097         END IF;
8098         -------------------------------------------------
8099         -- If we need to update the TL table, we do so --
8100         -------------------------------------------------
8101         IF (l_ext_tl_table_name IS NOT NULL AND
8102             LENGTH(l_db_col_tbl_set_tl_attrs) > 1) THEN
8103 
8104           l_dynamic_sql_2 := l_dynamic_sql_2||            -- Bug 13923293
8105           'IF (ext_id_tbl.COUNT > 0) THEN
8106              FORALL i IN ext_id_tbl.FIRST .. ext_id_tbl.LAST
8107                UPDATE '||l_ext_tl_table_name||' EXT
8108                   SET '||SUBSTR(l_db_col_tbl_set_tl_attrs, 2)||
8109                       ',LAST_UPDATED_BY=:current_user_id,
8110                        LAST_UPDATE_DATE=:current_date,
8111                        LAST_UPDATE_LOGIN=:current_login_id,
8112                        SOURCE_LANG=lang_tbl(i)
8113                 WHERE '||l_db_col_tbl_where_ext_id||
8114                 ' AND (LANGUAGE=lang_tbl(i) OR SOURCE_LANG=lang_tbl(i));
8115            END IF;';
8116 
8117           --Added for bug 4473128(gnanda): In case there are no B table columns to be updated but we have some TL
8118           --                               table columns being updated the request id should still be updated in the
8119           --                               B table so that events can be raised properly, if required.
8120           IF (LENGTH(l_db_col_tbl_set_b_attrs) <= 1 OR l_db_col_tbl_set_b_attrs IS NULL) THEN
8121             l_dynamic_sql_2 := l_dynamic_sql_2||          -- Bug 13923293
8122             ' IF (ext_id_tbl.COUNT > 0) THEN
8123               FORALL i IN ext_id_tbl.FIRST .. ext_id_tbl.LAST
8124                 UPDATE '||l_ext_b_table_name||' EXT '||
8125                    ' SET LAST_UPDATED_BY=:current_user_id,
8126                          LAST_UPDATE_DATE=:current_date,
8127                          LAST_UPDATE_LOGIN=:current_login_id,
8128                          REQUEST_ID = :request_id
8129                    WHERE '||l_db_col_tbl_where_ext_id||';
8130                END IF; ';
8131           END IF;
8132 
8133         END IF;
8134 
8135         l_dynamic_sql_2 := l_dynamic_sql_2||'END;';
8136         -----------------------------------------------
8137         -- Even though there are either 7 or 11 bind --
8138         -- variables in this statement, we only need --
8139         -- to bind the 5 distinct variables, because --
8140         -- dynamic PL/SQL blocks bind by name        --
8141         -----------------------------------------------
8142 
8143         code_debug('          Update DML for AG '||l_attr_group_metadata_obj.ATTR_GROUP_NAME ,3);
8144         code_debug('          :--:'||l_dynamic_sql||l_dynamic_sql_2 ,3);
8145 
8146 
8147   IF(l_ag_id_col_exists) THEN
8148           EXECUTE IMMEDIATE l_dynamic_sql||l_dynamic_sql_2  -- Bug 13923293
8149           USING p_data_set_id,
8150                 l_attr_group_metadata_obj.ATTR_GROUP_NAME,
8151                 l_attr_group_metadata_obj.ATTR_GROUP_ID,
8152                 G_CURRENT_USER_ID,
8153                 SYSDATE,
8154                 G_CURRENT_LOGIN_ID,
8155                 G_REQUEST_ID;
8156         ELSE
8157 
8158            EXECUTE IMMEDIATE l_dynamic_sql||l_dynamic_sql_2  -- Bug 13923293
8159            USING p_data_set_id,
8160                  l_attr_group_metadata_obj.ATTR_GROUP_NAME,
8161                  G_CURRENT_USER_ID,
8162                  SYSDATE,
8163                  G_CURRENT_LOGIN_ID,
8164                  G_REQUEST_ID;
8165         END IF;
8166 
8167         code_debug('          Don with executing the update DML ' ,2);
8168 
8169       END IF;
8170       /** end comment for bug 14145164 **/
8171 
8172 
8173                             --========--
8174                             -- INSERT --
8175                             --========--
8176 
8177       --------------------------------------------
8178       -- First we insert rows into the B table  --
8179       -- (even if there are no non-trans Attrs) --
8180       --------------------------------------------
8181 /*
8182 GNANDA:
8183 Note:Since we had to support TL UK's and we had to insert the row_identifier*-2
8184      temporarily in the REQUEST_ID column so that while inserting rows in the
8185      TL table we can identify the exact extension_id's inserted for the rows in
8186      the B table. We would set the request_id back to the correct value after
8187      we are done with the TL table inserions.
8188      Without this it was failing if the AG had TL UK and more than
8189      one rows were being inserted for the MR AG.
8190 */
8191 
8192       -- Bug 10097738 : Start
8193       IF (l_attr_group_metadata_obj.MULTI_ROW_CODE = 'Y') THEN
8194         -- The below function returns 'T' or 'F'
8195         l_column_exists:=EGO_USER_ATTRS_DATA_PVT.HAS_COLUMN_IN_TABLE_VIEW(l_ext_b_table_name,'UNIQUE_VALUE');
8196       END IF;
8197 
8198       IF (l_attr_group_metadata_obj.MULTI_ROW_CODE = 'Y' AND FND_API.TO_BOOLEAN(l_column_exists)) THEN
8199         l_unique_value_col := ', UNIQUE_VALUE ';
8200         l_unique_value := ', EGO_EXTFWK_S.CURRVAL '; -- inserting the ext id value in UNIQUE_VALUE column for MR UDAs
8201       ELSE
8202         l_unique_value_col := '';
8203         l_unique_value := '';
8204       END IF;
8205       -- Bug 10097738 : End
8206 
8207       l_dynamic_sql :=
8208       'INSERT INTO '||l_ext_b_table_name||
8209       '(REQUEST_ID, EXTENSION_ID'||
8210        l_no_alias_cc_pk_dl_list||
8211        l_unique_value_col||' ';   /* Bug 10097738 */
8212 
8213       IF (l_ag_id_col_exists) THEN
8214         l_dynamic_sql := l_dynamic_sql|| ',ATTR_GROUP_ID, ';
8215       ELSE
8216         l_dynamic_sql := l_dynamic_sql|| ' , ';
8217       END IF;
8218 
8219       l_dynamic_sql := l_dynamic_sql|| ' CREATED_BY,
8220        CREATION_DATE,
8221        LAST_UPDATED_BY,
8222        LAST_UPDATE_DATE,
8223        LAST_UPDATE_LOGIN'||
8224        l_no_alias_b_cols_list||
8225       ') SELECT RTCQ.ROW_IDENTIFIER*-2 , EGO_EXTFWK_S.NEXTVAL'||
8226       l_rtcq_alias_cc_pk_dl_list||
8227       l_unique_value||' ';   /* Bug 10097738 */
8228       IF (l_ag_id_col_exists) THEN
8229         l_dynamic_sql := l_dynamic_sql||',:curr_attr_group_id, ';
8230       ELSE
8231         l_dynamic_sql := l_dynamic_sql||', ';
8232       END IF;
8233       l_dynamic_sql := l_dynamic_sql|| ' :current_user_id,
8234       :current_date,
8235       :current_user_id,
8236       :current_date,
8237       :current_login_id'||
8238       l_no_alias_b_values_list||
8239       ' FROM ('||l_row_to_column_query||') RTCQ
8240       WHERE RTCQ.TRANSACTION_TYPE = '''||
8241       EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||'''';
8242 
8243       code_debug('          Before Inserting into B table ' ,2);
8244       code_debug('          B table Insert DML for AG '||l_attr_group_metadata_obj.ATTR_GROUP_NAME ,3);
8245       code_debug('          :--:'||l_dynamic_sql ,3);
8246 
8247       IF(l_ag_id_col_exists) THEN
8248 
8249 
8250         EXECUTE IMMEDIATE l_dynamic_sql
8251         USING l_attr_group_metadata_obj.ATTR_GROUP_ID,
8252               G_CURRENT_USER_ID,
8253               SYSDATE,
8254               G_CURRENT_USER_ID,
8255               SYSDATE,
8256               G_CURRENT_LOGIN_ID,
8257               p_data_set_id,
8258               l_attr_group_metadata_obj.ATTR_GROUP_NAME;
8259       ELSE
8260 
8261 
8262         EXECUTE IMMEDIATE l_dynamic_sql
8263         USING G_CURRENT_USER_ID,
8264               SYSDATE,
8265               G_CURRENT_USER_ID,
8266               SYSDATE,
8267               G_CURRENT_LOGIN_ID,
8268               p_data_set_id,
8269               l_attr_group_metadata_obj.ATTR_GROUP_NAME;
8270       END IF;
8271 
8272       code_debug('          After Inserting into B table ' ,2);
8273 
8274       -----------------------------------------------
8275       -- Next we insert rows into the TL table, if --
8276       -- there is one (again, we insert even if    --
8277       -- there are no trans Attrs, for VL joining) --
8278       -----------------------------------------------
8279 
8280       code_debug('          Before Inserting into TL table ' ,2);
8281 
8282       IF (l_ext_tl_table_name IS NOT NULL) THEN
8283 
8284         l_dynamic_sql :=
8285         'INSERT INTO '||l_ext_tl_table_name||
8286         '(EXTENSION_ID'||
8287         l_no_alias_cc_pk_dl_list||' ';
8288 
8289         IF (l_ag_id_col_exists) THEN
8290           l_dynamic_sql := l_dynamic_sql|| ',ATTR_GROUP_ID, ';
8291         ELSE
8292           l_dynamic_sql := l_dynamic_sql|| ' , ';
8293         END IF;
8294 
8295         l_dynamic_sql := l_dynamic_sql|| ' CREATED_BY,
8296          CREATION_DATE,
8297          LAST_UPDATED_BY,
8298          LAST_UPDATE_DATE,
8299          LAST_UPDATE_LOGIN,
8300          SOURCE_LANG,
8301          LANGUAGE'||
8302          l_no_alias_tl_cols_list||
8303         ') SELECT EXT.EXTENSION_ID'||
8304         l_rtcq_alias_cc_pk_dl_list||' ';
8305 
8306         IF (l_ag_id_col_exists) THEN
8307           l_dynamic_sql := l_dynamic_sql||',EXT.ATTR_GROUP_ID, ';
8308         ELSE
8309           l_dynamic_sql := l_dynamic_sql||', ';
8310         END IF;
8311 
8312         l_dynamic_sql := l_dynamic_sql||'EXT.CREATED_BY,
8313         EXT.CREATION_DATE,
8314         EXT.LAST_UPDATED_BY,
8315         EXT.LAST_UPDATE_DATE,
8316         EXT.LAST_UPDATE_LOGIN,
8317         USERENV(''LANG''),
8318         L.LANGUAGE_CODE'||
8319         l_no_alias_tl_cols_sel_list||
8320         ' FROM '||l_ext_b_table_name||
8321         ' EXT, FND_LANGUAGES L, ('||l_row_to_column_query||') RTCQ
8322         WHERE
8323         (RTCQ.ROW_IDENTIFIER*-2) = EXT.REQUEST_ID
8324         AND L.INSTALLED_FLAG IN (''I'', ''B'')'||
8325         l_rtcq_to_ext_where_base||
8326         l_rtcq_to_ext_where_uks||
8327         ' AND RTCQ.TRANSACTION_TYPE='''||
8328         EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||'''';
8329 
8330         code_debug('          TL table Insert DML for AG '||l_attr_group_metadata_obj.ATTR_GROUP_NAME ,3);
8331         code_debug('          :--:'||l_dynamic_sql ,3);
8332 
8333         IF(l_ag_id_col_exists) THEN
8334           EXECUTE IMMEDIATE l_dynamic_sql
8335           USING p_data_set_id,
8336                 l_attr_group_metadata_obj.ATTR_GROUP_NAME,
8337                 l_attr_group_metadata_obj.ATTR_GROUP_ID;
8338         ELSE
8339           EXECUTE IMMEDIATE l_dynamic_sql
8340           USING p_data_set_id,
8341                 l_attr_group_metadata_obj.ATTR_GROUP_NAME;
8342         END IF;
8343 
8344       code_debug('          After Inserting into TL table ' ,2);
8345 
8346 /*
8347 GNANDA:
8348 Note:As mentioned above we had populated the request_id column with the row_identifier*-2
8349      in the INTF table we need to set it back to the correqt value now, since we are done
8350      with inserting rows in the TL table.
8351 */
8352       IF (l_ag_id_col_exists) THEN
8353        -- Bug 9851212 : Removed product specific table name.
8354         l_dynamic_sql := ' UPDATE '||l_ext_b_table_name||'
8355                            SET REQUEST_ID = :REQUEST_ID
8356                            WHERE ATTR_GROUP_ID = :atr_grp_id
8357                            AND (REQUEST_ID'||l_concat_pk_cols||') IN
8358                                     ( SELECT /*+ cardinality(EGO_ITM_USR_ATTR_INTRFC,10) */
8359                                       (ROW_IDENTIFIER * -2)'||l_concat_pk_cols||'
8360                                       FROM '||p_interface_table_name||'
8361                                       WHERE DATA_SET_ID = :DATA_SET_ID
8362                                             AND ATTR_GROUP_ID = :ATTR_GROUP_ID
8363                                             AND PROCESS_STATUS = '||G_PS_IN_PROCESS||' )';
8364                         -- '   AND REQUEST_ID <-1 ';
8365         EXECUTE IMMEDIATE l_dynamic_sql
8366         USING G_REQUEST_ID,l_attr_group_metadata_obj.ATTR_GROUP_ID, p_data_set_id, l_attr_group_metadata_obj.ATTR_GROUP_ID ; /* Fix for bug#9678667 */
8367       END IF;
8368 
8369       END IF;
8370 
8371     END IF; --ending l_do_dml_for_this_ag and p_do_dml check (*p_do_dml-IF-2*)
8372 
8373       -- Following If condition is fix for bug 5842178
8374       IF (l_is_post_event_enabled_flag IS NULL OR l_is_post_event_enabled_flag <> 'Y') THEN
8375           l_dummy := 0;
8376 
8377     SELECT COUNT(*)
8378       INTO l_dummy
8379       FROM EGO_ATTR_GROUP_DL
8380            WHERE ATTR_GROUP_ID = l_attr_group_metadata_obj.ATTR_GROUP_ID
8381        AND RAISE_POST_EVENT = 'Y';
8382 
8383           IF(l_dummy > 0)THEN
8384             l_is_post_event_enabled_flag := 'Y';
8385     END IF;
8386       END IF;
8387       -- End of fix for bug 5842178.
8388       ----------------------------------------------------
8389       -- reporting of errors for all failed rows belonging
8390       -- to this attr grp.
8391       ----------------------------------------------------
8392      -- Bug 9705869 : Added p_do_dml, so that the errors are logged even while doing DML (i.e to log errors for duplicate records etc..)
8393      IF (p_validate OR p_do_req_def_valiadtion OR p_do_dml) THEN --*p-validate-IF-5* BugFix:5355722
8394 
8395         code_debug('          In validate mode: Before logging errors ' ,2);
8396 
8397         Log_Errors_Now(
8398           p_entity_id               => p_entity_id
8399          ,p_entity_index            => p_entity_index
8400          ,p_entity_code             => p_entity_code
8401          ,p_object_name             => p_object_name
8402          ,p_pk1_column_name         => l_pk1_column_name
8403          ,p_pk2_column_name         => l_pk2_column_name
8404          ,p_pk3_column_name         => l_pk3_column_name
8405          ,p_pk4_column_name         => l_pk4_column_name
8406          ,p_pk5_column_name         => l_pk5_column_name
8407          ,p_classification_col_name => l_class_code_column_name
8408          ,p_interface_table_name    => p_interface_table_name
8409          ,p_err_col_static_sql      => l_err_col_static_sql
8410          ,p_err_where_static_sql    => l_err_where_static_sql
8411          ,p_attr_grp_meta_obj       => l_attr_group_metadata_obj
8412          ,p_data_set_id             => p_data_set_id /*Fix for bug#9678667. Literal to bind*/
8413         );
8414 
8415         code_debug('          After logging errors ' ,2);
8416 
8417      END IF; -- *p-validate-IF-5* ending p_validate IF
8418 
8419 /*Code changes for bug 8485287*/
8420 /* Added code to raise postAttributeChange BE for call of public API to create Item. */
8421       ----------------------------------------------------
8422       -- AFTER THE DML, NOW WE WILL RAISE THE POST EVENT
8423       -- (if we need to ...) gnanda
8424       ----------------------------------------------------
8425 
8426   IF (p_do_dml) THEN --search for *p_do_dml-IF-YJain* to locate the END
8427            BEGIN
8428              SELECT BUSINESS_EVENT_NAME
8429                  INTO l_new_post_event_name
8430              FROM EGO_FND_DESC_FLEXS_EXT
8431              WHERE APPLICATION_ID = p_application_id
8432                 AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type;
8433            EXCEPTION
8434              WHEN NO_DATA_FOUND THEN
8435                 l_new_post_event_name := NULL;
8436            END;
8437 
8438         -- Bug 10090254 Changes : Start
8439         /*
8440         SELECT BUSINESS_EVENT_FLAG
8441          INTO l_new_post_event_enabled_flag
8442         FROM EGO_FND_DSC_FLX_CTX_EXT
8443         WHERE ATTR_GROUP_ID = l_attr_group_metadata_obj.ATTR_GROUP_ID;
8444         */
8445 
8446         SELECT COUNT(*)
8447         INTO  l_dummy
8448         FROM  EGO_ATTR_GROUP_DL
8449         WHERE ATTR_GROUP_ID = l_attr_group_metadata_obj.ATTR_GROUP_ID
8450           AND RAISE_POST_EVENT = 'Y';
8451 
8452         IF (l_dummy > 0) THEN
8453           l_new_post_event_enabled_flag := 'Y';
8454         ELSE
8455           l_new_post_event_enabled_flag := 'N';
8456         END IF;
8457 
8458         code_debug('inside raising events   l_new_post_event_enabled_flag - '||l_new_post_event_enabled_flag);
8459         -- Bug 10090254 Changes : End
8460 
8461   IF (l_new_post_event_name IS NOT NULL AND l_new_post_event_enabled_flag = 'Y' AND G_REQUEST_ID =-1) THEN
8462       -- IF (l_event_name IS NOT NULL AND l_is_event_enabled_flag = 'Y') THEN
8463 
8464          --------------------------------------------------------------------
8465          -- HERE WE RAISE POST EVENT FOR ALL THE AG ROWS *NOT* BEING DELETED
8466          --------------------------------------------------------------------
8467          OPEN l_dynamic_cursor FOR l_dynamic_sql_1
8468          USING p_data_set_id, l_attr_group_metadata_obj.ATTR_GROUP_NAME;
8469          LOOP
8470            FETCH l_dynamic_cursor INTO l_ag_deflatened_row;
8471            EXIT WHEN l_dynamic_cursor%NOTFOUND;
8472 
8473      l_event_key := SUBSTRB(l_new_post_event_name, 1, 225) || '-' || TO_CHAR(SYSDATE, 'J.SSSSS');
8474            EGO_WF_WRAPPER_PVT.Raise_WF_Business_Event(
8475             p_event_name                    => l_new_post_event_name
8476            ,p_event_key                     => l_event_key
8477            ,p_dml_type                      => l_ag_deflatened_row.TRANSACTION_TYPE
8478            ,p_attr_group_name               => l_ag_deflatened_row.ATTR_GROUP_INT_NAME
8479            ,p_extension_id                  => l_ag_deflatened_row.EXTENSION_ID
8480            ,p_primary_key_1_col_name        => l_pk1_column_name
8481            ,p_primary_key_1_value           => l_ag_deflatened_row.PK1
8482            ,p_primary_key_2_col_name        => l_pk2_column_name
8483            ,p_primary_key_2_value           => l_ag_deflatened_row.PK2
8484            ,p_primary_key_3_col_name        => l_pk3_column_name
8485            ,p_primary_key_3_value           => l_ag_deflatened_row.PK3
8486            ,p_primary_key_4_col_name        => l_pk4_column_name
8487            ,p_primary_key_4_value           => l_ag_deflatened_row.PK4
8488            ,p_primary_key_5_col_name        => l_pk5_column_name
8489            ,p_primary_key_5_value           => l_ag_deflatened_row.PK5
8490            ,p_data_level_1_col_name         => l_data_level_column_1
8491            ,p_data_level_1_value            => l_ag_deflatened_row.DL1
8492            ,p_data_level_2_col_name         => l_data_level_column_2
8493            ,p_data_level_2_value            => l_ag_deflatened_row.DL1
8494            ,p_data_level_3_col_name         => l_data_level_column_3
8495            ,p_data_level_3_value            => l_ag_deflatened_row.DL1
8496            ,p_user_row_identifier           => l_ag_deflatened_row.ROW_IDENTIFIER
8497            ,p_entity_id                     => p_entity_id
8498            ,p_entity_index                  => p_entity_index
8499            ,p_entity_code                   => p_entity_code
8500            ,p_add_errors_to_fnd_stack       => G_ADD_ERRORS_TO_FND_STACK
8501            );
8502          END LOOP;
8503          CLOSE l_dynamic_cursor;
8504          ----------------------------------------------------------------
8505          -- HERE WE RAISE POST EVENT FOR ALL THE AG ROWS *BEING* DELETED
8506          ----------------------------------------------------------------
8507          OPEN l_dynamic_cursor FOR l_dynamic_sql_delete_post
8508          USING p_data_set_id, l_attr_group_metadata_obj.ATTR_GROUP_NAME;
8509          LOOP
8510            FETCH l_dynamic_cursor INTO l_ag_deflatened_row;
8511            EXIT WHEN l_dynamic_cursor%NOTFOUND;
8512             l_event_key := SUBSTRB(l_new_post_event_name, 1, 225) || '-' || TO_CHAR(SYSDATE, 'J.SSSSS');
8513            EGO_WF_WRAPPER_PVT.Raise_WF_Business_Event(
8514             p_event_name                    => l_new_post_event_name
8515            ,p_event_key                     => l_event_key
8516            ,p_dml_type                      => l_ag_deflatened_row.TRANSACTION_TYPE
8517            ,p_attr_group_name               => l_ag_deflatened_row.ATTR_GROUP_INT_NAME
8518            ,p_extension_id                  => l_ag_deflatened_row.EXTENSION_ID
8519            ,p_primary_key_1_col_name        => l_pk1_column_name
8520            ,p_primary_key_1_value           => l_ag_deflatened_row.PK1
8521            ,p_primary_key_2_col_name        => l_pk2_column_name
8522            ,p_primary_key_2_value           => l_ag_deflatened_row.PK2
8523            ,p_primary_key_3_col_name        => l_pk3_column_name
8524            ,p_primary_key_3_value           => l_ag_deflatened_row.PK3
8525            ,p_primary_key_4_col_name        => l_pk4_column_name
8526            ,p_primary_key_4_value           => l_ag_deflatened_row.PK4
8527            ,p_primary_key_5_col_name        => l_pk5_column_name
8528            ,p_primary_key_5_value           => l_ag_deflatened_row.PK5
8529            ,p_data_level_1_col_name         => l_data_level_column_1
8530            ,p_data_level_1_value            => l_ag_deflatened_row.DL1
8531            ,p_data_level_2_col_name         => l_data_level_column_2
8532            ,p_data_level_2_value            => l_ag_deflatened_row.DL1
8533            ,p_data_level_3_col_name         => l_data_level_column_3
8534            ,p_data_level_3_value            => l_ag_deflatened_row.DL1
8535            ,p_user_row_identifier           => l_ag_deflatened_row.ROW_IDENTIFIER
8536            ,p_entity_id                     => p_entity_id
8537            ,p_entity_index                  => p_entity_index
8538            ,p_entity_code                   => p_entity_code
8539            ,p_add_errors_to_fnd_stack       => G_ADD_ERRORS_TO_FND_STACK
8540            );
8541          END LOOP;
8542          CLOSE l_dynamic_cursor;
8543       END IF; -- IF (l_new_post_event_name IS NOT NULL AND l_new_post_event_enabled_flag = 'Y' AND G_REQUEST_ID =-1) THEN
8544       END IF ; --end for  *p_do_dml-IF-YJain*
8545 /* End code changes for bug 8485287*/
8546 
8547     END LOOP;
8548 
8549     -- Bug : 4099546
8550     CLOSE l_dynamic_dist_ag_cursor;
8551     code_debug(' After the Attr Group Level Validation loop ' ,1);
8552 
8553     IF (ERROR_HANDLER.Get_Message_Count > l_no_of_err_recs) THEN
8554       x_return_status := G_FND_RET_STS_WARNING;
8555     ELSE
8556       x_return_status := FND_API.G_RET_STS_SUCCESS;
8557     END IF;
8558 
8559     --
8560     -- let us write the error logs first
8561     --
8562     IF (FND_API.To_Boolean(p_init_error_handler)) THEN
8563       ERROR_HANDLER.Log_Error
8564        (p_write_err_to_inttable    => 'Y'
8565        ,p_write_err_to_conclog     => 'Y'
8566        ,p_write_err_to_debugfile   => ERROR_HANDLER.Get_Debug()
8567       );
8568       IF (ERROR_HANDLER.Get_Debug() = 'Y') THEN
8569         ERROR_HANDLER.Close_Debug_Session();
8570       END IF;
8571     END IF;
8572 
8573     IF (l_req_num_cursor_id) IS NOT NULL THEN
8574       DBMS_SQL.Close_Cursor(l_req_num_cursor_id);
8575     END IF;
8576     IF (l_req_char_cursor_id) IS NOT NULL THEN
8577       DBMS_SQL.Close_Cursor(l_req_char_cursor_id);
8578     END IF;
8579     IF (l_req_date_cursor_id) IS NOT NULL THEN
8580       DBMS_SQL.Close_Cursor(l_req_date_cursor_id);
8581     END IF;
8582     IF (l_default_num_cursor_id) IS NOT NULL THEN
8583       DBMS_SQL.Close_Cursor(l_default_num_cursor_id);
8584     END IF;
8585     IF (l_default_date_cursor_id) IS NOT NULL THEN
8586       DBMS_SQL.Close_Cursor(l_default_date_cursor_id);
8587     END IF;
8588     IF (l_default_char_cursor_id) IS NOT NULL THEN
8589       DBMS_SQL.Close_Cursor(l_default_char_cursor_id);
8590     END IF;
8591     IF (l_bad_tvs_sql_cursor_id) IS NOT NULL THEN
8592       DBMS_SQL.Close_Cursor(l_bad_tvs_sql_cursor_id);
8593     END IF;
8594 
8595     IF (l_sr_tvs_num_cursor_id1) IS NOT NULL THEN
8596       DBMS_SQL.Close_Cursor(l_sr_tvs_num_cursor_id1);
8597     END IF;
8598     IF (l_sr_tvs_num_cursor_id2) IS NOT NULL THEN
8599       DBMS_SQL.Close_Cursor(l_sr_tvs_num_cursor_id2);
8600     END IF;
8601     IF (l_sr_tvs_date_cursor_id1) IS NOT NULL THEN
8602       DBMS_SQL.Close_Cursor(l_sr_tvs_date_cursor_id1);
8603     END IF;
8604     IF (l_sr_tvs_date_cursor_id2) IS NOT NULL THEN
8605       DBMS_SQL.Close_Cursor(l_sr_tvs_date_cursor_id2);
8606     END IF;
8607     IF (l_sr_tvs_str_cursor_id1) IS NOT NULL THEN
8608       DBMS_SQL.Close_Cursor(l_sr_tvs_str_cursor_id1);
8609     END IF;
8610     IF (l_sr_tvs_str_cursor_id2) IS NOT NULL THEN
8611       DBMS_SQL.Close_Cursor(l_sr_tvs_str_cursor_id2);
8612     END IF;
8613 
8614     IF (l_tvs_char_cursor_id) IS NOT NULL THEN
8615       DBMS_SQL.Close_Cursor(l_tvs_char_cursor_id);
8616     END IF;
8617     IF (l_tvs_num_cursor_id) IS NOT NULL THEN
8618       DBMS_SQL.Close_Cursor(l_tvs_num_cursor_id);
8619     END IF;
8620     IF (l_tvs_date_cursor_id) IS NOT NULL THEN
8621       DBMS_SQL.Close_Cursor(l_tvs_date_cursor_id);
8622     END IF;
8623     IF (l_bad_bindattrs_tvs_cursor_id) IS NOT NULL THEN
8624       DBMS_SQL.Close_Cursor(l_bad_bindattrs_tvs_cursor_id);
8625     END IF;
8626 
8627     -- Bug 10151142: Start
8628     IF (l_dynamic_sql_cursor_id) IS NOT NULL THEN
8629       DBMS_SQL.Close_Cursor(l_dynamic_sql_cursor_id);
8630     END IF;
8631     IF (l_dynamic_sql_1_cursor_id) IS NOT NULL THEN
8632       DBMS_SQL.Close_Cursor(l_dynamic_sql_1_cursor_id);
8633     END IF;
8634     -- Bug 10151142: End
8635 
8636     --------------------------------------------------
8637     -- MARKING ALL THE ROWS AS 3 WHICH HAVE ERRORED --
8638     --------------------------------------------------
8639     --considering the G_PS_BAD_ATTR_OR_AG_METADATA is the starting point for the intermittent errors.
8640     -- Bug 9705869  : Added p_do_dml, so that the errors are logged even while doing DML (i.e to log errors for duplicate records etc..)
8641     IF (p_validate OR p_do_req_def_valiadtion OR p_do_dml) THEN -- *p_validate-IF-6* BugFix:5355722
8642       l_dynamic_sql :=
8643           'UPDATE '||p_interface_table_name||' UAI1 '||
8644           '    SET UAI1.PROCESS_STATUS =  '||G_PS_GENERIC_ERROR||
8645           '    WHERE UAI1.DATA_SET_ID = :data_set_id '||--p_data_set_id||
8646           '    AND UAI1.ROW_IDENTIFIER  IN '||
8647           '      (SELECT DISTINCT UAI2.ROW_IDENTIFIER'||
8648           '         FROM '||p_interface_table_name||' UAI2'||
8649           '          WHERE UAI2.DATA_SET_ID = :data_set_id '||--p_data_set_id||
8650           '                AND UAI2.PROCESS_STATUS >= '||G_PS_BAD_ATTR_OR_AG_METADATA ||')';
8651       EXECUTE IMMEDIATE l_dynamic_sql
8652       USING p_data_set_id, p_data_set_id;/*Fix for bug#9678667. Literal to bind*/
8653     END IF; -- *p_validate-IF-6* ending p_validate
8654 
8655     ------------------------------------------------------------------------
8656     -- WE ARE DONE WITH THE PROCESSING... NOW IF THERE EXIST SUCCESSFUL   --
8657     -- ROWS IN THE INTERFACE TABLE AND POST EVENT FLAG IS ENABLED         --
8658     -- WE NEED TO RAISE A POST EVENT. THERE IS JUST ONE POST EVENT RAISED --
8659     -- WITH REQUEST_ID AS A PARAMER.                                      --
8660     ------------------------------------------------------------------------
8661     IF (p_do_dml) THEN -- *p_do_dml-IF-3*
8662 
8663       BEGIN
8664         SELECT BUSINESS_EVENT_NAME
8665           INTO l_event_name
8666           FROM EGO_FND_DESC_FLEXS_EXT
8667          WHERE APPLICATION_ID = p_application_id
8668            AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type;
8669       EXCEPTION
8670         WHEN NO_DATA_FOUND THEN
8671           l_event_name := NULL;
8672       END;
8673 
8674       l_successful_rowcount := 0;
8675       EXECUTE IMMEDIATE  ' SELECT COUNT(*) FROM '|| p_interface_table_name ||
8676                          ' WHERE DATA_SET_ID = :data_set_id '||
8677                          '   AND ATTR_GROUP_TYPE = '''||p_attr_group_type||''' '||
8678                          ' AND PROCESS_STATUS = '||G_PS_IN_PROCESS
8679       INTO l_successful_rowcount
8680       USING p_data_set_id;
8681       l_is_second_post_event_flag := EGO_WF_WRAPPER_PVT.Get_PostAttr_Change_Event ();
8682        IF (l_event_name IS NOT NULL AND l_is_post_event_enabled_flag = 'Y' AND l_successful_rowcount > 0 AND G_REQUEST_ID IS NOT NULL   AND G_REQUEST_ID <>-1)
8683        THEN  --code changes for bug 8485287
8684 
8685          l_event_key := SUBSTRB(l_event_name, 1, 225) || '-' || TO_CHAR(SYSDATE, 'J.SSSSS');
8686          EGO_WF_WRAPPER_PVT.Raise_WF_Business_Event(
8687           p_event_name                    => l_event_name
8688          ,p_event_key                     => l_event_key
8689          ,p_request_id                    => G_REQUEST_ID
8690          ,p_entity_id                     => p_entity_id
8691          ,p_entity_index                  => p_entity_index
8692          ,p_entity_code                   => p_entity_code
8693          ,p_add_errors_to_fnd_stack       => G_ADD_ERRORS_TO_FND_STACK
8694          );
8695       END IF;
8696       ----------------------------------
8697       -- DONE WITH RAISING POST EVENT
8698       ----------------------------------
8699     END IF; -- *p_do_dml-IF-3*
8700 
8701     -- Standard check of p_commit
8702     IF FND_API.To_Boolean(p_commit) THEN
8703       COMMIT WORK;
8704     END IF;
8705 
8706     code_debug(l_api_name|| 'Done  ');
8707 
8708   EXCEPTION
8709     WHEN G_NO_ROWS_IN_INTF_TABLE THEN
8710       -- We need not do any thing since there are no rows in the intf table to process.
8711       NULL;
8712 
8713     WHEN OTHERS THEN
8714       code_debug('######## Oops ... came into the when others block-'||SQLERRM ,2);
8715       IF FND_API.To_Boolean(p_commit) THEN
8716         ROLLBACK TO Bulk_Load_User_Attrs_Data_PVT;
8717       END IF;
8718       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8719       x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' '||SQLERRM;
8720       -----------------------------------------------------
8721       -- MARKING ALL THE ROWS AS SINCE UN-EXPECTED ERROR --
8722       -- HAS OCCURED AND WE ARE ROLLING BACK             --
8723       -----------------------------------------------------
8724       /* FOR TESTING COMMENTING THIS OUT
8725 
8726       l_dynamic_sql :=
8727           'UPDATE '||p_interface_table_name||' UAI1
8728               SET UAI1.PROCESS_STATUS =  '||G_PS_GENERIC_ERROR||'
8729             WHERE UAI1.DATA_SET_ID = :data_set_id
8730               AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS;
8731 
8732       --EXECUTE IMMEDIATE l_dynamic_sql USING p_data_set_id;
8733 
8734       */
8735       -----------------------------------------------------------------
8736       -- Get a default row identifier to use in logging this message --
8737       -----------------------------------------------------------------
8738       l_dynamic_sql :=
8739       'SELECT TRANSACTION_ID
8740          FROM '||p_interface_table_name||' UAI1
8741         WHERE UAI1.DATA_SET_ID = :data_set_id
8742           AND ROWNUM = 1';
8743       EXECUTE IMMEDIATE l_dynamic_sql
8744       INTO l_dummy
8745       USING p_data_set_id;
8746 
8747       ERROR_HANDLER.Add_Error_Message(
8748         p_message_text                  => x_msg_data
8749        ,p_row_identifier                => l_dummy
8750        ,p_application_id                => 'EGO'
8751        ,p_message_type                  => FND_API.G_RET_STS_ERROR
8752        ,p_entity_id                     => G_ENTITY_ID
8753        ,p_table_name                    => p_interface_table_name
8754        ,p_entity_code                   => G_ENTITY_CODE
8755       );
8756 
8757 END Bulk_Load_User_Attrs_Data;
8758 
8759 ------------------------------------------------------------------
8760 
8761 
8762 
8763 
8764 
8765 
8766 
8767 
8768 
8769 
8770 
8771 
8772 ---------------------------------------------------------------------------------------------------------------------
8773 --API Name    : Apply_Template_On_Intf_Table
8774 --Description : The api would apply the attribute values in the template to the interface
8775 --              table, this api should be called after the rows in the interface table are
8776 --              validated.
8777 --parameters required :  p_api_version
8778 --                        p_application_id
8779 --                        p_object_name
8780 --                        p_interface_table_name
8781 --                        p_data_set_id
8782 --                        p_template_id
8783 --                        p_Classification_code
8784 --                        p_attr_group_type
8785 --                        p_target_entity_sql : this parameter should contain a query which would give a list of
8786 --                                              entities on which the template is to be applied and which template
8787 --                                              is to be applied and a rownum column.
8788 --                                              e.g. 'SELECT ROWNUM ENTITYNUMBER,
8789 --                                                           Decode(ROWNUM, 1,256678,2,256679,null) INVENTORY_ITEM_ID,
8790 --                                                           204 ORGANIZATION_ID, 14978 ITEM_CATALOG_GROUP_ID, -
8791 --                                                           1 TEMPLATE_ID
8792 --                                                           FROM ego_itm_usr_Attr_intrfc WHERE ROWNUM<3';
8793 --Return parameter    : x_return_status = 1 if no associations exist
8794 --                                            0 in all other cases
8795 --                       x_return_status
8796 --                       x_errorcode
8797 --                       x_msg_count
8798 --                       x_msg_data
8799 --
8800 --
8801 ----------------------------------------------------------------------------------------------------------------------
8802 
8803  PROCEDURE Apply_Template_On_Intf_Table (
8804         p_api_version                   IN   NUMBER
8805        ,p_application_id                IN   NUMBER
8806        ,p_object_name                   IN   VARCHAR2
8807        ,p_interface_table_name          IN   VARCHAR2
8808        ,p_data_set_id                   IN   NUMBER
8809        ,p_attr_group_type               IN   VARCHAR2
8810        ,p_request_id                    IN   NUMBER
8811        ,p_program_application_id        IN   NUMBER
8812        ,p_program_id                    IN   NUMBER
8813        ,p_program_update_date           IN   DATE
8814        ,p_current_user_party_id         IN   NUMBER
8815        ,p_target_entity_sql             IN   VARCHAR2
8816        ,p_process_status                IN   NUMBER    DEFAULT G_PS_IN_PROCESS
8817        ,p_class_code_hierarchy_sql      IN   VARCHAR2  DEFAULT NULL
8818        ,p_hierarchy_template_tbl_sql    IN   VARCHAR2  DEFAULT NULL
8819        ,x_return_status                 OUT NOCOPY VARCHAR2
8820        ,x_errorcode                     OUT NOCOPY NUMBER
8821        ,x_msg_count                     OUT NOCOPY NUMBER
8822        ,x_msg_data                      OUT NOCOPY VARCHAR2
8823 ) IS
8824 
8825     l_api_name      CONSTANT VARCHAR2(30) := 'Apply_template_on_intf_table';
8826     l_api_version   CONSTANT NUMBER       := 1.0;
8827 
8828     CURSOR data_level_cols_cursor (cp_application_id  IN NUMBER
8829                                   ,cp_attr_group_type IN VARCHAR2)
8830     IS
8831     SELECT data_level_id
8832           ,data_level_name
8833           ,pk1_column_name
8834           ,pk1_column_type
8835           ,pk2_column_name
8836           ,pk2_column_type
8837           ,pk3_column_name
8838           ,pk3_column_type
8839           ,pk4_column_name
8840           ,pk4_column_type
8841           ,pk5_column_name
8842           ,pk5_column_type
8843       FROM EGO_DATA_LEVEL_B
8844      WHERE application_id  = cp_application_id
8845        AND attr_group_type = cp_attr_group_type
8846   ORDER BY data_level_id;
8847 
8848     G_NO_ROWS_IN_INTF_TABLE     EXCEPTION;
8849 
8850     l_num_dl_columns            NUMBER := 0;
8851     l_class_code_column_name    VARCHAR2(30);
8852     l_class_code_column_type    VARCHAR2(30);
8853 
8854     l_ext_vl_name               VARCHAR2(30);
8855 
8856     l_pk1_column_name           VARCHAR2(30);
8857     l_pk2_column_name           VARCHAR2(30);
8858     l_pk3_column_name           VARCHAR2(30);
8859     l_pk4_column_name           VARCHAR2(30);
8860     l_pk5_column_name           VARCHAR2(30);
8861 
8862     l_dl_col_decode_list        VARCHAR2(1000);
8863     l_dl_col_list               VARCHAR2(1000);
8864     l_temp                      VARCHAR2(100);
8865 
8866     l_has_data_level_id         BOOLEAN;
8867     l_dl_col_templrtcq_list     VARCHAR2(1000);
8868 
8869     TYPE data_level_info IS RECORD
8870       (dl_id            NUMBER
8871       ,dl_name          VARCHAR2(150)
8872       ,dl_column1       VARCHAR2(150)
8873       ,dl_column2       VARCHAR2(150)
8874       ,dl_column3       VARCHAR2(150)
8875       ,dl_column4       VARCHAR2(150)
8876       ,dl_column5       VARCHAR2(150)
8877 --      ,dl_column_type1  VARCHAR2(150)
8878 --      ,dl_column_type2  VARCHAR2(150)
8879 --      ,dl_column_type3  VARCHAR2(150)
8880 --      ,dl_column_type4  VARCHAR2(150)
8881 --      ,dl_column_type5  VARCHAR2(150)
8882 --      ,dl_disp_name     VARCHAR2(240)
8883       ,dl_concat_pk_cols  VARCHAR2(1000)
8884       ,dl_col_list                VARCHAR2(1000)
8885       ,dl_intfrtcq_trtcq_join     VARCHAR2(1000)
8886       ,dl_ext_trtcq_join          VARCHAR2(1000)
8887       );
8888 
8889     TYPE data_level_table IS TABLE OF data_level_info;
8890 
8891     l_dl_record  DATA_LEVEL_TABLE;
8892 
8893     l_dynamic_sql                       VARCHAR2(32767);
8894     l_ag_to_process                     EGO_USER_ATTRS_BULK_NUM_TBL;
8895     l_template_to_process               EGO_USER_ATTRS_BULK_NUM_TBL;
8896     l_cc_to_process                     EGO_USER_ATTRS_BULK_NUM_TBL;
8897 
8898     l_ag_to_process_list                VARCHAR2(10000);
8899     l_template_to_process_list          VARCHAR2(10000);
8900     l_cc_to_process_list                VARCHAR2(10000);
8901 
8902     l_concat_pk_cols                    VARCHAR2(400) := '';
8903     l_concat_pk_cols_entities           VARCHAR2(800) := '';
8904     l_pk_col_where_ent_uartcq           VARCHAR2(1500) := '';
8905     l_ext_templrtcq_join                VARCHAR2(3000);
8906     l_ext_templrtcq_pk_join             VARCHAR2(1000);
8907     l_ext_templrtcq_uk_join             VARCHAR2(2000);
8908     l_dl_intfrtcq_trtcq_join            VARCHAR2(200);
8909     l_dl_ext_trtcq_join                 VARCHAR2(400);
8910     l_uk_tmpl_intf_rtcq_where           VARCHAR2(5000);
8911     l_attr_null_chk_decode              VARCHAR2(10000);
8912 
8913     l_attr_group_metadata_obj           EGO_ATTR_GROUP_METADATA_OBJ;
8914     l_attr_metadata_table               EGO_ATTR_METADATA_TABLE;
8915     l_template_table_RTCQ               VARCHAR2(32767);
8916     l_intf_table_RTCQ                   VARCHAR2(32767);
8917     l_ag_row_cursor                     INTEGER;
8918     l_dummy_number                      NUMBER;
8919     l_num_value                         NUMBER;
8920     l_str_value                         VARCHAR2(4000);
8921     l_date_value                        DATE;
8922     l_value                             VARCHAR2(32767);
8923     l_union_tbl_value                   VARCHAR2(3000);
8924     l_rows_to_insert_sql                VARCHAR2(32767);
8925     l_max_trans_id                      NUMBER;
8926     l_max_row_identifier                NUMBER;
8927     l_ag_id_col_exists                  BOOLEAN;
8928     l_ag_id_clause                      VARCHAR2(100);
8929     l_ag_assoc_data_level_id            NUMBER;
8930     l_assoc_data_level                  NUMBER;
8931     l_num_val_col                       VARCHAR2(2000);
8932     l_template_table_sql                VARCHAR2(10000);
8933     l_ext_b_table_name                  VARCHAR2(100);
8934 
8935 BEGIN
8936 
8937 code_debug(l_api_name||' Starting ',0);
8938 code_debug(l_api_name||'   p_application_id         '|| p_application_id        );
8939 code_debug(l_api_name||'   p_object_name            '|| p_object_name           );
8940 code_debug(l_api_name||'   p_interface_table_name   '|| p_interface_table_name  );
8941 code_debug(l_api_name||'   p_data_set_id            '|| p_data_set_id           );
8942 code_debug(l_api_name||'   p_attr_group_type        '|| p_attr_group_type       );
8943 code_debug(l_api_name||'   p_request_id             '|| p_request_id            );
8944 code_debug(l_api_name||'   p_program_application_id '|| p_program_application_id);
8945 code_debug(l_api_name||'   p_program_id             '|| p_program_id            );
8946 code_debug(l_api_name||'   p_program_update_date    '|| p_program_update_date   );
8947 code_debug(l_api_name||'   p_current_user_party_id  '|| p_current_user_party_id );
8948 code_debug(l_api_name||'   p_target_entity_sql      '|| p_target_entity_sql     );
8949 
8950   IF(p_hierarchy_template_tbl_sql IS NULL) THEN
8951      l_template_table_sql := ' EGO_TEMPL_ATTRIBUTES ';
8952   ELSE
8953      l_template_table_sql := p_hierarchy_template_tbl_sql;
8954   END IF;
8955 
8956   l_dynamic_sql := ' SELECT count(*) FROM ( '||p_target_entity_sql||') ';
8957   EXECUTE IMMEDIATE l_dynamic_sql INTO l_dummy_number;
8958   code_debug (l_api_name ||' no records to be processed '||l_dummy_number);
8959   IF l_dummy_number = 0 THEN
8960     code_debug (l_api_name ||' returning as there are no records to process ');
8961     x_return_status := FND_API.G_RET_STS_SUCCESS;
8962     RETURN;
8963   END IF;
8964 
8965   l_dynamic_sql :=
8966       ' SELECT MAX(ROW_IDENTIFIER),MAX(TRANSACTION_ID)'||
8967         ' FROM '||p_interface_table_name||
8968        ' WHERE DATA_SET_ID = :data_Set_id ';
8969 
8970   -----------------------------------------
8971   -- Fetch the PK column names and data  --
8972   -- types for the passed-in object name --
8973   -----------------------------------------
8974   SELECT PK1_COLUMN_NAME,
8975          PK2_COLUMN_NAME,
8976          PK3_COLUMN_NAME,
8977          PK4_COLUMN_NAME,
8978          PK5_COLUMN_NAME
8979     INTO l_pk1_column_name,
8980          l_pk2_column_name,
8981          l_pk3_column_name,
8982          l_pk4_column_name,
8983          l_pk5_column_name
8984     FROM FND_OBJECTS
8985    WHERE OBJ_NAME = p_object_name;
8986 
8987   ----------------------------------------------------------------------------
8988   -- CONSTRUCTING THE PK, DL AND THE CLASS CODE COLUMN SELECT LIST.         --
8989   ----------------------------------------------------------------------------
8990 
8991   IF (l_pk1_column_name IS NOT NULL) THEN
8992      l_concat_pk_cols := l_pk1_column_name||',';
8993      l_concat_pk_cols_entities := l_concat_pk_cols_entities||' TEMPLRTCQ.'||l_pk1_column_name||',';
8994      l_pk_col_where_ent_uartcq := l_pk_col_where_ent_uartcq || ' AND TEMPLRTCQ.'||l_pk1_column_name||' = INTFRTCQ.'||l_pk1_column_name||'(+)';
8995      -- l_ext_templrtcq_pk_join := l_ext_templrtcq_pk_join||' TEMPLRTCQ.'||l_pk1_column_name||' = EXT.'||l_pk1_column_name||'(+) '; -- Bug 13414358
8996   END IF;
8997 
8998   IF (l_pk2_column_name IS NOT NULL) THEN
8999      l_concat_pk_cols := l_concat_pk_cols ||l_pk2_column_name||',';
9000      l_concat_pk_cols_entities := l_concat_pk_cols_entities||' TEMPLRTCQ.'||l_pk2_column_name||',';
9001      l_pk_col_where_ent_uartcq := l_pk_col_where_ent_uartcq || ' AND TEMPLRTCQ.'||l_pk2_column_name||' = INTFRTCQ.'||l_pk2_column_name||'(+)';
9002      -- l_ext_templrtcq_pk_join := l_ext_templrtcq_pk_join||' AND TEMPLRTCQ.'||l_pk2_column_name||' = EXT.'||l_pk2_column_name||'(+) '; -- Bug 13414358
9003   END IF;
9004 
9005   IF (l_pk3_column_name IS NOT NULL) THEN
9006     l_concat_pk_cols := l_concat_pk_cols ||l_pk3_column_name||',';
9007     l_concat_pk_cols_entities := l_concat_pk_cols_entities||' TEMPLRTCQ.'||l_pk3_column_name||',';
9008     l_pk_col_where_ent_uartcq := l_pk_col_where_ent_uartcq || ' AND TEMPLRTCQ.'||l_pk3_column_name||' = INTFRTCQ.'||l_pk3_column_name||'(+)';
9009     -- l_ext_templrtcq_pk_join := l_ext_templrtcq_pk_join||' AND TEMPLRTCQ.'||l_pk3_column_name||' = EXT.'||l_pk3_column_name||'(+) '; -- Bug 13414358
9010   END IF;
9011 
9012   IF (l_pk4_column_name IS NOT NULL) THEN
9013     l_concat_pk_cols := l_concat_pk_cols ||l_pk4_column_name||',';
9014     l_concat_pk_cols_entities := l_concat_pk_cols_entities||' TEMPLRTCQ.'||l_pk4_column_name||',';
9015     l_pk_col_where_ent_uartcq := l_pk_col_where_ent_uartcq || ' AND TEMPLRTCQ.'||l_pk4_column_name||' = INTFRTCQ.'||l_pk4_column_name||'(+)';
9016     -- l_ext_templrtcq_pk_join := l_ext_templrtcq_pk_join||' AND TEMPLRTCQ.'||l_pk4_column_name||' = EXT.'||l_pk4_column_name||'(+) '; -- Bug 13414358
9017   END IF;
9018 
9019   IF (l_pk5_column_name IS NOT NULL) THEN
9020     l_concat_pk_cols := l_concat_pk_cols ||l_pk5_column_name||',';
9021     l_concat_pk_cols_entities := l_concat_pk_cols_entities||' TEMPLRTCQ.'||l_pk5_column_name||',';
9022     l_pk_col_where_ent_uartcq := l_pk_col_where_ent_uartcq || ' AND TEMPLRTCQ.'||l_pk5_column_name||' = INTFRTCQ.'||l_pk5_column_name||'(+)';
9023     -- l_ext_templrtcq_pk_join := l_ext_templrtcq_pk_join||' AND TEMPLRTCQ.'||l_pk5_column_name||' = EXT.'||l_pk5_column_name||'(+) '; -- Bug 13414358
9024   END IF;
9025 
9026 code_debug(l_api_name||' Phase 1');
9027 code_debug(l_api_name||' l_concat_pk_cols: '||l_concat_pk_cols);
9028 code_debug(l_api_name||' l_concat_pk_cols_entities: '||l_concat_pk_cols_entities);
9029 code_debug(l_api_name||' l_pk_col_where_ent_uartcq: '||l_pk_col_where_ent_uartcq);
9030 -- code_debug(l_api_name||' l_ext_templrtcq_pk_join: '||l_ext_templrtcq_pk_join); -- Bug 13414358
9031 
9032   SELECT classification_col_name, classification_col_type
9033    INTO l_class_code_column_name, l_class_code_column_type
9034    FROM ego_fnd_objects_ext
9035   WHERE object_name = p_object_name;
9036 code_debug(l_api_name||' l_class_code_column_name: ' ||l_class_code_column_name);
9037 
9038   -- adding the class code column
9039   IF l_class_code_column_name IS NOT NULL THEN
9040     l_concat_pk_cols := l_concat_pk_cols ||l_class_code_column_name||' ';
9041     l_concat_pk_cols_entities := l_concat_pk_cols_entities || ' TEMPLRTCQ.'||l_class_code_column_name||' , ';
9042     l_pk_col_where_ent_uartcq := l_pk_col_where_ent_uartcq ||' AND TEMPLRTCQ.'||l_class_code_column_name||' = INTFRTCQ.'||l_class_code_column_name||'(+) ';
9043     -- l_ext_templrtcq_pk_join := l_ext_templrtcq_pk_join || ' AND TEMPLRTCQ.'||l_class_code_column_name||' = EXT.'||l_class_code_column_name||'(+) '; -- Bug 13414358
9044   END IF;
9045 
9046 code_debug(l_api_name||' Phase 2 after class code ');
9047 code_debug(l_api_name||' l_concat_pk_cols: '||l_concat_pk_cols);
9048 code_debug(l_api_name||' l_concat_pk_cols_entities: '||l_concat_pk_cols_entities);
9049 code_debug(l_api_name||' l_pk_col_where_ent_uartcq: '||l_pk_col_where_ent_uartcq);
9050 -- code_debug(l_api_name||' l_ext_templrtcq_pk_join: '|| l_ext_templrtcq_pk_join); -- Bug 13414358
9051   ------------------------------------------------------------
9052   -- Get data level information for the given attribute group type, aplication
9053   -- The assumption is that the template table has the DL columns if requested
9054   -- for application into the template
9055   ------------------------------------------------------------
9056   l_dl_record := DATA_LEVEL_TABLE();
9057 
9058   FOR dl_rec IN data_level_cols_cursor(cp_application_id  => p_application_id
9059                                       ,cp_attr_group_type => p_attr_group_type)
9060   LOOP
9061     l_dl_record.EXTEND();
9062     l_num_dl_columns := l_dl_record.LAST;
9063     l_dl_record(l_num_dl_columns).dl_id           := dl_rec.data_level_id;
9064     l_dl_record(l_num_dl_columns).dl_name         := dl_rec.data_level_name;
9065     l_dl_record(l_num_dl_columns).dl_column1      := dl_rec.pk1_column_name;
9066     l_dl_record(l_num_dl_columns).dl_column2      := dl_rec.pk2_column_name;
9067     l_dl_record(l_num_dl_columns).dl_column3      := dl_rec.pk3_column_name;
9068     l_dl_record(l_num_dl_columns).dl_column4      := dl_rec.pk4_column_name;
9069     l_dl_record(l_num_dl_columns).dl_column5      := dl_rec.pk5_column_name;
9070     l_dl_record(l_num_dl_columns).dl_col_list := null;
9071     l_dl_record(l_num_dl_columns).dl_intfrtcq_trtcq_join := ' 1=1 ';
9072     l_dl_record(l_num_dl_columns).dl_ext_trtcq_join := ' 1=1 ';
9073 
9074     IF dl_rec.pk1_column_name IS NOT NULL THEN
9075       l_dl_record(l_num_dl_columns).dl_col_list := ' ' ||dl_rec.pk1_column_name||' ';
9076       l_dl_record(l_num_dl_columns).dl_intfrtcq_trtcq_join := ' NVL(INTFRTCQ.'||dl_rec.pk1_column_name||'(+),-1) = NVL2(INTFRTCQ.'||dl_rec.pk1_column_name||'(+),TEMPLRTCQ.'||dl_rec.pk1_column_name||',-1)';
9077       -- l_dl_record(l_num_dl_columns).dl_ext_trtcq_join   := ' NVL(EXT.'||dl_rec.pk1_column_name||'(+),-1) = NVL(TEMPLRTCQ.'||dl_rec.pk1_column_name||',-1)'; -- Bug 13414358
9078     END IF;
9079     IF dl_rec.pk2_column_name IS NOT NULL THEN
9080       l_dl_record(l_num_dl_columns).dl_col_list :=
9081           l_dl_record(l_num_dl_columns).dl_col_list||','||dl_rec.pk2_column_name||' ';
9082       l_dl_record(l_num_dl_columns).dl_intfrtcq_trtcq_join :=
9083          l_dl_record(l_num_dl_columns).dl_intfrtcq_trtcq_join || ' AND NVL(INTFRTCQ.'||dl_rec.pk2_column_name||'(+),-1) = NVL2(INTFRTCQ.'||dl_rec.pk2_column_name||'(+),TEMPLRTCQ.'||dl_rec.pk2_column_name||',-1)';
9084       -- Bug 13414358
9085       /*
9086       l_dl_record(l_num_dl_columns).dl_ext_trtcq_join  :=
9087          l_dl_record(l_num_dl_columns).dl_ext_trtcq_join ||' AND NVL(EXT.'||dl_rec.pk2_column_name||'(+),-1) = NVL(TEMPLRTCQ.'||dl_rec.pk2_column_name||',-1)';
9088       */
9089     END IF;
9090     IF dl_rec.pk3_column_name IS NOT NULL THEN
9091       l_dl_record(l_num_dl_columns).dl_col_list :=
9092           l_dl_record(l_num_dl_columns).dl_col_list||','||dl_rec.pk3_column_name||' ';
9093       l_dl_record(l_num_dl_columns).dl_intfrtcq_trtcq_join :=
9094          l_dl_record(l_num_dl_columns).dl_intfrtcq_trtcq_join || ' AND NVL(INTFRTCQ.'||dl_rec.pk3_column_name||'(+),-1) = NVL2(INTFRTCQ.'||dl_rec.pk3_column_name||'(+),TEMPLRTCQ.'||dl_rec.pk3_column_name||',-1)';
9095       -- Bug 13414358
9096       /*
9097       l_dl_record(l_num_dl_columns).dl_ext_trtcq_join  :=
9098         l_dl_record(l_num_dl_columns).dl_ext_trtcq_join ||' AND NVL(EXT.'||dl_rec.pk3_column_name||'(+),-1) = NVL(TEMPLRTCQ.'||dl_rec.pk3_column_name||',-1)';
9099       */
9100     END IF;
9101     IF dl_rec.pk4_column_name IS NOT NULL THEN
9102       l_dl_record(l_num_dl_columns).dl_col_list :=
9103           l_dl_record(l_num_dl_columns).dl_col_list||','||dl_rec.pk4_column_name||' ';
9104       l_dl_record(l_num_dl_columns).dl_intfrtcq_trtcq_join :=
9105          l_dl_record(l_num_dl_columns).dl_intfrtcq_trtcq_join || ' AND NVL(INTFRTCQ.'||dl_rec.pk4_column_name||'(+),-1) = NVL2(INTFRTCQ.'||dl_rec.pk4_column_name||'(+),TEMPLRTCQ.'||dl_rec.pk4_column_name||',-1)';
9106       -- Bug 13414358
9107       /*
9108       l_dl_record(l_num_dl_columns).dl_ext_trtcq_join  :=
9109         l_dl_record(l_num_dl_columns).dl_ext_trtcq_join ||' AND NVL(EXT.'||dl_rec.pk4_column_name||'(+),-1) = NVL(TEMPLRTCQ.'||dl_rec.pk4_column_name||',-1)';
9110       */
9111     END IF;
9112     IF dl_rec.pk5_column_name IS NOT NULL THEN
9113       l_dl_record(l_num_dl_columns).dl_col_list :=
9114           l_dl_record(l_num_dl_columns).dl_col_list||','||dl_rec.pk5_column_name||' ';
9115       l_dl_record(l_num_dl_columns).dl_intfrtcq_trtcq_join :=
9116          l_dl_record(l_num_dl_columns).dl_intfrtcq_trtcq_join || ' AND NVL(INTFRTCQ.'||dl_rec.pk5_column_name||'(+),-1) = NVL2(INTFRTCQ.'||dl_rec.pk5_column_name||'(+),TEMPLRTCQ.'||dl_rec.pk5_column_name||',-1)';
9117       -- Bug 13414358
9118       /*
9119       l_dl_record(l_num_dl_columns).dl_ext_trtcq_join  :=
9120         l_dl_record(l_num_dl_columns).dl_ext_trtcq_join ||' AND NVL(EXT.'||dl_rec.pk5_column_name||'(+),-1) = NVL(TEMPLRTCQ.'||dl_rec.pk5_column_name||',-1)';
9121       */
9122     END IF;
9123 
9124     l_num_dl_columns := l_num_dl_columns + 1;
9125   END LOOP;
9126 
9127   SELECT application_table_name
9128     INTO l_ext_b_table_name
9129     FROM FND_DESCRIPTIVE_FLEXS
9130    WHERE application_id = p_application_id
9131      AND descriptive_flexfield_name = p_attr_group_type;
9132 
9133   l_has_data_level_id := FND_API.TO_BOOLEAN(EGO_USER_ATTRS_COMMON_PVT.has_column_in_table(l_ext_b_table_name, 'DATA_LEVEL_ID'));
9134 
9135   ------------------------------
9136   -- dl level column query part
9137   ------------------------------
9138   l_dl_col_list := NULL;
9139   l_dl_col_templrtcq_list := NULL;
9140   IF l_has_data_level_id THEN
9141     l_dl_col_list := EGO_USER_ATTRS_COMMON_PVT.Get_All_Data_Level_PK_Names (p_application_id  => p_application_id
9142                                                                            ,p_attr_group_type => p_attr_group_type);
9143     IF l_dl_col_list IS NOT NULL THEN
9144       l_dl_col_templrtcq_list := ' TEMPLRTCQ.'||REPLACE(l_dl_col_list, ', ', ' , TEMPLRTCQ.');
9145     ELSE
9146       l_dl_col_templrtcq_list := NULL;
9147     END IF;
9148   ELSE
9149     FOR cr IN data_level_cols_cursor(cp_application_id  => p_application_id
9150                                     ,cp_attr_group_type => p_attr_group_type) LOOP
9151       IF l_dl_col_list IS NULL THEN
9152         l_dl_col_list := ' '||cr.data_level_name||' ';
9153       ELSE
9154         l_dl_col_list := l_dl_col_list||', '||cr.data_level_name||' ';
9155       END IF;
9156     END LOOP;
9157   END IF;  -- l_has_data_level_id - 1
9158 
9159 code_debug(l_api_name||' Phase 3 ');
9160 code_debug(l_api_name||' l_dl_col_list: ' ||l_dl_col_list);
9161 code_debug(l_api_name||' l_dl_intfrtcq_trtcq_join: '||l_dl_intfrtcq_trtcq_join);
9162 code_debug(l_api_name||' l_dl_ext_trtcq_join: '||l_dl_ext_trtcq_join);
9163 
9164   SELECT flex_ext.application_vl_name
9165     INTO l_ext_vl_name
9166     FROM ego_fnd_desc_flexs_ext flex_ext
9167    WHERE flex_ext.application_id = p_application_id
9168      AND flex_ext.descriptive_flexfield_name = p_attr_group_type;
9169 
9170   ----------------------------------------------------------------------------
9171   -- WE ARE ASSUMING THAT THE ROWS IN THE INTERFACE TABLE ARE ALREADY       --
9172   -- VALIDATED BY NOW. AND HENCE THE ATTR GROUP ID COLUMN IS ALREADY        --
9173   -- POPULATED.                                                             --
9174   ----------------------------------------------------------------------------
9175 
9176   ----------------------------------------------------------------------------
9177   --                    Collect the atttributes                             --
9178   ----------------------------------------------------------------------------
9179 
9180   l_dynamic_sql :=
9181            ' SELECT DISTINCT ATTRIBUTE_GROUP_ID, TEMPL.TEMPLATE_ID, TEMPL.CLASSIFICATION_CODE '||
9182            '   FROM EGO_TEMPL_ATTRIBUTES TEMPL,              '||
9183            '        EGO_FND_DSC_FLX_CTX_EXT AGMDATA,         '||
9184            '      ('||p_target_entity_sql||') ENTITIES       '||
9185            '  WHERE TEMPL.TEMPLATE_ID = ENTITIES.TEMPLATE_ID ';
9186   IF (p_class_code_hierarchy_sql IS NOT NULL) THEN
9187     l_dynamic_sql := l_dynamic_sql ||' AND (  TEMPL.CLASSIFICATION_CODE = ENTITIES.'||l_class_code_column_name
9188                                    ||'       OR TEMPL.CLASSIFICATION_CODE IN ('||p_class_code_hierarchy_sql||' ) ) ';
9189   ELSE
9190     l_dynamic_sql := l_dynamic_sql ||'    AND TEMPL.CLASSIFICATION_CODE = ENTITIES.'||l_class_code_column_name;
9191   END IF;
9192 
9193     l_dynamic_sql := l_dynamic_sql ||
9194            '    AND AGMDATA.ATTR_GROUP_ID = TEMPL.ATTRIBUTE_GROUP_ID '||
9195            '    AND AGMDATA.DESCRIPTIVE_FLEXFIELD_NAME = :ag_type    '||
9196            '    AND ENABLED_FLAG = ''Y''                             ';
9197 
9198 code_debug(l_api_name||' Phase 4 ');
9199 code_debug(l_api_name||' l_dynamic_sql: '|| l_dynamic_sql);
9200 code_debug(l_api_name||' executed using bind: '|| p_attr_group_type);
9201   BEGIN
9202 
9203      EXECUTE IMMEDIATE l_dynamic_sql
9204      BULK COLLECT INTO l_ag_to_process,l_template_to_process,l_cc_to_process
9205      USING p_attr_group_type;
9206   EXCEPTION
9207       WHEN NO_DATA_FOUND THEN
9208           code_debug('      ...... No row to process in the for this template  ',1);
9209           RAISE G_NO_ROWS_IN_INTF_TABLE;
9210   END;
9211 
9212   ----------------------------------------------------------------------------
9213   -- BUILD THE LIST OF AG_ID,CLASS_CODE AND TEMPL_ID TO BE USED IN THE      --
9214   -- TEMPLATE RTCQ (this will reduce the records in the RTCQ tbale and the  --
9215   -- index will be picked up.)                                              --
9216   ----------------------------------------------------------------------------
9217   l_ag_to_process_list := ' -2910 ';
9218   l_template_to_process_list := ' -2910 ';
9219   l_cc_to_process_list :=  ' -2910 ';
9220 
9221   IF (l_ag_to_process.COUNT >0) THEN
9222     FOR x IN l_ag_to_process.FIRST .. l_ag_to_process.LAST
9223     LOOP
9224       l_ag_to_process_list := l_ag_to_process_list || ','|| l_ag_to_process(x);
9225       l_template_to_process_list := l_template_to_process_list ||','||l_template_to_process(x);
9226       l_cc_to_process_list := l_cc_to_process_list||','||l_cc_to_process(x);
9227     END LOOP;
9228   END IF;
9229 
9230   -- Bug 10125885 - Start
9231   -- Add all the ICC ids available in the interface table.
9232   l_dynamic_sql := 'SELECT DISTINCT ITEM_CATALOG_GROUP_ID '||
9233                    ' FROM ('||p_target_entity_sql||')';
9234 
9235   EXECUTE IMMEDIATE l_dynamic_sql
9236      BULK COLLECT INTO l_cc_to_process;
9237 
9238   IF (l_cc_to_process.Count > 0) THEN
9239     FOR x IN l_cc_to_process.FIRST .. l_cc_to_process.LAST
9240     LOOP
9241       l_cc_to_process_list := l_cc_to_process_list||','||l_cc_to_process(x);
9242     END LOOP;
9243   END IF;
9244   -- Bug 10125885 - End
9245 
9246 code_debug(l_api_name||' Phase 5 ');
9247 code_debug(l_api_name||' l_ag_to_process_list: '|| l_ag_to_process_list);
9248 code_debug(l_api_name||' l_template_to_process_list: '|| l_template_to_process_list);
9249 code_debug(l_api_name||' l_cc_to_process_list: '|| l_cc_to_process_list);
9250   ----------------------------------------------------------------------------
9251   -- Now we will loop thru this list of ag id's to process each AG .        --
9252   ----------------------------------------------------------------------------
9253 
9254   IF (l_ag_to_process.COUNT >0) THEN
9255 
9256     FOR x IN l_ag_to_process.FIRST .. l_ag_to_process.LAST
9257     LOOP
9258 
9259 
9260       l_attr_group_metadata_obj := EGO_USER_ATTRS_COMMON_PVT.Get_Attr_Group_Metadata(
9261                                    p_attr_group_id   => l_ag_to_process(x)
9262                                   ,p_application_id  => p_application_id
9263                                   ,p_attr_group_type => null
9264                                   ,p_attr_group_name => NULL
9265                                  );
9266 
9267       ------------------------------------------------------------------------
9268       -- Checking the data level at which the attr group is associated      --
9269       ------------------------------------------------------------------------
9270       IF l_has_data_level_id THEN  -- l_has_data_level_id - 2
9271         l_dl_col_decode_list := l_dl_col_templrtcq_list;
9272         --
9273         -- do we really need this?
9274         --
9275         l_dl_ext_trtcq_join := ' 0 = 0 ';
9276         l_dl_intfrtcq_trtcq_join := ' 0 = 0 ';
9277       ELSE
9278         -- existing code which takes in the
9279         SELECT DATA_LEVEL_ID
9280           INTO l_ag_assoc_data_level_id
9281           FROM EGO_OBJ_AG_ASSOCS_B
9282          WHERE ATTR_GROUP_ID = l_attr_group_metadata_obj.ATTR_GROUP_ID
9283            AND ROWNUM = 1;
9284 
9285         FOR loop_dl_count IN l_dl_record.first .. l_dl_record.last LOOP
9286           IF l_dl_record(loop_dl_count).dl_id = l_ag_assoc_data_level_id THEN
9287             IF l_dl_record(loop_dl_count).dl_column1 IS NULL THEN
9288               l_assoc_data_level := 0;
9289             ELSE
9290               l_assoc_data_level := 1;
9291             END IF;
9292             ------------------------------------------------------------------
9293             -- Building the data level col decode for pluggin into the      --
9294             -- select                                                       --
9295             ------------------------------------------------------------------
9296             IF l_dl_record(loop_dl_count).dl_column1 IS NOT NULL THEN
9297               l_dl_col_decode_list := ' DECODE(1,'||l_assoc_data_level||',TEMPLRTCQ.'||l_dl_record(loop_dl_count).dl_column1||',null) '||l_dl_record(loop_dl_count).dl_column1||' ';
9298               IF l_dl_record(loop_dl_count).dl_column1 IS NOT NULL THEN
9299                 l_dl_col_decode_list := ', DECODE(1,'||l_assoc_data_level||',TEMPLRTCQ.'||l_dl_record(loop_dl_count).dl_column2||',null) '||l_dl_record(loop_dl_count).dl_column2||' ';
9300                 IF l_dl_record(loop_dl_count).dl_column3 IS NOT NULL THEN
9301                   l_dl_col_decode_list := ', DECODE(1,'||l_assoc_data_level||',TEMPLRTCQ.'||l_dl_record(loop_dl_count).dl_column3||',null) '||l_dl_record(loop_dl_count).dl_column3||' ';
9302                 END IF;
9303               END IF;
9304             END IF;
9305             EXIT; -- loop
9306           END IF;
9307         END LOOP;
9308 
9309         ----------------------------------------------------------------------
9310         -- In case the AG is associated at entity level there is no need to --
9311         -- have the data level clause                                       --
9312         ----------------------------------------------------------------------
9313         IF(l_assoc_data_level = 0) THEN
9314            l_dl_ext_trtcq_join := ' 0 = 0 ';
9315            l_dl_intfrtcq_trtcq_join := ' 0 = 0 ';
9316         END IF;
9317 
9318       END IF; -- l_has_data_level_id - 2
9319 code_debug(l_api_name||' ATTR_GROUP_NAME: '|| l_attr_group_metadata_obj.ATTR_GROUP_NAME);
9320 code_debug(l_api_name||' l_assoc_data_level: '|| l_assoc_data_level);
9321 code_debug(l_api_name||' l_dl_col_decode_list: '|| l_dl_col_decode_list);
9322 
9323       ------------------------------------------------------------------------
9324       -- LET US FIRST BUILD THE RTCQ QUERY FOR TEMPLATE AND INTF TABLE      --
9325       ------------------------------------------------------------------------
9326       l_attr_metadata_table := l_attr_group_metadata_obj.ATTR_METADATA_TABLE;
9327 
9328       l_template_table_RTCQ := 'SELECT '||l_attr_group_metadata_obj.ATTR_GROUP_ID||', CLASSIFICATION_CODE CLASSIFICATION_CODE1,'||
9329                                'MAX(TEMPLATE_ID) TEMPLATE_ID1, ATTRIBUTE_GROUP_ID, ROW_NUMBER ';
9330 
9331       -- l_ext_templrtcq_uk_join := ' AND 3=3 '; -- Bug 13414358
9332 
9333       l_intf_table_RTCQ := 'SELECT ROW_IDENTIFIER, ATTR_GROUP_ID, '||l_concat_pk_cols;
9334 
9335       IF l_has_data_level_id THEN -- l_has_data_level_id - 3
9336         l_intf_table_RTCQ := l_intf_table_RTCQ ||', DATA_LEVEL_ID ';
9337       END IF;  -- l_has_data_level_id - 3
9338 
9339       IF(l_dl_col_list IS NOT NULL) THEN
9340         l_intf_table_RTCQ := l_intf_table_RTCQ ||','||l_dl_col_list;
9341       END IF;
9342       l_intf_table_RTCQ := l_intf_table_RTCQ||
9343                            ',MAX(TRANSACTION_TYPE) TRANSACTION_TYPE ,MAX(REQUEST_ID) REQUEST_ID '||
9344                            ',MAX(PROGRAM_APPLICATION_ID) PROGRAM_APPLICATION_ID '||
9345                            ',MAX(PROGRAM_ID) PROGRAM_ID, MAX(PROGRAM_UPDATE_DATE) PROGRAM_UPDATE_DATE '||
9346                            ',MAX(CREATED_BY) CREATED_BY,MAX(CREATION_DATE) CREATION_DATE '||
9347                            ',MAX(LAST_UPDATED_BY) LAST_UPDATED_BY, MAX(LAST_UPDATE_DATE) LAST_UPDATE_DATE '||
9348                            ',MAX(LAST_UPDATE_LOGIN) LAST_UPDATE_LOGIN ';
9349       l_uk_tmpl_intf_rtcq_where := ' 2=2 ';
9350 
9351       l_attr_null_chk_decode := ' AND DECODE(TEMPL.ATTRIBUTE_ID,';
9352 code_debug(l_api_name||' Phase 6 ');
9353 code_debug(l_api_name||' l_template_table_RTCQ: '|| l_template_table_RTCQ);
9354 code_debug(l_api_name||' l_intf_table_RTCQ: '|| l_intf_table_RTCQ);
9355 
9356       l_num_val_col := NULL;
9357       ------------------------------------------------------------------------
9358       -- Looping thru all the attrs to build the RTCQ for the template      --
9359       -- table.                                                             --
9360       ------------------------------------------------------------------------
9361       FOR i IN l_attr_metadata_table.FIRST .. l_attr_metadata_table.LAST
9362       LOOP
9363 
9364         l_attr_null_chk_decode := l_attr_null_chk_decode||l_attr_metadata_table(i).ATTR_ID||
9365                                   ', NVL2(INTFRTCQ.'||l_attr_metadata_table(i).ATTR_NAME||',CHR(0),NULL) , ';
9366 
9367         ----------------------------------------------------------------------
9368         -- Add SELECT list attributes that are specific to NUMBER type      --
9369         ----------------------------------------------------------------------
9370 
9371         IF (l_attr_metadata_table(i).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
9372             l_template_table_RTCQ := l_template_table_RTCQ ||
9373                                    ',  MAX(DECODE(TEMPL.ATTRIBUTE_ID '||
9374                                                 ','||TO_CHAR(l_attr_metadata_table(i).ATTR_ID)||
9375                                                 ','||'TEMPL.ATTRIBUTE_NUMBER_VALUE'||
9376                                                 ',NULL)) '||TO_CHAR(l_attr_metadata_table(i).ATTR_NAME);
9377 
9378             l_intf_table_RTCQ := l_intf_table_RTCQ ||
9379                                    ',  MAX(DECODE(INTF.ATTR_INT_NAME '||
9380                                                 ','''||l_attr_metadata_table(i).ATTR_NAME||''' '||
9381                                                 ','||'NVL(INTF.ATTR_VALUE_NUM,'||G_NULL_TOKEN_NUM||') '||
9382                                                 ',NULL)) '||TO_CHAR(l_attr_metadata_table(i).ATTR_NAME);
9383 
9384             -- BUILDING THE UK MATCHING WHERE SEGMENT
9385             IF (l_attr_metadata_table(i).UNIQUE_KEY_FLAG = 'Y' AND l_attr_group_metadata_obj.MULTI_ROW_CODE='Y') THEN
9386               l_uk_tmpl_intf_rtcq_where := l_uk_tmpl_intf_rtcq_where||' AND NVL(TEMPLRTCQ.'||l_attr_metadata_table(i).ATTR_NAME||','||G_NULL_TOKEN_NUM||')'||
9387                                           '= NVL(INTFRTCQ.'||l_attr_metadata_table(i).ATTR_NAME||'(+),'||G_NULL_TOKEN_NUM||' ) ';
9388 
9389               -- Bug 13414358
9390               /*
9391               l_ext_templrtcq_uk_join := l_ext_templrtcq_uk_join||' AND NVL(TEMPLRTCQ.'||l_attr_metadata_table(i).ATTR_NAME||','||G_NULL_TOKEN_NUM||')'||
9392                                           '= NVL(EXT.'||l_attr_metadata_table(i).DATABASE_COLUMN||'(+),'||G_NULL_TOKEN_NUM||')  ';
9393               */
9394             END IF;
9395 
9396             --IF THE ATTRIBUTE HAS A UOM ATTACHED THE VALUE SHOULD BE CONVERTED TO USER ENTERED
9397             --UOM FROM THE BASE UOM BugFix:5704230
9398             IF(l_attr_metadata_table(i).UNIT_OF_MEASURE_CLASS IS NOT NULL) THEN
9399                l_num_val_col := l_num_val_col||', '''||l_attr_metadata_table(i).ATTR_NAME||''' '||
9400                                                   ', ATTR_VALUE_NUM / (SELECT CONVERSION_RATE FROM MTL_UOM_CONVERSIONS '||
9401                                                                         ' WHERE UOM_CLASS = '''||l_attr_metadata_table(i).UNIT_OF_MEASURE_CLASS||''' '||
9402                                                                         '   AND UOM_CODE = NVL(ATTR_VALUE_UOM,'''||l_attr_metadata_table(i).UNIT_OF_MEASURE_BASE||''') '||
9403                                                                         '   AND ROWNUM = 1)';
9404             END IF;
9405 
9406         ----------------------------------------------------------------------
9407         -- Add SELECT list attributes that are specific to DATE TIME type   --
9408         ----------------------------------------------------------------------
9409 
9410         ELSIF (   l_attr_metadata_table(i).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE
9411                OR l_attr_metadata_table(i).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE) THEN
9412             l_template_table_RTCQ := l_template_table_RTCQ ||
9413                                    ',  MAX(DECODE(TEMPL.ATTRIBUTE_ID '||
9414                                                 ','||TO_CHAR(l_attr_metadata_table(i).ATTR_ID)||
9415                                                 ','||'TEMPL.ATTRIBUTE_DATE_VALUE'||
9416                                                 ',NULL)) '||TO_CHAR(l_attr_metadata_table(i).ATTR_NAME);
9417             l_intf_table_RTCQ := l_intf_table_RTCQ ||
9418                                    ',  MAX(DECODE(INTF.ATTR_INT_NAME '||
9419                                                 ','''||l_attr_metadata_table(i).ATTR_NAME||''' '||
9420                                                 ','||'NVL(INTF.ATTR_VALUE_DATE,'||G_NULL_TOKEN_DATE||')'||
9421                                                 ',NULL)) '||TO_CHAR(l_attr_metadata_table(i).ATTR_NAME);
9422 
9423             -- BUILDING THE UK MATCHING WHERE SEGMENT
9424             IF (l_attr_metadata_table(i).UNIQUE_KEY_FLAG = 'Y' AND l_attr_group_metadata_obj.MULTI_ROW_CODE='Y') THEN
9425               l_uk_tmpl_intf_rtcq_where := l_uk_tmpl_intf_rtcq_where||' AND NVL(TEMPLRTCQ.'||l_attr_metadata_table(i).ATTR_NAME||','||G_NULL_TOKEN_DATE||')'||
9426                                           '= NVL(INTFRTCQ.'||l_attr_metadata_table(i).ATTR_NAME||'(+),'||G_NULL_TOKEN_DATE||' ) ';
9427 
9428               -- Bug 13414358
9429               /*
9430               l_ext_templrtcq_uk_join := l_ext_templrtcq_uk_join||' AND NVL(TEMPLRTCQ.'||l_attr_metadata_table(i).ATTR_NAME||','||G_NULL_TOKEN_DATE||')'||
9431                                           '= NVL(EXT.'||l_attr_metadata_table(i).DATABASE_COLUMN||'(+),'||G_NULL_TOKEN_DATE||')  ';
9432               */
9433             END IF;
9434 
9435         ----------------------------------------------------------------------
9436         -- Add SELECT list attributes that are specific to STRING type      --
9437         ----------------------------------------------------------------------
9438 
9439         ELSE
9440             l_template_table_RTCQ := l_template_table_RTCQ ||
9441                                    ',  MAX(DECODE(TEMPL.ATTRIBUTE_ID '||
9442                                                 ','||TO_CHAR(l_attr_metadata_table(i).ATTR_ID)||
9443                                                 ','||'TEMPL.ATTRIBUTE_STRING_VALUE'||
9444                                                 ',NULL)) '||TO_CHAR(l_attr_metadata_table(i).ATTR_NAME);
9445             l_intf_table_RTCQ := l_intf_table_RTCQ ||
9446                                    ',  MAX(DECODE(INTF.ATTR_INT_NAME '||
9447                                                 ','''||l_attr_metadata_table(i).ATTR_NAME||''' '||
9448                                                 ','||'NVL(INTF.ATTR_VALUE_STR,'||G_NULL_TOKEN_STR||')'||
9449                                                 ',NULL)) '||TO_CHAR(l_attr_metadata_table(i).ATTR_NAME);
9450 
9451             -- BUILDING THE UK MATCHING WHERE SEGMENT
9452             IF (l_attr_metadata_table(i).UNIQUE_KEY_FLAG = 'Y' AND l_attr_group_metadata_obj.MULTI_ROW_CODE='Y') THEN
9453               l_uk_tmpl_intf_rtcq_where := l_uk_tmpl_intf_rtcq_where||' AND NVL(TEMPLRTCQ.'||l_attr_metadata_table(i).ATTR_NAME||','||G_NULL_TOKEN_STR||')'||
9454                                           '= NVL(INTFRTCQ.'||l_attr_metadata_table(i).ATTR_NAME||'(+),'||G_NULL_TOKEN_STR||' ) ';
9455 
9456               -- Bug 13414358
9457               /*
9458               l_ext_templrtcq_uk_join := l_ext_templrtcq_uk_join||' AND NVL(TEMPLRTCQ.'||l_attr_metadata_table(i).ATTR_NAME||','||G_NULL_TOKEN_STR||')'||
9459                                           '= NVL(EXT.'||l_attr_metadata_table(i).DATABASE_COLUMN||'(+),'||G_NULL_TOKEN_STR||')  ';
9460               */
9461             END IF;
9462 
9463         END IF;
9464 
9465       ------------------------------------------------------------------------
9466       -- WE DONOT HAVE THE ATTR NAME IN THE TEMPL TABLE SO WE WILL USE THE  --
9467       -- FOLLOWING DECODE IN THE FINAL QUERY TO AVOID JOINING TO            --
9468       -- EGO_ATTRS_V                                                        --
9469       ------------------------------------------------------------------------
9470 
9471       END LOOP;-- Attr loop
9472 code_debug(l_api_name||' Phase 7 After attribute loop ');
9473 code_debug(l_api_name||' l_template_table_RTCQ: '|| l_template_table_RTCQ);
9474 code_debug(l_api_name||' l_intf_table_RTCQ: '|| l_intf_table_RTCQ);
9475 code_debug(l_api_name||' l_uk_tmpl_intf_rtcq_where: '|| l_uk_tmpl_intf_rtcq_where);
9476 -- code_debug(l_api_name||' l_ext_templrtcq_uk_join: '|| l_ext_templrtcq_uk_join); -- Bug 13414358
9477 
9478         IF (l_num_val_col IS NOT NULL) THEN --Bugfix:5704230
9479            l_num_val_col := ' DECODE(ATTR_INT_NAME '||l_num_val_col||', ATTR_VALUE_NUM )';
9480         ELSE
9481            l_num_val_col := ' ATTR_VALUE_NUM';
9482         END IF;
9483 
9484         -- l_ext_templrtcq_join := l_ext_templrtcq_pk_join || l_ext_templrtcq_uk_join; -- Bug 13414358
9485 
9486         ----------------------------------------------------------------------
9487         --                        FROM and WHERE clause                       --
9488         ----------------------------------------------------------------------
9489 
9490         l_template_table_RTCQ := l_template_table_RTCQ ||'  FROM ('||l_template_table_sql||') TEMPL                  '||
9491                                                          ' WHERE TEMPLATE_ID IN ('||l_template_to_process_list||')   '||
9492                                                          '   AND CLASSIFICATION_CODE IN ('||l_cc_to_process_list||') '||
9493                                                          '   AND ATTRIBUTE_GROUP_ID IN ('||l_ag_to_process_list||')  '||
9494                                                          '   AND ENABLED_FLAG = ''Y''                '||
9495                                                          ' GROUP BY CLASSIFICATION_CODE, ATTRIBUTE_GROUP_ID, ROW_NUMBER ';
9496 
9497         l_intf_table_RTCQ := l_intf_table_RTCQ || '  FROM '||p_interface_table_name||' INTF '||
9498                                                   ' WHERE DATA_SET_ID = '||p_data_set_id||' '||
9499                                                  -- '   AND PROCESS_STATUS = '||p_process_status|| /*Commented to fix Bug#8349855*/
9500               ' AND REQUEST_ID = '||p_request_id|| /*Added to fix Bug#8349855*/
9501                                                   '   AND ATTR_GROUP_ID = :ag_id            '||
9502                                                   '   AND ATTR_GROUP_INT_NAME = :ag_name    '||
9503                                                   --'   AND '||l_dl_intfrtcq_trtcq_join||'             '||
9504                                                   'GROUP BY ROW_IDENTIFIER, ATTR_GROUP_ID, '||l_concat_pk_cols;
9505         IF l_has_data_level_id THEN
9506           l_intf_table_RTCQ := l_intf_table_RTCQ ||', DATA_LEVEL_ID';
9507         END IF;
9508         IF l_dl_col_list IS NOT NULL THEN
9509           l_intf_table_RTCQ := l_intf_table_RTCQ ||', '||l_dl_col_list;
9510         END IF;
9511 
9512         l_attr_null_chk_decode := l_attr_null_chk_decode||' chr(0)) IS NULL ';
9513 
9514 code_debug(l_api_name||' Phase 8 Complete queries ');
9515 code_debug(l_api_name||' l_template_table_RTCQ: '|| l_template_table_RTCQ);
9516 code_debug(l_api_name||' l_intf_table_RTCQ: '|| l_intf_table_RTCQ);
9517 -- code_debug(l_api_name||' l_ext_templrtcq_join: '|| l_ext_templrtcq_join); -- Bug 13414358
9518 code_debug(l_api_name||' l_attr_null_chk_decode: '|| l_attr_null_chk_decode);
9519 
9520         l_dynamic_sql :=
9521            ' SELECT MAX(ROW_IDENTIFIER),MAX(TRANSACTION_ID) '||
9522            '   FROM '||p_interface_table_name||
9523            '  WHERE DATA_SET_ID = :data_Set_id ';
9524 
9525         BEGIN
9526            EXECUTE IMMEDIATE l_dynamic_sql
9527            INTO l_max_row_identifier,l_max_trans_id
9528            USING p_data_set_id;
9529         EXCEPTION
9530            WHEN NO_DATA_FOUND THEN
9531                l_max_row_identifier := 0;
9532                l_max_trans_id := 0;
9533         END;
9534 
9535         IF(l_max_row_identifier IS NULL) THEN
9536           l_max_row_identifier := 0;
9537         END IF;
9538 
9539         IF(l_max_trans_id IS NULL) THEN
9540           l_max_trans_id := 0;
9541         END IF;
9542 
9543         l_max_trans_id := l_max_trans_id +1;
9544         l_max_row_identifier := l_max_row_identifier + 1;
9545 
9546         ----------------------------------------------------------------------
9547         -- Find out weather the ATTR_GROUP_ID column exists in the EXT      --
9548         -- table or not                                                     --
9549         ----------------------------------------------------------------------
9550         BEGIN
9551           l_dynamic_sql := ' SELECT ATTR_GROUP_ID FROM '||l_ext_vl_name||' WHERE ROWNUM=1 ';
9552           EXECUTE IMMEDIATE l_dynamic_sql;
9553           l_ag_id_col_exists := TRUE;
9554         EXCEPTION
9555           WHEN OTHERS THEN
9556             l_ag_id_col_exists := FALSE;
9557         END;
9558 
9559         -- Bug 13414358 : Start
9560         /*
9561         IF(l_ag_id_col_exists) THEN
9562            l_ag_id_clause :='  AND EXT.ATTR_GROUP_ID(+) = TEMPLRTCQ.ATTRIBUTE_GROUP_ID ';
9563         ELSE
9564            l_ag_id_clause :='  AND 1=1 ';
9565         END IF;
9566         */
9567         -- Bug 13414358 : End
9568 
9569         l_rows_to_insert_sql :=
9570               'SELECT (TRANSACTION_ID+'||l_max_trans_id||') TRANSACTION_ID,PROCESS_STATUS,DATA_SET_ID ,ROW_IDENTIFIER, '||
9571                     ' ATTR_GROUP_INT_NAME,  ATTR_INT_NAME, ATTR_VALUE_STR,'||l_num_val_col||', ATTR_VALUE_UOM, ATTR_VALUE_DATE, '||
9572                     ' ATTR_DISP_VALUE, TRANSACTION_TYPE, ATTR_GROUP_ID, REQUEST_ID, PROGRAM_APPLICATION_ID, PROGRAM_ID, '||
9573                     ' PROGRAM_UPDATE_DATE,CREATED_BY, CREATION_DATE, LAST_UPDATED_BY, LAST_UPDATE_DATE, '||
9574                     ' LAST_UPDATE_LOGIN,  '||l_concat_pk_cols||', ATTR_GROUP_TYPE ';
9575 
9576         IF l_has_data_level_id THEN
9577           l_rows_to_insert_sql := l_rows_to_insert_sql ||', DATA_LEVEL_ID ';
9578         END IF;
9579 
9580         IF(l_dl_col_list IS NOT NULL) THEN
9581           l_rows_to_insert_sql := l_rows_to_insert_sql ||','||l_dl_col_list;
9582         END IF;
9583 
9584         l_rows_to_insert_sql := l_rows_to_insert_sql||
9585               ' FROM '||
9586               '(SELECT ROWNUM TRANSACTION_ID, '||
9587                    p_process_status||' PROCESS_STATUS, '||
9588                    p_data_set_id||' DATA_SET_ID, '||
9589                    ' NVL(INTFRTCQ.ROW_IDENTIFIER,'||l_max_row_identifier||'+TEMPLRTCQ.ENTITY_ROWID) ROW_IDENTIFIER, '||
9590                    ''''||l_attr_group_metadata_obj.ATTR_GROUP_NAME||'''  ATTR_GROUP_INT_NAME, '||
9591                    ' ATTRSV.ATTR_NAME ATTR_INT_NAME, '||
9592                    ' NVL(TEMPL.ATTRIBUTE_STRING_VALUE,TEMPL.ATTRIBUTE_TRANSLATED_VALUE) ATTR_VALUE_STR , '||
9593                    ' TEMPL.ATTRIBUTE_NUMBER_VALUE ATTR_VALUE_NUM , '||
9594                    ' TEMPL.ATTRIBUTE_UOM_CODE ATTR_VALUE_UOM , '||
9595                    ' TEMPL.ATTRIBUTE_DATE_VALUE ATTR_VALUE_DATE , '||
9596                    ' NULL ATTR_DISP_VALUE, '||
9597                    -- Bug 13414358 : Start
9598                    /* Instead of inserting transaction type as CREATE/UPDATE insert as SYNC directly, so that the later part of the
9599                       code will take care of resolving the TRANSACTION type. */
9600                    -- ' NVL(INTFRTCQ.TRANSACTION_TYPE,NVL2(EXT.EXTENSION_ID,''UPDATE'',''CREATE'')) TRANSACTION_TYPE, ';
9601                    ' NVL(INTFRTCQ.TRANSACTION_TYPE,'''||EGO_USER_ATTRS_DATA_PVT.G_SYNC_MODE||''') TRANSACTION_TYPE, ';
9602                    -- Bug 13414358 : End
9603         IF l_has_data_level_id THEN
9604           l_rows_to_insert_sql := l_rows_to_insert_sql ||' TEMPLRTCQ.DATA_LEVEL_ID, ';
9605           IF l_dl_col_templrtcq_list IS NOT NULL THEN
9606             l_rows_to_insert_sql := l_rows_to_insert_sql ||l_dl_col_templrtcq_list||', ';
9607           END IF;
9608         ELSE
9609           IF(l_dl_col_decode_list IS NOT NULL)THEN   --the data level joins bugfix:5401212
9610             l_rows_to_insert_sql := l_rows_to_insert_sql||l_dl_col_decode_list||', ';
9611           END IF;
9612         END IF;
9613 
9614         l_rows_to_insert_sql := l_rows_to_insert_sql||
9615                    l_attr_group_metadata_obj.ATTR_GROUP_ID||' ATTR_GROUP_ID, '||
9616                    p_request_id||' REQUEST_ID, '||
9617                    p_program_application_id||' PROGRAM_APPLICATION_ID, '||
9618                    p_program_id||' PROGRAM_ID, '||
9619                    'SYSDATE  PROGRAM_UPDATE_DATE, '||
9620                    p_current_user_party_id||' CREATED_BY, '||
9621                    'SYSDATE CREATION_DATE, '||
9622                    p_current_user_party_id||' LAST_UPDATED_BY, '||
9623                    'SYSDATE LAST_UPDATE_DATE, '||
9624                    p_current_user_party_id||'  LAST_UPDATE_LOGIN, '||
9625                    l_concat_pk_cols_entities||' '||
9626                    ''''||p_attr_group_type||'''  ATTR_GROUP_TYPE '||
9627               ' FROM ('||l_intf_table_RTCQ||') INTFRTCQ, '||
9628                   '   ('||l_template_table_sql||')        TEMPL, '||
9629                   '   EGO_ATTRS_V                 ATTRSV, '||
9630                   ' (SELECT ROWNUM ENTITY_ROWID, TEMPLRTCQ.* FROM  '||
9631                   ' (SELECT * FROM ('||p_target_entity_sql||')   ENTITIES, '||
9632                   '                ('||l_template_table_RTCQ||')   TEMPLRTCQ '||
9633                   '   WHERE TEMPLRTCQ.TEMPLATE_ID1 = ENTITIES.TEMPLATE_ID '||
9634                   '     AND TEMPLRTCQ.CLASSIFICATION_CODE1 = ENTITIES.'||l_class_code_column_name  ||
9635                   -- Bug 13414358 : Start
9636                   /* Removing the join to the view l_ext_vl_name, as we do not need to resolve the transaction type at this point. */
9637                   --' ) TEMPLRTCQ) TEMPLRTCQ, '||
9638                   --' '||l_ext_vl_name||' EXT '||
9639                   ' ) TEMPLRTCQ) TEMPLRTCQ '||
9640                   -- Bug 13414358 : Start
9641               'WHERE 1 = 1 '||
9642               -- l_ag_id_clause||' '|| -- Bug 13414358
9643               '  AND '||l_dl_ext_trtcq_join||' AND '||l_dl_intfrtcq_trtcq_join||--the data level joins bugfix:5401212
9644               -- ' AND '|| -- Bug 13414358
9645               -- l_ext_templrtcq_join||' '|| -- Bug 13414358
9646               ' AND TEMPL.ATTRIBUTE_GROUP_ID = '||l_attr_group_metadata_obj.ATTR_GROUP_ID||' '||
9647               ' AND TEMPL.CLASSIFICATION_CODE = TEMPLRTCQ.'||l_class_code_column_name||' '||
9648               ' AND TEMPL.TEMPLATE_ID = TEMPLRTCQ.TEMPLATE_ID '||
9649               ' AND TEMPL.ATTRIBUTE_GROUP_ID = TEMPLRTCQ.ATTRIBUTE_GROUP_ID '||
9650               ' AND TEMPL.ENABLED_FLAG = ''Y'' '||
9651               ' AND TEMPL.ROW_NUMBER = TEMPLRTCQ.ROW_NUMBER '||
9652               ' AND TEMPLRTCQ.'||l_class_code_column_name||'= INTFRTCQ.'||l_class_code_column_name||'(+)'||
9653                 ' '||l_pk_col_where_ent_uartcq||' '||
9654               ' AND '||l_uk_tmpl_intf_rtcq_where||' '||--for unique key joi in intf and templ
9655               ' AND ATTRSV.ATTR_ID = TEMPL.ATTRIBUTE_ID '||
9656               l_attr_null_chk_decode||' ';
9657         IF l_has_data_level_id THEN
9658           l_rows_to_insert_sql := l_rows_to_insert_sql ||' AND EXISTS (SELECT 1 FROM ego_attr_group_dl WHERE attr_group_id = :ag_id2 AND data_level_id = TEMPLRTCQ.data_level_id) ';
9659         END IF;
9660         l_rows_to_insert_sql := l_rows_to_insert_sql || ')';
9661 
9662         IF l_has_data_level_id THEN
9663           l_temp := ', DATA_LEVEL_ID ';
9664         ELSE
9665           l_temp := ' ';
9666         END IF;
9667         IF(l_dl_col_list IS NOT NULL) THEN
9668           l_temp := l_temp||','||l_dl_col_list;
9669         END IF;
9670 
9671         ----------------------------------------------------------------------
9672         -- Build the INSERT statement to insert the attribute values into   --
9673         -- the interface table                                              --
9674         ----------------------------------------------------------------------
9675 
9676         l_rows_to_insert_sql := ' INSERT INTO '||p_interface_table_name||' ( '||
9677               ' TRANSACTION_ID,PROCESS_STATUS,DATA_SET_ID ,ROW_IDENTIFIER,ATTR_GROUP_INT_NAME, '||
9678               ' ATTR_INT_NAME, ATTR_VALUE_STR,ATTR_VALUE_NUM,ATTR_VALUE_UOM,ATTR_VALUE_DATE, '||
9679               ' ATTR_DISP_VALUE, TRANSACTION_TYPE, ATTR_GROUP_ID, REQUEST_ID, PROGRAM_APPLICATION_ID, PROGRAM_ID, '||
9680               ' PROGRAM_UPDATE_DATE,CREATED_BY, CREATION_DATE, LAST_UPDATED_BY, LAST_UPDATE_DATE, '||
9681               ' LAST_UPDATE_LOGIN,  '||l_concat_pk_cols||', ATTR_GROUP_TYPE  '||l_temp||' ) '||
9682               l_rows_to_insert_sql;
9683 
9684 code_debug(l_api_name||' Phase 8 SQL to insert ');
9685 code_debug(l_api_name||'  '|| l_rows_to_insert_sql);
9686 
9687               ----------------------------------------------------------------
9688               -- Finally, execute the query to insert the attribute values  --
9689               -- into the interface table.                                  --
9690               ----------------------------------------------------------------
9691               IF l_has_data_level_id THEN
9692 code_debug(l_api_name||' binds:  ATTR_GROUP_ID: '||l_attr_group_metadata_obj.ATTR_GROUP_ID||' ATTR_GROUP_NAME: '||l_attr_group_metadata_obj.ATTR_GROUP_NAME||' ATTR_GROUP_ID2 '||l_attr_group_metadata_obj.ATTR_GROUP_ID);
9693                 EXECUTE IMMEDIATE l_rows_to_insert_sql
9694                 USING l_attr_group_metadata_obj.ATTR_GROUP_ID,
9695                       l_attr_group_metadata_obj.ATTR_GROUP_NAME,
9696                       l_attr_group_metadata_obj.ATTR_GROUP_ID;
9697               ELSE
9698 code_debug(l_api_name||' binds:  ATTR_GROUP_ID: '||l_attr_group_metadata_obj.ATTR_GROUP_ID||' ATTR_GROUP_NAME: '||l_attr_group_metadata_obj.ATTR_GROUP_NAME);
9699                 EXECUTE IMMEDIATE l_rows_to_insert_sql
9700                 USING l_attr_group_metadata_obj.ATTR_GROUP_ID,
9701                       l_attr_group_metadata_obj.ATTR_GROUP_NAME;
9702               END IF;
9703     END LOOP;
9704  END IF;
9705  x_return_status := FND_API.G_RET_STS_SUCCESS;
9706  code_debug(l_api_name||' Done ',0);
9707 
9708  EXCEPTION
9709   WHEN G_NO_ROWS_IN_INTF_TABLE THEN
9710     code_debug(l_api_name||' Exception: '||SQLERRM,0);
9711   WHEN OTHERS THEN
9712     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9713     x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' - '||SQLERRM;
9714 
9715 END Apply_Template_On_Intf_Table;
9716 
9717 ------------------------------------------------------------------
9718 
9719 FUNCTION Get_Datatype_Error_Val (
9720         p_value_to_convert             IN   VARCHAR2
9721        ,p_datatype                     IN   VARCHAR2
9722 ) RETURN NUMBER
9723 IS
9724      l_num_value                       NUMBER;
9725      l_date_value                      DATE;
9726      l_error_code                      NUMBER;
9727      l_dynamic_sql                     VARCHAR2(200);
9728      l_formated_String                 VARCHAR2(500);
9729 BEGIN
9730 
9731     IF (p_datatype =  EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE ) THEN
9732       l_error_code := G_PS_INVALID_DATE_DATA ;
9733       IF (INSTR(p_value_to_convert,'$SYSDATE$') > 0 ) THEN
9734         l_formated_string := TRIM(REPLACE(p_value_to_convert, '$'));
9735         l_dynamic_sql := 'SELECT TO_CHAR('||l_formated_string||', '''||
9736                        EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT||''') FROM DUAL';
9737         EXECUTE IMMEDIATE l_dynamic_sql INTO l_formated_string;
9738         l_date_value := TO_DATE(l_formated_string,EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT);
9739       ELSE
9740         l_date_value := TO_DATE(p_value_to_convert, EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT);
9741       END IF;
9742 
9743     ELSIF (p_datatype = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE) THEN
9744       l_error_code := G_PS_INVALID_DATE_TIME_DATA ;
9745       IF (INSTR(p_value_to_convert,'$SYSDATE$') > 0 ) THEN
9746         l_formated_string := TRIM(REPLACE(p_value_to_convert, '$'));
9747         l_dynamic_sql := 'SELECT TO_CHAR('||l_formated_string||', '''||
9748                        EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT||''') FROM DUAL';
9749         EXECUTE IMMEDIATE l_dynamic_sql INTO l_formated_string;
9750         l_date_value := TO_DATE(l_formated_string,EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT);
9751       ELSE
9752         l_date_value := TO_DATE(p_value_to_convert,EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT);
9753       END IF;
9754 
9755     ELSIF (p_datatype =  EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
9756       l_error_code := G_PS_INVALID_NUMBER_DATA ;
9757       l_num_value := TO_NUMBER(p_value_to_convert);
9758     END IF;
9759 
9760     RETURN 0;
9761 
9762 EXCEPTION
9763   WHEN OTHERS THEN
9764        RETURN l_error_code;
9765 
9766 END Get_Datatype_Error_Val;
9767 
9768 ---------------------------------------------------------------------
9769 
9770 FUNCTION Get_Date (
9771   p_date                      IN   VARCHAR2
9772  ,p_format                    IN   VARCHAR2 DEFAULT NULL
9773 ) RETURN DATE
9774 IS
9775      l_date                           DATE;
9776      l_dynamic_sql                    VARCHAR2(200);
9777      l_formated_string                VARCHAR2(500);
9778 BEGIN
9779 
9780     IF (INSTR(UPPER(p_date),'$SYSDATE$') > 0 ) THEN
9781       l_formated_string := TRIM(REPLACE(p_date, '$'));
9782       l_dynamic_sql := 'SELECT TO_CHAR('||l_formated_string||', '''||
9783                      'YYYY-MM-DD HH24:MI:SS'||''') FROM DUAL';
9784       EXECUTE IMMEDIATE l_dynamic_sql INTO l_formated_string;
9785       l_date := TO_DATE(l_formated_string,EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT);
9786       RETURN l_date;
9787     ELSE
9788       IF (p_format IS NOT NULL ) THEN
9789         l_date := TO_DATE(p_date, p_format);
9790       ELSE
9791         l_date := TO_DATE(p_date,EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT);
9792       END IF;
9793       RETURN l_date;
9794     END IF;
9795     RETURN l_date;
9796 
9797 EXCEPTION
9798   WHEN OTHERS THEN
9799        RETURN NULL;
9800 END Get_Date;
9801 
9802 -------------------------------------------------------------------
9803 
9804 ---------------------------------------------------------------------
9805 --NOTE: the function would return a 0 even if the conversion to
9806 --      appropriate datatype throws an exception.
9807 ---------------------------------------------------------------------
9808 
9809 FUNCTION Get_Max_Min_Error_Val (
9810         p_value_to_check               IN   VARCHAR2
9811        ,p_datatype                     IN   VARCHAR2
9812        ,p_min_value                    IN   VARCHAR2
9813        ,p_max_value                    IN   VARCHAR2
9814 ) RETURN NUMBER
9815 IS
9816      l_num_value                       NUMBER;
9817      l_date_value                      DATE;
9818      l_error_code                      NUMBER;
9819      l_max_date                        DATE;
9820      l_min_date                        DATE;
9821      l_index_min                       NUMBER;
9822      l_index_max                       NUMBER;
9823      l_dynamic_sql                     VARCHAR2(200);
9824      l_formated_string                 VARCHAR2(500);
9825 BEGIN
9826 /*
9827    the conversion of max min date fails since the format they are in is 2004-07-01 00:00:00.0
9828    this is the format in which the date string we get from the Value set, since this format
9829    for date is not supported in 8i I
9830 */
9831     IF (p_datatype =  EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE OR  p_datatype = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE) THEN
9832 
9833       IF (INSTR(p_value_to_check,'$SYSDATE$') > 0 ) THEN
9834         l_formated_string := TRIM(REPLACE(p_value_to_check, '$'));
9835         l_dynamic_sql := 'SELECT TO_CHAR('||l_formated_string||', '''||
9836                          EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT||''') FROM DUAL';--'SYYYY-MM-DD HH24:MI:SS'
9837         EXECUTE IMMEDIATE l_dynamic_sql INTO l_formated_string;
9838         l_date_value := TO_DATE(l_formated_string,EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT);--'SYYYY-MM-DD HH24:MI:SS'
9839       ELSE
9840         l_date_value := TO_DATE(p_value_to_check,EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT);
9841       END IF;
9842 
9843       IF (INSTR(p_max_value,'$SYSDATE$') > 0 ) THEN
9844         l_formated_string := TRIM(REPLACE(p_max_value, '$'));
9845         l_dynamic_sql := 'SELECT TO_CHAR('||l_formated_string||', '''||
9846                          EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT||''') FROM DUAL';--'SYYYY-MM-DD HH24:MI:SS'
9847         EXECUTE IMMEDIATE l_dynamic_sql INTO l_formated_string;
9848         l_max_date := TO_DATE(l_formated_string,EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT);--'YYYY-MM-DD HH24:MI:SS'
9849       ELSE
9850         l_index_max := INSTR(p_max_value,'.');
9851         IF ( l_index_max = 0 ) THEN
9852           l_max_date := TO_DATE(p_max_value,EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT);--'SYYYY-MM-DD HH24:MI:SS'
9853         ELSE
9854           l_max_date := TO_DATE(SUBSTR(p_max_value,1,l_index_max-1),EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT);--'SYYYY-MM-DD HH24:MI:SS'
9855         END IF;
9856      END IF;
9857 
9858 
9859       IF (INSTR(p_min_value,'$SYSDATE$') > 0 ) THEN
9860         l_formated_string := TRIM(REPLACE(p_min_value, '$'));
9861         l_dynamic_sql := 'SELECT TO_CHAR('||l_formated_string||', '''||
9862                          EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT||''') FROM DUAL';
9863         EXECUTE IMMEDIATE l_dynamic_sql INTO l_formated_string;
9864         l_min_date := TO_DATE(l_formated_string,EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT);
9865       ELSE
9866         l_index_min := INSTR(p_min_value,'.');
9867         IF (l_index_min = 0) THEN
9868           l_min_date := TO_DATE(p_min_value,EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT);
9869         ELSE
9870           l_min_date := TO_DATE(SUBSTR(p_min_value,1,l_index_min-1),EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT);
9871         END IF;
9872       END IF;
9873 
9874       IF (l_date_value > NVL(l_max_date, l_date_value) ) THEN
9875         RETURN G_PS_MAX_VAL_VIOLATION;
9876       END IF;
9877 
9878       IF ( l_date_value < NVL(l_min_date, l_date_value) ) THEN
9879         RETURN G_PS_MIN_VAL_VIOLATION;
9880       END IF;
9881 
9882     ELSIF (p_datatype =  EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE ) THEN
9883       l_num_value := TO_NUMBER(p_value_to_check);
9884 
9885       IF (l_num_value > NVL(TO_NUMBER(p_max_value), l_num_value) ) THEN
9886         IF p_min_value IS NULL THEN
9887           RETURN G_PS_MAX_VAL_VIOLATION;
9888         ELSE
9889           RETURN G_PS_VAL_RANGE_VIOLATION;
9890         END IF;
9891       END IF;
9892 
9893       IF (l_num_value < NVL(TO_NUMBER(p_min_value), l_num_value) ) THEN
9894         IF p_max_value IS NULL THEN
9895           RETURN G_PS_MIN_VAL_VIOLATION;
9896         ELSE
9897           RETURN G_PS_VAL_RANGE_VIOLATION;
9898         END IF;
9899       END IF;
9900 
9901     END IF;
9902 
9903     RETURN 0;
9904 
9905 EXCEPTION
9906   WHEN OTHERS THEN
9907        RETURN 0;
9908 END Get_Max_Min_Error_Val;
9909 
9910 
9911 -------------------------------------------------------------------------------------------------------
9912 --API Name    : Insert_Default_Val_Rows
9913 --Description : This API would insert rows with default values for attributes in attribute
9914 --              groups not present in the interface table. Here only single row attr groups
9915 --              with no required attrs are processed.
9916 
9917 --parameters :  p_api_version       : Api version
9918 --parameters :  p_application_id    : Application Id
9919 --parameters :  p_attr_group_type   : The type of attr groups to be processed for the given
9920 --                                     data set id.
9921 --parameters :  p_object_name       : Object name.
9922 --parameters :  p_interface_table_name : Interface table name for the UDA.
9923 --parameters :  p_data_set_id       : Data set to be processed.
9924 --parameters :  p_target_entity_sql : This SQL should return all the entities to be processed,
9925 --                                     it should give the pk's, class code and data level of
9926 --                                     the entity. Sample SQL:
9927 --                                     'SELECT INVENTORY_ITEM_ID,
9928 --                                             ORGANIZATION_ID,
9929 --                                             ITEM_CATALOG_GROUP_ID,
9930 --                                             DATA_LEVEL_ID,
9931 --                                             PK1_VALUE,
9932 --                                             PK2_VALUE,
9933 --                                             REVISION_ID
9934 --                                             FROM MTL_SYSTEM_ITEMS_INTERFACE
9935 --                                            WHERE SET_PROCESS_ID = 2910
9936 --                                              AND PROCESS_FLAG = 7'
9937 
9938 --parameters :  p_additional_class_Code_query : This sQL should return all the classification
9939 --                                     codes for which attr group associations are to be
9940 --                                     considered, for example this can give all the parent
9941 --                                     class codes for an entity. Sampl SQL:
9942 --                                     SELECT CHILD_CATALOG_GROUP_ID
9943 --                                       FROM EGO_ITEM_CAT_DENORM_HIER
9944 --                                      WHERE PARENT_CATALOG_GROUP_ID = ENTITY.ITEM_CATALOG_GROUP_ID
9945 --parameters :  p_commit            : Should the changes made be commited in the API
9946 ------------------------------------------------------------------------------------------
9947 
9948 
9949 PROCEDURE Insert_Default_Val_Rows (
9950          p_api_version                   IN   NUMBER
9951         ,p_application_id                IN   NUMBER
9952         ,p_attr_group_type               IN   VARCHAR2
9953         ,p_object_name                   IN   VARCHAR2
9954         ,p_interface_table_name          IN   VARCHAR2
9955         ,p_data_set_id                   IN   NUMBER
9956         ,p_target_entity_sql             IN   VARCHAR2
9957         ,p_attr_groups_to_exclude        IN   VARCHAR2   DEFAULT NULL
9958         ,p_additional_class_Code_query   IN   VARCHAR2   DEFAULT NULL
9959         ,p_extra_column_names            IN   VARCHAr2   DEFAULT NULL
9960         ,p_extra_column_values           IN   VARCHAR2   DEFAULT NULL
9961         ,p_commit                        IN   VARCHAR2   DEFAULT FND_API.G_FALSE
9962         ,p_process_status                IN   NUMBER    DEFAULT G_PS_IN_PROCESS
9963         /* Begin Bug 13729672 */
9964         ,p_comp_seq_id                   IN   NUMBER DEFAULT NULL
9965         ,p_bill_seq_id                   IN   NUMBER DEFAULT NULL
9966         ,p_structure_type_id             IN   NUMBER DEFAULT NULL
9967         ,p_data_level_column             IN   VARCHAR2 DEFAULT NULL
9968         ,p_datalevel_id                  IN   NUMBER DEFAULT NULL
9969         ,p_context_id                    IN   NUMBER DEFAULT NULL
9970         ,p_transaction_id                IN   NUMBER DEFAULT NULL
9971         /* End Bug 13729672 */
9972         ,x_return_status                 OUT NOCOPY VARCHAR2
9973         ,x_msg_data                      OUT NOCOPY VARCHAR2
9974                                   )
9975 IS
9976 
9977     l_api_name                          VARCHAR2(30)  := 'Insert_Default_Val_Rows';
9978     l_pk1_column_name                   VARCHAR2(30);
9979     l_pk2_column_name                   VARCHAR2(30);
9980     l_pk3_column_name                   VARCHAR2(30);
9981     l_pk4_column_name                   VARCHAR2(30);
9982     l_pk5_column_name                   VARCHAR2(30);
9983     l_pk1_column_type                   VARCHAR2(8);
9984     l_pk2_column_type                   VARCHAR2(8);
9985     l_pk3_column_type                   VARCHAR2(8);
9986     l_pk4_column_type                   VARCHAR2(8);
9987     l_pk5_column_type                   VARCHAR2(8);
9988 
9989     l_num_data_level_columns            NUMBER := 0;
9990     l_max_row_id                        NUMBER := 0;
9991 
9992     l_data_level_none                   VARCHAR2(30);
9993     l_data_level_column_1               VARCHAR2(150);
9994     l_data_level_column_2               VARCHAR2(150);
9995     l_data_level_column_3               VARCHAR2(150);
9996 
9997     l_class_code_column_name            VARCHAR2(30);
9998     l_dynamic_sql                       VARCHAR2(10000);
9999     l_object_id                         NUMBER;
10000 
10001     l_ag_presence_chk_sql               VARCHAR2(5000);
10002     l_additional_class_Code_query       VARCHAR2(1000);
10003     l_all_dl_cols                       VARCHAR2(500);
10004     l_pk_cc_select_list                 VARCHAR2(500);
10005     l_pk_cc_dl_col_list                 VARCHAR2(300);
10006     l_inner_pk_cc_dl_col_list           VARCHAR2(400);
10007     l_col_to_insert_list                VARCHAR2(800);
10008     l_attr_groups_to_exclude            VARCHAR2(2000);
10009 
10010     l_has_data_level_id    BOOLEAN := FALSE;
10011     l_dummy_number         NUMBER;
10012     l_ext_b_table_name     VARCHAR2(100);
10013     wierd_constant                      VARCHAR2(100);
10014     l_list_of_dl_for_ag_type      EGO_DATA_LEVEL_METADATA_TABLE;
10015 
10016 
10017     CURSOR data_level_cols_cursor (cp_application_id  IN NUMBER
10018                                   ,cp_attr_group_type IN VARCHAR2)
10019     IS
10020     SELECT data_level_id
10021           ,data_level_name
10022           ,pk1_column_name
10023           ,pk1_column_type
10024           ,pk2_column_name
10025           ,pk2_column_type
10026           ,pk3_column_name
10027           ,pk3_column_type
10028           ,pk4_column_name
10029           ,pk4_column_type
10030           ,pk5_column_name
10031           ,pk5_column_type
10032       FROM EGO_DATA_LEVEL_B
10033      WHERE application_id  = cp_application_id
10034        AND attr_group_type = cp_attr_group_type
10035   ORDER BY data_level_id;
10036 
10037   -- Fix for bug#9336604
10038   l_schema             VARCHAR2(30);
10039   l_status             VARCHAR2(1);
10040   l_industry           VARCHAR2(1);
10041 
10042 BEGIN
10043 
10044   code_debug (l_api_name ||' Started with params ');
10045   code_debug (l_api_name ||' p_attr_group_type               '||p_attr_group_type             );
10046   code_debug (l_api_name ||' p_object_name                   '||p_object_name                 );
10047   code_debug (l_api_name ||' p_interface_table_name          '||p_interface_table_name        );
10048   code_debug (l_api_name ||' p_data_set_id                   '||p_data_set_id                 );
10049   code_debug (l_api_name ||' p_target_entity_sql             '||p_target_entity_sql           );
10050   code_debug (l_api_name ||' p_attr_groups_to_exclude        '||p_attr_groups_to_exclude      );
10051   code_debug (l_api_name ||' p_additional_class_Code_query   '||p_additional_class_Code_query );
10052   code_debug (l_api_name ||' p_extra_column_names            '||p_extra_column_names          );
10053   code_debug (l_api_name ||' p_extra_column_values           '||p_extra_column_values         );
10054 
10055   l_dynamic_sql := ' SELECT count(*) FROM ( '||p_target_entity_sql||') ';
10056   /*Bug 13729672*/
10057   IF p_datalevel_id IS NULL THEN
10058     EXECUTE IMMEDIATE l_dynamic_sql INTO l_dummy_number;
10059   ELSE
10060     EXECUTE IMMEDIATE l_dynamic_sql INTO l_dummy_number
10061     USING p_comp_seq_id,
10062       p_bill_seq_id,
10063       p_structure_type_id,
10064       p_data_level_column,
10065       p_datalevel_id,
10066       p_context_id,
10067       p_transaction_id;
10068   END IF;
10069 
10070   code_debug (l_api_name ||' no records to be processed '||l_dummy_number);
10071   IF l_dummy_number = 0 THEN
10072     code_debug (l_api_name ||' returning as there are no records to process ');
10073     x_return_status := FND_API.G_RET_STS_SUCCESS;
10074     RETURN;
10075   END IF;
10076 
10077   -----------------------------------------
10078   -- Fetch the PK column names and data  --
10079   -- types for the passed-in object name --
10080   -----------------------------------------
10081   SELECT pk1_column_name, pk1_column_type,
10082          pk2_column_name, pk2_column_type,
10083          pk3_column_name, pk3_column_type,
10084          pk4_column_name, pk4_column_type,
10085          pk5_column_name, pk5_column_type
10086     INTO l_pk1_column_name, l_pk1_column_type,
10087          l_pk2_column_name, l_pk2_column_type,
10088          l_pk3_column_name, l_pk3_column_type,
10089          l_pk4_column_name, l_pk4_column_type,
10090          l_pk5_column_name, l_pk5_column_type
10091     FROM FND_OBJECTS
10092    WHERE OBJ_NAME = p_object_name;
10093 
10094   SELECT application_table_name
10095     INTO l_ext_b_table_name
10096     FROM FND_DESCRIPTIVE_FLEXS
10097    WHERE application_id = p_application_id
10098      AND descriptive_flexfield_name = p_attr_group_type;
10099 
10100   l_has_data_level_id := FND_API.TO_BOOLEAN(
10101                EGO_USER_ATTRS_COMMON_PVT.has_column_in_table(
10102                                 p_table_name  => l_ext_b_table_name
10103                                ,p_column_name => 'DATA_LEVEL_ID'
10104                                                             )
10105                                            );
10106   IF l_has_data_level_id THEN
10107     code_debug (l_api_name ||' data level id IS present ');
10108   ELSE
10109     code_debug (l_api_name ||' data level id is NOT present ');
10110   END IF;
10111   ------------------------------------------------------------
10112   -- Geting the classification code for the given object    --
10113   ------------------------------------------------------------
10114 
10115   SELECT CLASSIFICATION_COL_NAME
10116     INTO l_class_code_column_name
10117     FROM EGO_FND_OBJECTS_EXT
10118    WHERE OBJECT_NAME = p_object_name;
10119 
10120   ----------------------------------------------------------
10121   -- Building the SQL                                     --
10122   ----------------------------------------------------------
10123 
10124   l_pk_cc_select_list := ' , ENTITYAG_TBL.'|| l_class_code_column_name;
10125   l_pk_cc_dl_col_list := ' , '||l_class_code_column_name;
10126   l_inner_pk_cc_dl_col_list := ' , ENTITY.'||l_class_code_column_name;
10127     /*Added Hint to improve performance for bug 8598093,9660659  -Added space*/
10128    l_ag_presence_chk_sql := ' SELECT /*+ index(uai EGO_ITM_USR_ATTR_INTRFC_N2  ) */ 1 FROM '||p_interface_table_name||'  UAI                        '||
10129                            ' WHERE NVL(UAI.ATTR_GROUP_ID,ATTR_GROUP_TBL.ATTR_GROUP_ID) = ATTR_GROUP_TBL.ATTR_GROUP_ID'||
10130                            '   AND NVL(UAI.ATTR_GROUP_TYPE,ATTR_GROUP_TBL.DESCRIPTIVE_FLEXFIELD_NAME) = ATTR_GROUP_TBL.DESCRIPTIVE_FLEXFIELD_NAME'||
10131                              ' AND UAI.DATA_SET_ID = :data_set_id '||
10132                              ' AND UAI.ATTR_GROUP_INT_NAME = ATTR_GROUP_TBL.DESCRIPTIVE_FLEX_CONTEXT_CODE ';
10133 code_debug(l_api_name ||' phase 1 ');
10134 code_debug(l_api_name ||' l_pk_cc_select_list '||l_pk_cc_select_list);
10135 code_debug(l_api_name ||' l_pk_cc_dl_col_list '|| l_pk_cc_dl_col_list );
10136 code_debug(l_api_name ||' l_inner_pk_cc_dl_col_list '|| l_inner_pk_cc_dl_col_list );
10137 code_debug(l_api_name ||' l_ag_presence_chk_sql '|| l_ag_presence_chk_sql );
10138 
10139   IF (l_pk1_column_name IS NOT NULL) THEN
10140      l_ag_presence_chk_sql := l_ag_presence_chk_sql || ' AND  UAI.'||l_pk1_column_name||' = ENTITY.'||l_pk1_column_name;
10141      l_pk_cc_select_list := l_pk_cc_select_list || ',ENTITYAG_TBL.'||l_pk1_column_name;
10142      l_pk_cc_dl_col_list := l_pk_cc_dl_col_list || ',' || l_pk1_column_name;
10143      l_inner_pk_cc_dl_col_list := l_inner_pk_cc_dl_col_list || ', ENTITY.'||l_pk1_column_name;
10144   END IF;
10145   IF (l_pk2_column_name IS NOT NULL) THEN
10146      l_ag_presence_chk_sql := l_ag_presence_chk_sql || ' AND  UAI.'||l_pk2_column_name||' = ENTITY.'||l_pk2_column_name;
10147      l_pk_cc_select_list := l_pk_cc_select_list || ',ENTITYAG_TBL.'||l_pk2_column_name;
10148      l_pk_cc_dl_col_list := l_pk_cc_dl_col_list || ',' || l_pk2_column_name;
10149      l_inner_pk_cc_dl_col_list := l_inner_pk_cc_dl_col_list || ', ENTITY.'||l_pk2_column_name;
10150   END IF;
10151   IF (l_pk3_column_name IS NOT NULL) THEN
10152      l_ag_presence_chk_sql := l_ag_presence_chk_sql || ' AND  UAI.'||l_pk3_column_name||' = ENTITY.'||l_pk3_column_name;
10153      l_pk_cc_select_list := l_pk_cc_select_list || ',ENTITYAG_TBL.'||l_pk3_column_name;
10154      l_pk_cc_dl_col_list := l_pk_cc_dl_col_list || ',' || l_pk3_column_name;
10155      l_inner_pk_cc_dl_col_list := l_inner_pk_cc_dl_col_list || ', ENTITY.'||l_pk3_column_name;
10156   END IF;
10157   IF (l_pk4_column_name IS NOT NULL) THEN
10158      l_ag_presence_chk_sql := l_ag_presence_chk_sql || ' AND  UAI.'||l_pk4_column_name||' = ENTITY.'||l_pk4_column_name;
10159      l_pk_cc_select_list := l_pk_cc_select_list || ',ENTITYAG_TBL.'||l_pk4_column_name;
10160      l_pk_cc_dl_col_list := l_pk_cc_dl_col_list || ',' || l_pk4_column_name;
10161      l_inner_pk_cc_dl_col_list := l_inner_pk_cc_dl_col_list || ', ENTITY.'||l_pk4_column_name;
10162   END IF;
10163   IF (l_pk5_column_name IS NOT NULL) THEN
10164      l_ag_presence_chk_sql := l_ag_presence_chk_sql || ' AND  UAI.'||l_pk5_column_name||' = ENTITY.'||l_pk5_column_name;
10165      l_pk_cc_select_list := l_pk_cc_select_list || ',ENTITYAG_TBL.'||l_pk5_column_name;
10166      l_pk_cc_dl_col_list := l_pk_cc_dl_col_list || ',' || l_pk5_column_name;
10167      l_inner_pk_cc_dl_col_list := l_inner_pk_cc_dl_col_list || ', ENTITY.'||l_pk5_column_name;
10168   END IF;
10169 
10170 
10171 
10172   l_list_of_dl_for_ag_type := EGO_USER_ATTRS_COMMON_PVT.Get_Data_Levels_For_AGType( p_application_id  => p_application_id
10173                                                                                    ,p_attr_group_type => p_attr_group_type);
10174   IF(l_has_data_level_id) THEN
10175     l_ag_presence_chk_sql := l_ag_presence_chk_sql || ' AND NVL(UAI.DATA_LEVEL_ID,'||G_NULL_TOKEN_NUM||') '||
10176                                                       '   = NVL(ENTITY.DATA_LEVEL_ID,'||G_NULL_TOKEN_NUM||')';
10177 
10178     FOR i IN l_list_of_dl_for_ag_type.FIRST .. l_list_of_dl_for_ag_type.LAST
10179     LOOP
10180 
10181        IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 <> 'NONE'
10182           AND INSTR(l_ag_presence_chk_sql,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1) = 0) THEN
10183 
10184                IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE1 = 'NUMBER') THEN
10185                  wierd_constant := G_NULL_TOKEN_NUM;
10186                ELSIF (l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE1 = 'DATE' OR l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE1 = 'DATETIME') THEN
10187                  wierd_constant := G_NULL_TOKEN_DATE;
10188                ELSE
10189                  wierd_constant := G_NULL_TOKEN_STR;
10190                END IF;
10191 
10192                l_ag_presence_chk_sql := l_ag_presence_chk_sql || ' AND NVL(UAI.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1||','||wierd_constant||') '||
10193                                                                  '   = NVL(ENTITY.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1||','||wierd_constant||')';
10194        END IF;
10195        IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2 <> 'NONE'
10196           AND INSTR(l_ag_presence_chk_sql,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2) = 0) THEN
10197                IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE2 = 'NUMBER') THEN
10198                  wierd_constant := G_NULL_TOKEN_NUM;
10199                ELSIF (l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE2 = 'DATE' OR l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE2 = 'DATETIME') THEN
10200                  wierd_constant := G_NULL_TOKEN_DATE;
10201                ELSE
10202                  wierd_constant := G_NULL_TOKEN_STR;
10203                END IF;
10204                l_ag_presence_chk_sql := l_ag_presence_chk_sql || ' AND NVL(UAI.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2||','||wierd_constant||') '||
10205                                                                  '   = NVL(ENTITY.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2||','||wierd_constant||')';
10206        END IF;
10207        IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3 <> 'NONE'
10208           AND INSTR(l_ag_presence_chk_sql,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3) = 0) THEN
10209                IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE3 = 'NUMBER') THEN
10210                  wierd_constant := G_NULL_TOKEN_NUM;
10211                ELSIF (l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE3 = 'DATE' OR l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE3 = 'DATETIME') THEN
10212                  wierd_constant := G_NULL_TOKEN_DATE;
10213                ELSE
10214                  wierd_constant := G_NULL_TOKEN_STR;
10215                END IF;
10216                l_ag_presence_chk_sql := l_ag_presence_chk_sql || ' AND NVL(UAI.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3||','||wierd_constant||') '||
10217                                                                  '   = NVL(ENTITY.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3||','||wierd_constant||')';
10218        END IF;
10219        IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4 <> 'NONE'
10220           AND INSTR(l_ag_presence_chk_sql,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4) = 0) THEN
10221                IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE4 = 'NUMBER') THEN
10222                  wierd_constant := G_NULL_TOKEN_NUM;
10223                ELSIF (l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE4 = 'DATE' OR l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE4 = 'DATETIME') THEN
10224                  wierd_constant := G_NULL_TOKEN_DATE;
10225                ELSE
10226                  wierd_constant := G_NULL_TOKEN_STR;
10227                END IF;
10228                l_ag_presence_chk_sql := l_ag_presence_chk_sql || ' AND NVL(UAI.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4||','||wierd_constant||') '||
10229                                                                  '   = NVL(ENTITY.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4||','||wierd_constant||')';
10230        END IF;
10231        IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5 <> 'NONE'
10232           AND INSTR(l_ag_presence_chk_sql,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5) = 0) THEN
10233                IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE5 = 'NUMBER') THEN
10234                  wierd_constant := G_NULL_TOKEN_NUM;
10235                ELSIF (l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE5 = 'DATE' OR l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE5 = 'DATETIME') THEN
10236                  wierd_constant := G_NULL_TOKEN_DATE;
10237                ELSE
10238                  wierd_constant := G_NULL_TOKEN_STR;
10239                END IF;
10240                l_ag_presence_chk_sql := l_ag_presence_chk_sql || ' AND NVL(UAI.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5||','||wierd_constant||') '||
10241                                                                  '   = NVL(ENTITY.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5||','||wierd_constant||')';
10242        END IF;
10243     END LOOP;
10244   END IF;
10245 
10246 
10247 
10248 
10249 
10250   IF l_has_data_level_id THEN -- R12C specific code
10251     l_all_dl_cols := EGO_USER_ATTRS_COMMON_PVT.Get_All_Data_Level_PK_Names
10252                                    (p_application_id  => p_application_id
10253                                    ,p_attr_group_type => p_attr_group_type);
10254 
10255     l_pk_cc_select_list := l_pk_cc_select_list || ', ENTITYAG_TBL.DATA_LEVEL_ID ';
10256     l_pk_cc_dl_col_list := l_pk_cc_dl_col_list || ', DATA_LEVEL_ID ';
10257     l_inner_pk_cc_dl_col_list := l_inner_pk_cc_dl_col_list ||', ENTITY.DATA_LEVEL_ID ';
10258     -- l_all_dl_cols are in the format a,b,c
10259     IF l_all_dl_cols IS NOT NULL THEN
10260       l_all_dl_cols := ','||l_all_dl_cols;
10261       l_pk_cc_select_list := l_pk_cc_select_list || REPLACE(l_all_dl_cols,',',', ENTITYAG_TBL.');
10262       l_pk_cc_dl_col_list := l_pk_cc_dl_col_list || l_all_dl_cols;
10263       l_inner_pk_cc_dl_col_list := l_inner_pk_cc_dl_col_list ||REPLACE(l_all_dl_cols,',',', ENTITY.');
10264     ELSE
10265       l_all_dl_cols := ' ';
10266     END IF;
10267 
10268   ELSE -- R12 code
10269     ------------------------------------------------------------
10270     -- Get data level information for the given object name   --
10271     ------------------------------------------------------------
10272     FOR d_l_rec IN data_level_cols_cursor(cp_application_id  => p_application_id
10273                                          ,cp_attr_group_type => p_attr_group_type)
10274     LOOP
10275 
10276       IF (data_level_cols_cursor%ROWCOUNT = 1) THEN
10277         l_data_level_none        := d_l_rec.data_level_name;
10278         l_num_data_level_columns := 0;
10279       ELSIF (data_level_cols_cursor%ROWCOUNT = 2) THEN
10280         l_data_level_column_1    := d_l_rec.data_level_name;
10281         l_num_data_level_columns := 1;
10282       ELSIF (data_level_cols_cursor%ROWCOUNT = 3) THEN
10283         l_data_level_column_2    := d_l_rec.data_level_name;
10284         l_num_data_level_columns := 2;
10285       ELSIF (data_level_cols_cursor%ROWCOUNT = 4) THEN
10286         l_data_level_column_3    := d_l_rec.data_level_name;
10287         l_num_data_level_columns := 3;
10288       END IF;
10289     END LOOP;
10290   END IF;  -- l_has_data_level_id
10291 
10292   IF (p_additional_class_Code_query IS NULL) THEN
10293     l_additional_class_Code_query := ' SELECT -2910 FROM DUAL ';
10294   ELSE
10295     l_additional_class_Code_query := p_additional_class_Code_query;
10296   END IF;
10297 code_debug(l_api_name ||' phase 2 ');
10298 code_debug(l_api_name ||' l_pk_cc_select_list '||l_pk_cc_select_list);
10299 code_debug(l_api_name ||' l_pk_cc_dl_col_list '|| l_pk_cc_dl_col_list );
10300 code_debug(l_api_name ||' l_inner_pk_cc_dl_col_list '|| l_inner_pk_cc_dl_col_list );
10301 code_debug(l_api_name ||' l_ag_presence_chk_sql '|| l_ag_presence_chk_sql );
10302   ----------------------------------------------------------
10303   -- Getting the max ROW_IDENTIFIER in the given data set --
10304   -- All the inserted rows will have ROW_IDENTIFIERS in a --
10305   -- series starting with this number                     --
10306   ----------------------------------------------------------
10307 
10308   BEGIN
10309     l_dynamic_sql := 'SELECT MAX(ROW_IDENTIFIER)+1 FROM '||p_interface_table_name||
10310                      ' WHERE DATA_SET_ID = :data_Set_id ';
10311     EXECUTE IMMEDIATE l_dynamic_sql
10312     INTO l_max_row_id
10313     USING p_Data_Set_id;
10314   EXCEPTION
10315     WHEN NO_DATA_FOUND THEN
10316        l_max_row_id := 1;
10317   END;
10318 
10319   IF(l_max_row_id IS NULL) THEN
10320     l_max_row_id := 1;
10321   END IF;
10322 
10323   IF (p_extra_column_names IS NOT NULL) THEN
10324      l_dynamic_sql:= ' SELECT /*+ leading(ATTR_EXT_TBL,ATTR_TBL,INNER_ATTR_TBL) */  /* Bug 9678667 */ '||p_extra_column_values||', '||p_process_status; -- p_extra_column_values, PROCESS_STATUS
10325   ELSE
10326      l_dynamic_sql:= ' SELECT /*+ leading(ATTR_EXT_TBL,ATTR_TBL,INNER_ATTR_TBL) */  /* Bug 9678667 */ '||p_process_status||' ';                         -- PROCESS_STATUS
10327   END IF;
10328 
10329   l_dynamic_sql := l_dynamic_sql||
10330                       ' ,'''||p_attr_group_type||''' '||   --ATTR_GROUP_TYPE
10331                       ' ,:data_set_id                '||   --DATA_SET_ID
10332                       ' ,:request_id                 '||   --REQUEST_ID
10333                       ' ,:max_row_id + ROW_ID        '||   --ROW_IDENTIFIER
10334                       ' ,ATTR_TBL.DESCRIPTIVE_FLEX_CONTEXT_CODE    '||   --ATTR_GROUP_INT_NAME
10335                       ' ,ATTR_TBL.END_USER_COLUMN_NAME             '||   --ATTR_INT_NAME
10336                       ' ,TO_NUMBER(DECODE(ATTR_EXT_TBL.DATA_TYPE, '''||EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE||'''  '||--ATTR_VALUE_NUM
10337                       '                               ,ATTR_TBL.DEFAULT_VALUE '||
10338                       '                               ,NULL))                 '||
10339                       ' ,DECODE(ATTR_EXT_TBL.DATA_TYPE, '''||EGO_EXT_FWK_PUB.G_TRANS_TEXT_DATA_TYPE||'''        '||--ATTR_VALUE_STR
10340                       '                               ,ATTR_TBL.DEFAULT_VALUE '||
10341                       '                               , '''||EGO_EXT_FWK_PUB.G_CHAR_DATA_TYPE||'''              '||
10342                       '                               ,ATTR_TBL.DEFAULT_VALUE '||
10343                       '                               ,NULL)                  '||
10344                       ' ,DECODE(ATTR_EXT_TBL.DATA_TYPE, '''||EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE||'''              '||--ATTR_VALUE_DATE
10345                       '                           ,EGO_USER_ATTRS_BULK_PVT.Get_Date(ATTR_TBL.DEFAULT_VALUE,NULL)'||
10346                       '                           , '''||EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE||'''             '||
10347                       '                           ,EGO_USER_ATTRS_BULK_PVT.Get_Date(ATTR_TBL.DEFAULT_VALUE,NULL)'||
10348                       '                           ,NULL)                                                        ';
10349 
10350   l_dynamic_sql := l_dynamic_sql || l_pk_cc_select_list;
10351 code_debug(l_api_name ||' phase 3 ');
10352 code_debug(l_api_name ||' l_dynamic_sql '||l_dynamic_sql);
10353 
10354   IF NOT l_has_data_level_id THEN -- R12 CODE
10355     -------------------------------------------------
10356     -- Adding Data Level data columns to the query --
10357     -------------------------------------------------
10358     IF (l_num_data_level_columns = 1 OR l_num_data_level_columns = 2 OR l_num_data_level_columns = 3) THEN
10359        l_dynamic_sql := l_dynamic_sql || ' , DECODE(ENTITYAG_TBL.DATA_LEVEL                 '||
10360                                          '          ,'''||l_data_level_none||'''         '||
10361                                          '          ,NULL                                '||
10362                                          '          ,ENTITYAG_TBL.'||l_data_level_column_1||') ';
10363        l_pk_cc_dl_col_list := l_pk_cc_dl_col_list||' , '||l_data_level_column_1;
10364        l_inner_pk_cc_dl_col_list := l_inner_pk_cc_dl_col_list || ', ENTITY.'||l_data_level_column_1;
10365     END IF;
10366 
10367     IF (l_num_data_level_columns = 2 OR l_num_data_level_columns = 3) THEN
10368        l_dynamic_sql := l_dynamic_sql || ' , DECODE(ENTITYAG_TBL.DATA_LEVEL                 '||
10369                                          '          ,'''||l_data_level_none||'''         '||
10370                                          '          ,NULL                                '||
10371                                          '          ,ENTITYAG_TBL.'||l_data_level_column_2||') ';
10372        l_pk_cc_dl_col_list := l_pk_cc_dl_col_list||' , '||l_data_level_column_2;
10373        l_inner_pk_cc_dl_col_list := l_inner_pk_cc_dl_col_list || ', ENTITY.'||l_data_level_column_2;
10374     END IF;
10375 
10376     IF (l_num_data_level_columns = 3) THEN
10377        l_dynamic_sql := l_dynamic_sql || ' , DECODE(ENTITYAG_TBL.DATA_LEVEL                 '||
10378                                          '          ,'''||l_data_level_none||'''         '||
10379                                          '          ,NULL                                '||
10380                                          '          ,ENTITYAG_TBL.'||l_data_level_column_3||') ';
10381        l_pk_cc_dl_col_list := l_pk_cc_dl_col_list||' , '||l_data_level_column_3;
10382        l_inner_pk_cc_dl_col_list := l_inner_pk_cc_dl_col_list || ', ENTITY.'||l_data_level_column_3;
10383     END IF;
10384   END IF;
10385 
10386 code_debug(l_api_name ||' phase 4 ');
10387 code_debug(l_api_name ||' l_pk_cc_dl_col_list '|| l_pk_cc_dl_col_list );
10388 code_debug(l_api_name ||' l_inner_pk_cc_dl_col_list '|| l_inner_pk_cc_dl_col_list );
10389 code_debug(l_api_name ||' l_dynamic_sql '||l_dynamic_sql);
10390 
10391   l_dynamic_sql := l_dynamic_sql ||
10392                            ' ,'''||EGO_USER_ATTRS_DATA_PVT.G_CREATE_MODE||'''    '||--TRANSACTION_TYPE
10393                            ' ,ENTITYAG_TBL.ATTR_GROUP_ID '||--ATTR_GROUP_ID
10394                            ' ,ENTITYAG_TBL.TRANSACTION_ID '||--TRANSACTION_ID
10395                            ' ,:current_user_id           '||--CREATED_BY
10396                            ' ,SYSDATE                    '||--CREATION_DATE
10397                            ' ,:current_user_id           '||--LAST_UPDATED_BY
10398                            ' ,SYSDATE                    '||--LAST_UPDATE_DATE
10399                            ' ,:current_login_id          '||--LAST_UPDATE_LOGIN
10400                       ' FROM FND_DESCR_FLEX_COLUMN_USAGES ATTR_TBL, '||
10401                           '  EGO_FND_DF_COL_USGS_EXT ATTR_EXT_TBL,  '||
10402                           ' (SELECT /*+ FULL (ASSOC_TBL) */  TRANSACTION_ID, '||
10403         --Bug7315142,hint added to increase the performance
10404                           '         ROWNUM ROW_ID,                  '||
10405                           '         APPLICATION_ID,                 '||
10406                           '         ATTR_GROUP_TBL.DESCRIPTIVE_FLEXFIELD_NAME,    '||
10407                           '         ATTR_GROUP_TBL.DESCRIPTIVE_FLEX_CONTEXT_CODE, '||
10408                           '         ATTR_GROUP_TBL.ATTR_GROUP_ID,           '||
10409                           '         ASSOC_TBL.DATA_LEVEL                    '||
10410                           '      '||l_inner_pk_cc_dl_col_list||'            '||
10411                           '    FROM EGO_FND_DSC_FLX_CTX_EXT ATTR_GROUP_TBL, '||
10412                           '         EGO_OBJ_AG_ASSOCS_B ASSOC_TBL,          '||
10413                           '         ('||p_target_entity_sql||') ENTITY      '||
10414                           '   WHERE                                         '||
10415                           '         ATTR_GROUP_TBL.DESCRIPTIVE_FLEXFIELD_NAME = :attr_group_type ';
10416   IF l_has_data_level_id THEN
10417     l_dynamic_sql := l_dynamic_sql ||
10418                           '     AND ASSOC_TBL.DATA_LEVEL_ID = ENTITY.DATA_LEVEL_ID ';
10419   END IF;
10420   IF (p_attr_groups_to_exclude IS NOT NULL) THEN
10421      l_dynamic_sql := l_dynamic_sql||
10422                           '     AND ATTR_GROUP_TBL.ATTR_GROUP_ID NOT IN ('||p_attr_groups_to_exclude||')          ';
10423   END IF;
10424 
10425   l_dynamic_sql := l_dynamic_sql||
10426                            '    AND ATTR_GROUP_TBL.ATTR_GROUP_ID = ASSOC_TBL.ATTR_GROUP_ID                        '||
10427                            '    AND ATTR_GROUP_TBL.APPLICATION_ID = :app_id                                       '||
10428                            '    AND ASSOC_TBL.OBJECT_ID = :object_id                                              '||
10429                            '    AND ATTR_GROUP_TBL.MULTI_ROW = ''N''                                              '||
10430                            '    AND (    ASSOC_TBL.CLASSIFICATION_CODE IN ('||l_additional_class_Code_query||')   '||
10431                            '          OR ASSOC_TBL.CLASSIFICATION_CODE = ENTITY.'||l_class_code_column_name||')   '||
10432                            '    AND NOT EXISTS ('||l_ag_presence_chk_sql||')                                      '||
10433                            ' ) ENTITYAG_TBL                                                                       '||
10434                      ' WHERE ATTR_TBL.APPLICATION_ID = ENTITYAG_TBL.APPLICATION_ID                                '||
10435                      '   AND ATTR_TBL.DESCRIPTIVE_FLEXFIELD_NAME = ENTITYAG_TBL.DESCRIPTIVE_FLEXFIELD_NAME        '||
10436                      '   AND ATTR_TBL.DESCRIPTIVE_FLEX_CONTEXT_CODE = ENTITYAG_TBL.DESCRIPTIVE_FLEX_CONTEXT_CODE  '||
10437                      '   AND ATTR_TBL.DEFAULT_VALUE IS NOT NULL                                                   '||
10438                      '   AND ATTR_TBL.ENABLED_FLAG = ''Y''                                                        '||
10439                      '   AND ATTR_EXT_TBL.APPLICATION_ID = :app_id                                                '||
10440                      '   AND ATTR_EXT_TBL.DESCRIPTIVE_FLEXFIELD_NAME = :attr_group_type                           '||
10441                      '   AND ATTR_EXT_TBL.DESCRIPTIVE_FLEX_CONTEXT_CODE = ATTR_TBL.DESCRIPTIVE_FLEX_CONTEXT_CODE  '||
10442                      '   AND ATTR_EXT_TBL.APPLICATION_COLUMN_NAME = ATTR_TBL.APPLICATION_COLUMN_NAME              '||
10443                      '   AND NOT EXISTS                                                                           '||
10444                      '      ( SELECT 1                                                                                      '||
10445                      '           FROM FND_DESCR_FLEX_COLUMN_USAGES INNER_ATTR_TBL                                           '||
10446                      '          WHERE INNER_ATTR_TBL.APPLICATION_ID                = ATTR_TBL.APPLICATION_ID                '||
10447                      '            AND INNER_ATTR_TBL.DESCRIPTIVE_FLEXFIELD_NAME    = ATTR_TBL.DESCRIPTIVE_FLEXFIELD_NAME    '||
10448                      '            AND INNER_ATTR_TBL.DESCRIPTIVE_FLEX_CONTEXT_CODE = ATTR_TBL.DESCRIPTIVE_FLEX_CONTEXT_CODE '||
10449                      '            AND INNER_ATTR_TBL.REQUIRED_FLAG = ''Y''                                                  '||
10450                      '            AND INNER_ATTR_TBL.DEFAULT_VALUE IS NULL                                                  '||
10451                      '       )  ';
10452 code_debug(l_api_name ||' phase 5 ');
10453 code_debug(l_api_name ||' l_dynamic_sql '||l_dynamic_sql);
10454 
10455   IF (p_extra_column_names IS NOT NULL) THEN
10456      l_col_to_insert_list:= p_extra_column_names||' ,PROCESS_STATUS ';
10457   ELSE
10458      l_col_to_insert_list:= ' PROCESS_STATUS ';
10459   END IF;
10460 
10461   l_col_to_insert_list:= l_col_to_insert_list    ||
10462                          ' ,ATTR_GROUP_TYPE     '||
10463                          ' ,DATA_SET_ID         '||
10464                          ' ,REQUEST_ID          '||
10465                          ' ,ROW_IDENTIFIER      '||
10466                          ' ,ATTR_GROUP_INT_NAME '||
10467                          ' ,ATTR_INT_NAME       '||
10468                          ' ,ATTR_VALUE_NUM      '||
10469                          ' ,ATTR_VALUE_STR      '||
10470                          ' ,ATTR_VALUE_DATE     '||
10471                           l_pk_cc_dl_col_list    ||
10472                          ' ,TRANSACTION_TYPE    '||
10473                          ' ,ATTR_GROUP_ID       '||
10474                          ' ,TRANSACTION_ID      '||
10475                          ' ,CREATED_BY          '||
10476                          ' ,CREATION_DATE       '||
10477                          ' ,LAST_UPDATED_BY     '||
10478                          ' ,LAST_UPDATE_DATE    '||
10479                          ' ,LAST_UPDATE_LOGIN   ';
10480 
10481   ---------------------------
10482   -- The final DML         --
10483   ---------------------------
10484   --Bug No:5386049
10485   --Getting the currnet userid and loginid
10486   --if not initialised.so that they are not inserted as null
10487   IF (G_CURRENT_USER_ID IS NULL ) THEN
10488     G_CURRENT_USER_ID  := FND_GLOBAL.User_Id;
10489   END IF;
10490   IF (G_CURRENT_LOGIN_ID IS NULL ) THEN
10491     G_CURRENT_LOGIN_ID := FND_GLOBAL.Login_Id;
10492   END IF;
10493 
10494   l_dynamic_sql :=   ' INSERT INTO '||p_interface_table_name||
10495                      ' (   '||l_col_to_insert_list  ||' )  '||
10496                      l_dynamic_sql;
10497   l_object_id := EGO_USER_ATTRS_DATA_PVT.Get_Object_Id_From_Name(p_object_name);
10498 
10499 code_debug(l_api_name ||' Final SQL ');
10500 code_debug(l_api_name ||l_dynamic_sql);
10501 code_debug(l_api_name ||'params 1: '||p_data_Set_id||' 2: '||FND_GLOBAL.CONC_REQUEST_ID||
10502            ' 3: '||l_max_row_id||' 4: '||G_CURRENT_USER_ID||
10503            ' 5: '||G_CURRENT_USER_ID||' 6: '||G_CURRENT_LOGIN_ID||
10504            ' 7: '||p_attr_group_type||' 8: '||p_application_id||
10505            ' 9: '||l_object_id||' 10: '||p_data_set_id||
10506            ' 11: '||p_application_id||' 12: '||p_attr_group_type
10507            );
10508 
10509   /* Begin Bug 13729672*/
10510   IF p_datalevel_id IS NULL THEN
10511     EXECUTE IMMEDIATE l_dynamic_sql
10512     USING p_data_Set_id,
10513           FND_GLOBAL.CONC_REQUEST_ID,
10514           l_max_row_id,
10515           G_CURRENT_USER_ID,
10516           G_CURRENT_USER_ID,
10517           G_CURRENT_LOGIN_ID,
10518           p_attr_group_type,
10519           p_application_id,
10520           l_object_id,
10521           p_data_set_id,
10522           p_application_id,
10523           p_attr_group_type;
10524   ELSE
10525     EXECUTE IMMEDIATE l_dynamic_sql
10526     USING p_data_Set_id,
10527           FND_GLOBAL.CONC_REQUEST_ID,
10528           l_max_row_id,
10529           G_CURRENT_USER_ID,
10530           G_CURRENT_USER_ID,
10531           G_CURRENT_LOGIN_ID,
10532           p_comp_seq_id,
10533           p_bill_seq_id,
10534           p_structure_type_id,
10535           p_data_level_column,
10536           p_datalevel_id,
10537           p_context_id,
10538           p_transaction_id,
10539           p_attr_group_type,
10540           p_application_id,
10541           l_object_id,
10542           p_data_set_id,
10543           p_application_id,
10544           p_attr_group_type;
10545   END IF;
10546   /* End Bug 1379672 */
10547 
10548     -- Fix for bug#9336604
10549     -- Added gather stats based on profile
10550     IF SQL%ROWCOUNT > 0 THEN
10551        IF (FND_INSTALLATION.GET_APP_INFO('EGO', l_status, l_industry, l_schema)) THEN
10552 
10553          IF (nvl(fnd_profile.value('EGO_ENABLE_GATHER_STATS'),'N') = 'Y') THEN
10554 
10555             FND_STATS.GATHER_TABLE_STATS(OWNNAME => l_schema,
10556                                    TABNAME => 'EGO_ITM_USR_ATTR_INTRFC',
10557                                    CASCADE => True);
10558          END IF;
10559 
10560        END IF;
10561     END IF;
10562   --------------------------------
10563   -- Standard check of p_commit --
10564   --------------------------------
10565   IF FND_API.To_Boolean(p_commit) THEN
10566     COMMIT WORK;
10567   END IF;
10568 
10569   x_return_status := FND_API.G_RET_STS_SUCCESS;
10570   code_debug(l_api_name ||' Returning with status '||x_return_status);
10571 
10572 EXCEPTION
10573   WHEN OTHERS THEN
10574    code_debug(l_api_name ||' Returning EXCEPTION '||SQLERRM);
10575    x_return_status  := FND_API.G_RET_STS_UNEXP_ERROR;
10576    x_msg_data := 'Executing - EGO_USER_ATTRS_BULK_PVT.Insert_Default_Val_Rows: '||SQLERRM;
10577 
10578 END Insert_Default_Val_Rows;
10579 
10580 ----------------------------------------------------------------------
10581 
10582 PROCEDURE Mark_Unchanged_Attr_Rows (  p_api_version            IN   NUMBER
10583                                      ,p_application_id         IN   NUMBER
10584                                      ,p_attr_group_type        IN   VARCHAR2
10585                                      ,p_object_name            IN   VARCHAR2
10586                                      ,p_interface_table_name   IN   VARCHAR2
10587                                      ,p_data_set_id            IN   NUMBER
10588                                      ,p_new_status             IN   NUMBER
10589                                      ,p_commit                 IN   VARCHAR2   DEFAULT FND_API.G_FALSE
10590                                      ,x_return_status          OUT NOCOPY VARCHAR2
10591                                      ,x_msg_data               OUT NOCOPY VARCHAR2
10592                                    )
10593 IS
10594 
10595   TYPE DYNAMIC_CUR IS REF CURSOR;
10596 
10597   l_attr_group_int_name               VARCHAR2(30);
10598   l_dynamic_dist_ag_cursor            DYNAMIC_CUR;
10599   l_dynamic_sql                       VARCHAR2(30000);
10600   l_ext_vl_table_name                 VARCHAR2(30);
10601   l_ext_b_table_name                  VARCHAR2(30);
10602   l_ext_intf_pk_join_sql              VARCHAR2(2000);
10603   l_ext_intf_dl_join_sql              VARCHAR2(2000);
10604   l_uk_where_caluse                   VARCHAR2(32000); -- VARCHAR2(10000);  bug# 9448576
10605   l_ag_id_col_exists                  BOOLEAN;
10606   l_uk_attr_list                      VARCHAR2(32000); -- VARCHAR2(7000);   bug# 9448576
10607 
10608   l_str_attr_decode_list_Ext          VARCHAR2(10000);
10609   l_num_attr_decode_list_Ext          VARCHAR2(10000);
10610   l_date_attr_decode_list_Ext         VARCHAR2(10000);
10611 
10612   l_str_attr_decode_list_Intf          VARCHAR2(10000);
10613   l_num_attr_decode_list_Intf          VARCHAR2(10000);
10614   l_date_attr_decode_list_Intf         VARCHAR2(10000);
10615 
10616   l_pk1_column_name                   VARCHAR2(30);
10617   l_pk2_column_name                   VARCHAR2(30);
10618   l_pk3_column_name                   VARCHAR2(30);
10619   l_pk4_column_name                   VARCHAR2(30);
10620   l_pk5_column_name                   VARCHAR2(30);
10621 
10622   l_num_data_level_columns            NUMBER := 0;
10623   l_data_level_1                      VARCHAR2(30);
10624   l_data_level_column_1               VARCHAR2(150);
10625   l_data_level_2                      VARCHAR2(30);
10626   l_data_level_column_2               VARCHAR2(150);
10627   l_data_level_3                      VARCHAR2(30);
10628   l_data_level_column_3               VARCHAR2(150);
10629   l_object_id                         NUMBER;
10630 
10631   l_dyn_cursor                        NUMBER;
10632   l_dummy                             NUMBER;
10633   l_attr_group_metadata_obj           EGO_ATTR_GROUP_METADATA_OBJ;
10634   l_attr_metadata_table               EGO_ATTR_METADATA_TABLE;
10635   l_list_of_dl_for_ag_type            EGO_DATA_LEVEL_METADATA_TABLE;
10636   l_data_level_col_exists             BOOLEAN;
10637   wierd_constant                      VARCHAR2(100);
10638 
10639   CURSOR data_level_cols_cursor (cp_object_name VARCHAR2)
10640   IS
10641   SELECT LOOKUP_CODE  DATA_LEVEL_INTERNAL_NAME
10642         ,MEANING      DATA_LEVEL_DISPLAY_NAME
10643         ,DECODE(ATTRIBUTE2, 1, ATTRIBUTE3,
10644                             2, ATTRIBUTE5,
10645                             3, ATTRIBUTE7,
10646                             'NONE') DATA_LEVEL_COLUMN
10647         ,DECODE(ATTRIBUTE2, 1, ATTRIBUTE4,
10648                             2, ATTRIBUTE6,
10649                             3, ATTRIBUTE8,
10650                             'NONE') DL_COL_DATA_TYPE
10651    FROM FND_LOOKUP_VALUES
10652   WHERE LOOKUP_TYPE = 'EGO_EF_DATA_LEVEL'
10653     AND ATTRIBUTE1 = cp_object_name
10654     AND LANGUAGE = USERENV('LANG')
10655   ORDER BY ATTRIBUTE2;
10656 
10657 BEGIN
10658 
10659   code_debug('*** Inside Mark_Unchanged_Attr_Rows ...',2);
10660 
10661   -----------------------------------------
10662   -- Fetch the PK column names and data  --
10663   -- types for the passed-in object name --
10664   -----------------------------------------
10665   SELECT PK1_COLUMN_NAME,
10666          PK2_COLUMN_NAME,
10667          PK3_COLUMN_NAME,
10668          PK4_COLUMN_NAME,
10669          PK5_COLUMN_NAME
10670     INTO l_pk1_column_name,
10671          l_pk2_column_name,
10672          l_pk3_column_name,
10673          l_pk4_column_name,
10674          l_pk5_column_name
10675     FROM FND_OBJECTS
10676    WHERE OBJ_NAME = p_object_name;
10677 
10678   --------------------------------------------
10679   -- Fetching the ext table/vl name         --
10680   --------------------------------------------
10681   SELECT FLEX_EXT.APPLICATION_VL_NAME       EXT_VL_NAME,
10682          FLEX.APPLICATION_TABLE_NAME        EXT_TABLE_NAME
10683     INTO l_ext_vl_table_name,
10684          l_ext_b_table_name
10685     FROM FND_DESCRIPTIVE_FLEXS              FLEX,
10686          EGO_FND_DESC_FLEXS_EXT             FLEX_EXT
10687    WHERE FLEX.APPLICATION_ID = FLEX_EXT.APPLICATION_ID(+)
10688      AND FLEX.DESCRIPTIVE_FLEXFIELD_NAME = FLEX_EXT.DESCRIPTIVE_FLEXFIELD_NAME(+)
10689      AND FLEX.APPLICATION_ID = p_application_id
10690      AND FLEX.DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type;
10691 
10692   IF(l_ext_vl_table_name IS NULL) THEN
10693     l_ext_vl_table_name := l_ext_b_table_name;
10694   END IF;
10695 
10696 
10697 /**********************
10698 ***********************/
10699   ------------------------------------------------------------
10700   -- Get data level information for the given object name   --
10701   ------------------------------------------------------------
10702     l_data_level_col_exists :=  FND_API.TO_BOOLEAN(
10703             EGO_USER_ATTRS_COMMON_PVT.has_column_in_table(
10704               p_table_name => l_ext_b_table_name,
10705               p_column_name => 'DATA_LEVEL_ID'));
10706 
10707     l_list_of_dl_for_ag_type := EGO_USER_ATTRS_COMMON_PVT.Get_Data_Levels_For_AGType( p_application_id  => p_application_id
10708                                                                                      ,p_attr_group_type => p_attr_group_type);
10709 
10710     ------------------------------------------------------------
10711     -- Get data level information for the given object name   --
10712     -- R12C onwards the data level info wud not be stored in  --
10713     -- lookups table. Hence we get it from the dl meta data   --
10714     -- table fetched. We assume here that there can be only 3 --
10715     -- data levels with only one pk column. This assumption is -
10716     -- as per the support offered prior to R12C               --
10717     ------------------------------------------------------------
10718     l_dummy := 0;
10719     FOR i IN l_list_of_dl_for_ag_type.FIRST .. l_list_of_dl_for_ag_type.LAST
10720     LOOP
10721 
10722       IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 <> 'NONE'
10723          AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 IS NOT NULL) THEN
10724 
10725           l_dummy := l_dummy + 1;
10726 
10727           IF (l_dummy = 1) THEN
10728 
10729             l_data_level_1           := l_list_of_dl_for_ag_type(i).DATA_LEVEL_NAME;
10730             l_data_level_column_1    := l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1;
10731             l_num_data_level_columns := 1;
10732 
10733           ELSIF (l_dummy = 2) THEN
10734 
10735             l_data_level_2           := l_list_of_dl_for_ag_type(i).DATA_LEVEL_NAME;
10736             l_data_level_column_2    := l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1;
10737             l_num_data_level_columns := 2;
10738 
10739           ELSIF (l_dummy = 3) THEN
10740             l_data_level_3           := l_list_of_dl_for_ag_type(i).DATA_LEVEL_NAME;
10741             l_data_level_column_3    := l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1;
10742             l_num_data_level_columns := 3;
10743 
10744           END IF;
10745 
10746       END IF;
10747 
10748     END LOOP;
10749 
10750   ------------------------------------------------
10751   -- Building the PK Join for the where clause  --
10752   ------------------------------------------------
10753 
10754   l_ext_intf_pk_join_sql := ' ';
10755 
10756   IF (l_pk1_column_name IS NOT NULL) THEN
10757      l_ext_intf_pk_join_sql := l_ext_intf_pk_join_sql || ' AND '||l_pk1_column_name||' = INTRFC.'||l_pk1_column_name;
10758   END IF;
10759   IF (l_pk2_column_name IS NOT NULL) THEN
10760      l_ext_intf_pk_join_sql := l_ext_intf_pk_join_sql || ' AND '||l_pk2_column_name||' = INTRFC.'||l_pk2_column_name;
10761   END IF;
10762   IF (l_pk3_column_name IS NOT NULL) THEN
10763      l_ext_intf_pk_join_sql := l_ext_intf_pk_join_sql || ' AND '||l_pk3_column_name||' = INTRFC.'||l_pk3_column_name;
10764   END IF;
10765   IF (l_pk4_column_name IS NOT NULL) THEN
10766      l_ext_intf_pk_join_sql := l_ext_intf_pk_join_sql || ' AND '||l_pk4_column_name||' = INTRFC.'||l_pk4_column_name;
10767   END IF;
10768   IF (l_pk5_column_name IS NOT NULL) THEN
10769      l_ext_intf_pk_join_sql := l_ext_intf_pk_join_sql || ' AND '||l_pk5_column_name||' = INTRFC.'||l_pk5_column_name;
10770   END IF;
10771 
10772   --------------------------------------------------------
10773   -- Building the Data Level Join for the where clause  --
10774   --------------------------------------------------------
10775 
10776   l_ext_intf_dl_join_sql := ' ';
10777 
10778 
10779   IF(l_data_level_col_exists) THEN
10780     l_ext_intf_dl_join_sql := l_ext_intf_dl_join_sql || ' AND NVL(DATA_LEVEL_ID,'||G_NULL_TOKEN_NUM||') '||
10781                                                       '   = NVL(INTRFC.DATA_LEVEL_ID,'||G_NULL_TOKEN_NUM||')';
10782 
10783     FOR i IN l_list_of_dl_for_ag_type.FIRST .. l_list_of_dl_for_ag_type.LAST
10784     LOOP
10785 
10786        IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1 <> 'NONE'
10787           AND INSTR(l_ext_intf_dl_join_sql,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1) = 0) THEN
10788 
10789                IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE1 = 'NUMBER') THEN
10790                  wierd_constant := G_NULL_TOKEN_NUM;
10791                ELSIF (l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE1 = 'DATE' OR l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE1 = 'DATETIME') THEN
10792                  wierd_constant := G_NULL_TOKEN_DATE;
10793                ELSE
10794                  wierd_constant := G_NULL_TOKEN_STR;
10795                END IF;
10796 
10797                l_ext_intf_dl_join_sql := l_ext_intf_dl_join_sql || ' AND NVL('||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1||','||wierd_constant||') '||
10798                                                                  '   = NVL(INTRFC.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME1||','||wierd_constant||')';
10799        END IF;
10800        IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2 <> 'NONE'
10801           AND INSTR(l_ext_intf_dl_join_sql,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2) = 0) THEN
10802                IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE2 = 'NUMBER') THEN
10803                  wierd_constant := G_NULL_TOKEN_NUM;
10804                ELSIF (l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE2 = 'DATE' OR l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE2 = 'DATETIME') THEN
10805                  wierd_constant := G_NULL_TOKEN_DATE;
10806                ELSE
10807                  wierd_constant := G_NULL_TOKEN_STR;
10808                END IF;
10809                l_ext_intf_dl_join_sql := l_ext_intf_dl_join_sql || ' AND NVL('||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2||','||wierd_constant||') '||
10810                                                                  '   = NVL(INTRFC.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME2||','||wierd_constant||')';
10811        END IF;
10812        IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3 <> 'NONE'
10813           AND INSTR(l_ext_intf_dl_join_sql,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3) = 0) THEN
10814                IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE3 = 'NUMBER') THEN
10815                  wierd_constant := G_NULL_TOKEN_NUM;
10816                ELSIF (l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE3 = 'DATE' OR l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE3 = 'DATETIME') THEN
10817                  wierd_constant := G_NULL_TOKEN_DATE;
10818                ELSE
10819                  wierd_constant := G_NULL_TOKEN_STR;
10820                END IF;
10821                l_ext_intf_dl_join_sql := l_ext_intf_dl_join_sql || ' AND NVL('||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3||','||wierd_constant||') '||
10822                                                                  '   = NVL(INTRFC.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME3||','||wierd_constant||')';
10823        END IF;
10824        IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4 <> 'NONE'
10825           AND INSTR(l_ext_intf_dl_join_sql,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4) = 0) THEN
10826                IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE4 = 'NUMBER') THEN
10827                  wierd_constant := G_NULL_TOKEN_NUM;
10828                ELSIF (l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE4 = 'DATE' OR l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE4 = 'DATETIME') THEN
10829                  wierd_constant := G_NULL_TOKEN_DATE;
10830                ELSE
10831                  wierd_constant := G_NULL_TOKEN_STR;
10832                END IF;
10833                l_ext_intf_dl_join_sql := l_ext_intf_dl_join_sql || ' AND NVL('||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4||','||wierd_constant||') '||
10834                                                                  '   = NVL(INTRFC.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME4||','||wierd_constant||')';
10835        END IF;
10836        IF (l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5 IS NOT NULL AND l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5 <> 'NONE'
10837           AND INSTR(l_ext_intf_dl_join_sql,l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5) = 0) THEN
10838                IF(l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE5 = 'NUMBER') THEN
10839                  wierd_constant := G_NULL_TOKEN_NUM;
10840                ELSIF (l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE5 = 'DATE' OR l_list_of_dl_for_ag_type(i).PK_COLUMN_TYPE5 = 'DATETIME') THEN
10841                  wierd_constant := G_NULL_TOKEN_DATE;
10842                ELSE
10843                  wierd_constant := G_NULL_TOKEN_STR;
10844                END IF;
10845                l_ext_intf_dl_join_sql := l_ext_intf_dl_join_sql || ' AND NVL('||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5||','||wierd_constant||') '||
10846                                                                  '   = NVL(INTRFC.'||l_list_of_dl_for_ag_type(i).PK_COLUMN_NAME5||','||wierd_constant||')';
10847        END IF;
10848     END LOOP;
10849   ELSE
10850     IF(l_num_data_level_columns = 1 ) THEN
10851       l_ext_intf_dl_join_sql := l_ext_intf_dl_join_sql || ' AND NVL('||l_data_level_column_1||',-1) = NVL(INTRFC.'||l_data_level_column_1||', -1) ';
10852     ELSIF(l_num_data_level_columns = 2 ) THEN
10853       l_ext_intf_dl_join_sql := l_ext_intf_dl_join_sql || ' AND NVL('||l_data_level_column_1||',-1) = NVL(INTRFC.'||l_data_level_column_1||', -1) ';
10854       l_ext_intf_dl_join_sql := l_ext_intf_dl_join_sql || ' AND NVL('||l_data_level_column_2||',-1) = NVL(INTRFC.'||l_data_level_column_2||', -1) ';
10855     ELSIF(l_num_data_level_columns = 3 ) THEN
10856       l_ext_intf_dl_join_sql := l_ext_intf_dl_join_sql || ' AND NVL('||l_data_level_column_1||',-1) = NVL(INTRFC.'||l_data_level_column_1||', -1) ';
10857       l_ext_intf_dl_join_sql := l_ext_intf_dl_join_sql || ' AND NVL('||l_data_level_column_2||',-1) = NVL(INTRFC.'||l_data_level_column_2||', -1) ';
10858       l_ext_intf_dl_join_sql := l_ext_intf_dl_join_sql || ' AND NVL('||l_data_level_column_3||',-1) = NVL(INTRFC.'||l_data_level_column_3||', -1) ';
10859     END IF;
10860   END IF;
10861 
10862 
10863 
10864 
10865   -----------------------------------------------------------------------
10866   -- Looping thru distinct attr groups to be present in the intf table --
10867   -----------------------------------------------------------------------
10868   OPEN l_dynamic_dist_ag_cursor FOR
10869       ' SELECT DISTINCT ATTR_GROUP_INT_NAME
10870           FROM '||p_interface_table_name||' UAI1
10871          WHERE DATA_SET_ID = :data_set_id
10872            AND ATTR_GROUP_TYPE = :attr_group_type
10873            AND UAI1.PROCESS_STATUS = '||G_PS_IN_PROCESS||' '
10874   USING p_data_set_id, p_attr_group_type;
10875   LOOP
10876     FETCH l_dynamic_dist_ag_cursor INTO l_attr_group_int_name;
10877     EXIT WHEN l_dynamic_dist_ag_cursor%NOTFOUND;
10878 
10879     code_debug('        ... Processing attr group '||l_attr_group_int_name ,2);
10880 
10881     -------------------------------------------------------------
10882     -- Find out weather the ATTR_GROUP_ID column exists in the --
10883     -- table where attribute data is to be uploaded or not     --
10884     -------------------------------------------------------------
10885     /* bug 9849770 we can't use this API since it is querying all_tables to find out if col exists or not, while l_ext_vl_table_name is actually a view
10886        it will always return false for this API. Change back to the code R12.0 used in determine if attrGroup id exists
10887     l_ag_id_col_exists :=  FND_API.TO_BOOLEAN(
10888             EGO_USER_ATTRS_COMMON_PVT.has_column_in_table(
10889               p_table_name => l_ext_vl_table_name,
10890               p_column_name => 'ATTR_GROUP_ID')); */
10891     BEGIN
10892       l_dynamic_sql := ' SELECT ATTR_GROUP_ID FROM '||l_ext_vl_table_name||' WHERE ROWNUM=1 ';
10893       EXECUTE IMMEDIATE l_dynamic_sql;
10894       l_ag_id_col_exists := TRUE;
10895     EXCEPTION
10896       WHEN OTHERS THEN
10897         l_ag_id_col_exists := FALSE;
10898     END;
10899     -- End bug 9849770
10900 
10901     l_attr_group_metadata_obj := EGO_USER_ATTRS_COMMON_PVT.Get_Attr_Group_Metadata(
10902                                    p_attr_group_id   => NULL
10903                                   ,p_application_id  => p_application_id
10904                                   ,p_attr_group_type => p_attr_group_type
10905                                   ,p_attr_group_name => l_attr_group_int_name
10906                                  );
10907 
10908     --------------------------------------------------------------------
10909     -- Here we build the SQL to be executed for each of the attribute --
10910     -- groups present in the interface table                          --
10911     --------------------------------------------------------------------
10912     l_dynamic_sql := ' UPDATE '||p_interface_table_name||' INTRFC '||
10913                      '    SET PROCESS_STATUS = '||p_new_status||
10914                      '  WHERE PROCESS_STATUS = '||G_PS_IN_PROCESS||
10915                      '    AND ATTR_GROUP_INT_NAME = '''||l_attr_group_int_name||''' '||
10916                      '    AND ATTR_GROUP_TYPE = '''||p_attr_group_type||''' '||
10917                      '    AND DATA_SET_ID = :data_set_id '||
10918                      '    AND EXISTS ( SELECT 1 '||
10919                      '                   FROM '||l_ext_vl_table_name||
10920                      '                  WHERE 1=1 ';
10921 
10922     IF(l_ag_id_col_exists) THEN
10923         l_dynamic_sql := l_dynamic_sql||'  AND ATTR_GROUP_ID = INTRFC.ATTR_GROUP_ID ';
10924     END IF;
10925 
10926     l_dynamic_sql := l_dynamic_sql||l_ext_intf_pk_join_sql||l_ext_intf_dl_join_sql;
10927 
10928     l_uk_where_caluse := '';
10929     l_str_attr_decode_list_Ext := '';
10930     l_num_attr_decode_list_Ext := '';
10931     l_date_attr_decode_list_Ext := '';
10932     l_uk_attr_list := '';
10933     --FP bug 8274031
10934     l_str_attr_decode_list_Intf := '';
10935     l_num_attr_decode_list_Intf := '';
10936     l_date_attr_decode_list_Intf := '';
10937     --FP bug 8274031
10938     l_attr_metadata_table := l_attr_group_metadata_obj.ATTR_METADATA_TABLE;
10939     ------------------------------------------------------
10940     -- Looping through the attrs for building the SQL
10941     ------------------------------------------------------
10942     FOR i IN l_attr_metadata_table.FIRST .. l_attr_metadata_table.LAST
10943     LOOP
10944 
10945       IF (l_attr_group_metadata_obj.MULTI_ROW_CODE = 'Y' AND l_attr_metadata_table(i).UNIQUE_KEY_FLAG = 'Y') THEN
10946 
10947           l_uk_attr_list := l_uk_attr_list||' '''||l_attr_metadata_table(i).ATTR_NAME||''', ';
10948           IF (l_attr_metadata_table(i).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
10949 
10950               l_uk_where_caluse := l_uk_where_caluse||
10951                        ' AND NVL('||l_attr_metadata_table(i).DATABASE_COLUMN||', '||G_NULL_TOKEN_NUM||' ) '||
10952                        '   = NVL((SELECT ATTR_VALUE_NUM '||
10953                        '            FROM '||p_interface_table_name||' UAI '||
10954                        '           WHERE UAI.DATA_SET_ID = :data_set_id '||
10955                        '             AND UAI.ATTR_GROUP_INT_NAME = '''||l_attr_group_int_name||''' '||
10956                        '             AND UAI.PROCESS_STATUS = '||G_PS_IN_PROCESS||
10957                        '             AND UAI.ATTR_INT_NAME = '''||l_attr_metadata_table(i).ATTR_NAME||''' '||
10958                        '             AND UAI.ROW_IDENTIFIER = INTRFC.ROW_IDENTIFIER '||
10959                        '          ) '||
10960                        '          ,'||G_NULL_TOKEN_NUM||' ) ';
10961 
10962            ELSIF (l_attr_metadata_table(i).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE OR
10963                  l_attr_metadata_table(i).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE) THEN
10964 
10965               l_uk_where_caluse := l_uk_where_caluse||
10966                        ' AND NVL('||l_attr_metadata_table(i).DATABASE_COLUMN||', '||G_NULL_TOKEN_DATE||' ) '||
10967                        '   = NVL((SELECT ATTR_VALUE_DATE '||
10968                        '            FROM '||p_interface_table_name||' UAI '||
10969                        '           WHERE UAI.DATA_SET_ID = :data_set_id '||
10970                        '             AND UAI.ATTR_GROUP_INT_NAME = '''||l_attr_group_int_name||''' '||
10971                        '             AND UAI.PROCESS_STATUS = '||G_PS_IN_PROCESS||
10972                        '             AND UAI.ATTR_INT_NAME = '''||l_attr_metadata_table(i).ATTR_NAME||''' '||
10973                        '             AND UAI.ROW_IDENTIFIER = INTRFC.ROW_IDENTIFIER '||
10974                        '          ) '||
10975                        '          ,'||G_NULL_TOKEN_DATE||' ) ';
10976 
10977           ELSE
10978 
10979               l_uk_where_caluse := l_uk_where_caluse||
10980                        ' AND NVL('||l_attr_metadata_table(i).DATABASE_COLUMN||', '||G_NULL_TOKEN_STR||' ) '||
10981                        '   = NVL((SELECT ATTR_VALUE_STR '||
10982                        '            FROM '||p_interface_table_name||' UAI '||
10983                        '           WHERE UAI.DATA_SET_ID = :data_set_id '||
10984                        '             AND UAI.ATTR_GROUP_INT_NAME = '''||l_attr_group_int_name||''' '||
10985                        '             AND UAI.PROCESS_STATUS = '||G_PS_IN_PROCESS||
10986                        '             AND UAI.ATTR_INT_NAME = '''||l_attr_metadata_table(i).ATTR_NAME||''' '||
10987                        '             AND UAI.ROW_IDENTIFIER = INTRFC.ROW_IDENTIFIER '||
10988                        '          ) '||
10989                        '          ,'||G_NULL_TOKEN_STR||' ) ';
10990 
10991           END IF;
10992 
10993       ELSE -- If the AG is not multi row and the attr being processed is not a UK
10994 
10995           IF (l_attr_metadata_table(i).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_NUMBER_DATA_TYPE) THEN
10996               l_num_attr_decode_list_Ext := l_num_attr_decode_list_Ext||' ,'''||l_attr_metadata_table(i).ATTR_NAME||''' ,'||l_attr_metadata_table(i).DATABASE_COLUMN;
10997               l_num_attr_decode_list_Intf := l_num_attr_decode_list_Intf||' ,'''||l_attr_metadata_table(i).ATTR_NAME||''' , INTRFC.ATTR_VALUE_NUM ';
10998           ELSIF (l_attr_metadata_table(i).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_DATA_TYPE OR
10999                  l_attr_metadata_table(i).DATA_TYPE_CODE = EGO_EXT_FWK_PUB.G_DATE_TIME_DATA_TYPE) THEN
11000               l_date_attr_decode_list_Ext := l_date_attr_decode_list_Ext||' ,'''||l_attr_metadata_table(i).ATTR_NAME||''' ,'||l_attr_metadata_table(i).DATABASE_COLUMN;
11001               l_date_attr_decode_list_Intf := l_date_attr_decode_list_Intf||' ,'''||l_attr_metadata_table(i).ATTR_NAME||''' , INTRFC.ATTR_VALUE_DATE ';
11002           ELSE
11003               l_str_attr_decode_list_Ext := l_str_attr_decode_list_Ext||' ,'''||l_attr_metadata_table(i).ATTR_NAME||''' ,'||l_attr_metadata_table(i).DATABASE_COLUMN;
11004               l_str_attr_decode_list_Intf := l_str_attr_decode_list_Intf||' ,'''||l_attr_metadata_table(i).ATTR_NAME||''' , INTRFC.ATTR_VALUE_STR ';
11005           END IF;
11006 
11007       END IF;
11008 
11009     END LOOP;
11010 
11011     -------------------------------------------------------------------
11012     -- Appending whatever we built in the attr loop above to the DML --
11013     -------------------------------------------------------------------
11014     IF( LENGTH(l_num_attr_decode_list_Ext)>2 ) THEN
11015       l_dynamic_sql := l_dynamic_sql||'  AND NVL(DECODE(INTRFC.ATTR_INT_NAME '||l_num_attr_decode_list_Intf||', NULL),'||G_NULL_TOKEN_NUM||' ) '||
11016                                       '   =  NVL(DECODE(INTRFC.ATTR_INT_NAME '||l_num_attr_decode_list_Ext||', NULL),'||G_NULL_TOKEN_NUM||' ) ';
11017     END IF;
11018 
11019     IF( LENGTH(l_date_attr_decode_list_Ext)>2 ) THEN
11020       l_dynamic_sql := l_dynamic_sql||'  AND NVL(DECODE(INTRFC.ATTR_INT_NAME '||l_date_attr_decode_list_Intf||', NULL),'||G_NULL_TOKEN_DATE||' ) '||
11021                                       '   =  NVL(DECODE(INTRFC.ATTR_INT_NAME '||l_date_attr_decode_list_Ext||', NULL),'||G_NULL_TOKEN_DATE||' ) ';
11022     END IF;
11023 
11024     IF( LENGTH(l_str_attr_decode_list_Ext)>2 ) THEN
11025       l_dynamic_sql := l_dynamic_sql||'  AND NVL(DECODE(INTRFC.ATTR_INT_NAME '||l_str_attr_decode_list_Intf||', NULL),'||G_NULL_TOKEN_STR||' ) '||
11026                                       '   =  NVL(DECODE(INTRFC.ATTR_INT_NAME '||l_str_attr_decode_list_Ext||', NULL),'||G_NULL_TOKEN_STR||' ) ';
11027     END IF;
11028 
11029     l_dynamic_sql := l_dynamic_sql||l_uk_where_caluse||')';
11030 
11031     IF(LENGTH(l_uk_attr_list)>3) THEN
11032       l_dynamic_sql := l_dynamic_sql||' AND ATTR_INT_NAME NOT IN ('||l_uk_attr_list||' ''!@#$%^'')';
11033     END IF;
11034 
11035     ---------------------------------
11036     -- Executing the Final DML     --
11037     ----------------------------------
11038     IF(l_dyn_cursor IS NULL ) THEN
11039       l_dyn_cursor := DBMS_SQL.Open_Cursor;
11040     END IF;
11041     DBMS_SQL.Parse(l_dyn_cursor, l_dynamic_sql, DBMS_SQL.NATIVE);
11042     DBMS_SQL.Bind_Variable(l_dyn_cursor, ':data_set_id', p_data_set_id);
11043     l_dummy := DBMS_SQL.Execute(l_dyn_cursor);
11044    END LOOP; --Ending the loop for distinct AG's
11045 
11046    IF (l_dyn_cursor IS NOT NULL) THEN
11047      DBMS_SQL.Close_Cursor(l_dyn_cursor);
11048    END IF;
11049 
11050   --------------------------------
11051   -- Standard check of p_commit --
11052   --------------------------------
11053   IF FND_API.To_Boolean(p_commit) THEN
11054     COMMIT WORK;
11055   END IF;
11056 
11057   x_return_status := FND_API.G_RET_STS_SUCCESS;
11058 
11059 EXCEPTION
11060   WHEN OTHERS THEN
11061    x_return_status  := FND_API.G_RET_STS_UNEXP_ERROR;
11062    x_msg_data := 'Executing - EGO_USER_ATTRS_BULK_PVT.Mark_Unchanged_Attr_Rows: '||SQLERRM;
11063 
11064 
11065 END Mark_Unchanged_Attr_Rows;
11066 
11067 -- abedajna Bug 6322809
11068 
11069 -- This procedure finds the starting index of the 'final' order by clause in a sql.
11070 -- Consider the following sql:
11071 -- select * from (select * from abb_vs order by id desc) where rownum < 4 order by
11072 -- ( select id from (select id from abb_vs order by id) where rownum = 1 ) asc
11073 -- In this case, this method will return the starting index of the last order by clause
11074 -- that is used to "order" the query result, in contrast with the order by clause
11075 -- which is used as an integral part of the query to "determine" the query result
11076 
11077 -- Algorithm used:
11078 -- Is the whereclause null? exit ; else continue
11079 -- Does the whereclause start with order by? exit ; else continue
11080 -- Only /* ... */ type of comments are allowed in value set whereclauses. Parse the query to strip
11081 -- it of all comments. Users may put parentheses in comments that can interefere with the following algorithm.
11082 -- Start investigating the remaining whereclause from the end.
11083 -- Get the position of the first order by clause (i.e. the last one).
11084 -- Calculate the number of '(' and the number of ')' after the order by clause.
11085 -- Are they equal? If yes, that's the last order by.
11086 -- No? Get the order by prior to that, from the end of the string, backwards, and repeat the same calculation.
11087 -- When you get the target order by clause, seperate it out, take the rest of the whereclause,
11088 -- assuming it's not null, wrap it around parenthesis, add it back to the whereclause and return the result.
11089 
11090 function process_whereclause (p_whereclausein in varchar2) return varchar2 is
11091 len number;
11092 pos number;
11093 cls varchar2(32767);
11094 startcomment number;
11095 endcomment number;
11096 l_whereclausein varchar2(32767);
11097 begin
11098 
11099 --Bug 9733672, adding the validations about where clause with null value
11100 /*if p_whereclausein is null then
11101     return null;
11102 end if;*/
11103 IF (Length(Trim(p_whereclausein)) IS NULL OR Length(Trim(p_whereclausein)) < 3) THEN
11104   RETURN p_whereclausein;
11105 ELSE
11106 
11107 --if ( ( instr(p_whereclausein, '(', 1,1) = 1 ) AND ( instr(p_whereclausein,')', -1,1) = length(p_whereclausein) ) ) then
11108 --    return p_whereclausein;
11109 --end if;
11110 
11111 startcomment := instr(p_whereclausein, '/*', 1,1);
11112 endcomment := instr(p_whereclausein, '*/', 1,1);
11113 if (( startcomment <> 0 ) OR (endcomment <> 0)) then
11114     if (( startcomment <> 0 ) AND (endcomment <> 0) AND (startcomment <
11115 endcomment))  then
11116         l_whereclausein := substr(p_whereclausein, 1, startcomment - 1) ||
11117 substr(p_whereclausein, endcomment + 2);
11118     else
11119         return p_whereclausein; -- unlikely case
11120     end if;
11121 else
11122     l_whereclausein := p_whereclausein;
11123 end if;
11124 
11125 len := length(l_whereclausein);
11126 
11127 pos := get_order_by( l_whereclausein, len );
11128 
11129 if pos <> 0 then
11130     cls := substr( l_whereclausein, 1, pos-1 );
11131     if ( cls is not null ) then
11132         return '('||cls||')'||substr(l_whereclausein, pos);
11133     -- Sean, bug 12910136, add the return value for else case
11134     else
11135         return '('||l_whereclausein||')';
11136     end if;
11137 else
11138     return '('||l_whereclausein||')';
11139 end if;
11140 END IF;  --end if for 'IF (Length(Trim(p_whereclausein)) IS NULL ) THEN'
11141 end process_whereclause;
11142 
11143 
11144 -- abedajna Bug 6322809
11145 function get_num_occur (p_string in varchar2, p_char in varchar2) return number
11146 is
11147 startpos number := 1;
11148 currentpos number := 0;
11149 num_occur number := 0;
11150 begin
11151 loop
11152     currentpos := instr(p_string, p_char, startpos);
11153     exit when currentpos = 0;
11154     num_occur := num_occur + 1;
11155     startpos := currentpos + 1;
11156 end loop;
11157 return num_occur;
11158 end get_num_occur;
11159 
11160 
11161 -- abedajna Bug 6322809
11162 function get_order_by (p_whereclause in varchar2, p_len in number) return number
11163 is
11164 pos number := 0;
11165 startpos number := -1;
11166 begin
11167 loop
11168     pos := instr(upper(p_whereclause), 'ORDER BY', startpos, 1);
11169     exit when pos = 0;
11170     if ( get_num_occur( substr(p_whereclause, pos), '(' ) = get_num_occur( substr(p_whereclause, pos), ')' ) ) then
11171         return pos;
11172     end if;
11173     startpos := (-1) * (p_len - pos + 2);
11174 end loop;
11175 return 0;
11176 end get_order_by;
11177 
11178 END EGO_USER_ATTRS_BULK_PVT;