DBA Data[Home] [Help]

PACKAGE BODY: APPS.FUN_RULE_UTILITY_PKG

Source


1 PACKAGE BODY FUN_RULE_UTILITY_PKG AS
2 /*$Header: FUNXTMRULGENUTB.pls 120.3 2006/02/22 10:51:20 ammishra noship $ */
3 
4 --------------------------------------
5 -- declaration of private global varibles
6 --------------------------------------
7 
8 G_SPECIAL_STRING                        CONSTANT VARCHAR2(4):= '%#@*';
9 G_LENGTH                                CONSTANT NUMBER := LENGTHB( G_SPECIAL_STRING );
10 
11 TYPE VAL_TAB_TYPE IS TABLE OF VARCHAR2(255) INDEX BY BINARY_INTEGER;
12 
13 -- file handler we will use for log file.
14 G_FILE                                  UTL_FILE.FILE_TYPE;
15 
16 -- running in file debug mode.
17 G_FILE_DEBUG                            BOOLEAN := FALSE;
18 G_FILE_NAME                             VARCHAR2(100);
19 G_FILE_PATH                             VARCHAR2(200);
20 
21 -- running in normal debug mode by calling dbms_output.
22 G_DBMS_DEBUG                            BOOLEAN := FALSE;
23 
24 -- buffer size used by dbms_output.debug
25 G_BUFFER_SIZE                           CONSTANT NUMBER := 1000000;
26 G_MAX_LINE_SIZE_OF_FILE                 CONSTANT NUMBER := 1023;
27 G_MAX_LINE_SIZE_OF_DBMS                 CONSTANT NUMBER := 255;
28 
29 -- level of debug has been called.
30 G_COUNT                                 NUMBER := 0;
31 
32 --------------------------------------
33 -- define the internal table that will cache values
34 --------------------------------------
35 
36 VAL_TAB                                 VAL_TAB_TYPE;    -- the table of values
37 TABLE_SIZE                              BINARY_INTEGER := 2048; -- the size of above tables
38 LOOKUP_MEANING_TAB                      VAL_TAB_TYPE;
39 
40 
41 INVAILD_DATA_TYPE                       EXCEPTION;
42 INVAILD_LENGTH_TYPE                     EXCEPTION;
43 --------------------------------------
44 -- declaration of private procedures and functions
45 --------------------------------------
46 
47 FUNCTION get_index (
48     p_val                               IN     VARCHAR2
49 ) RETURN BINARY_INTEGER;
50 
51 FUNCTION put (
52     p_val                               IN     VARCHAR2
53 ) RETURN BINARY_INTEGER;
54 
55 FUNCTION search (
56     p_val                               IN     VARCHAR2,
57     p_category                          IN     VARCHAR2
58 ) RETURN BOOLEAN;
59 
60 
61 FUNCTION search (
62     p_val                               IN     VARCHAR2,
63     p_category                          IN     VARCHAR2,
64     x_lookup_meaning                    OUT NOCOPY    VARCHAR2
65 ) RETURN BOOLEAN;
66 
67 --------------------------------------
68 -- private procedures and functions
69 --------------------------------------
70 /**
71  * PRIVATE FUNCTION get_index
72  *
73  * DESCRIPTION
74  *     Gets index in caching table for a specified value.
75  *
76  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
77  *
78  * ARGUMENTS
79  *   IN:
80  *     p_val                          Specified value.
81  *
82  * NOTES
83  *
84  * MODIFICATION HISTORY
85  *
86  *   10-Sep-2004   Amulya Mishra       Created.
87  *
88  */
89 
90 FUNCTION get_index (
91     p_val                               IN     VARCHAR2
92 ) RETURN BINARY_INTEGER IS
93 
94     l_table_index                       BINARY_INTEGER;
95     l_found                             BOOLEAN := FALSE;
96     l_hash_value                        NUMBER;
97 
98 BEGIN
99 
100     l_table_index := DBMS_UTILITY.get_hash_value( p_val, 1, TABLE_SIZE );
101 
102     IF VAL_TAB.EXISTS(l_table_index) THEN
103         IF VAL_TAB(l_table_index) = p_val THEN
104             RETURN l_table_index;
105         ELSE
106             l_hash_value := l_table_index;
107             l_table_index := l_table_index + 1;
108             l_found := FALSE;
109 
110             WHILE ( l_table_index < TABLE_SIZE ) AND ( NOT l_found ) LOOP
111                 IF VAL_TAB.EXISTS(l_table_index) THEN
112                     IF VAL_TAB(l_table_index) = p_val THEN
113                         l_found := TRUE;
114                     ELSE
115                         l_table_index := l_table_index + 1;
116                     END IF;
117                 ELSE
118                     RETURN TABLE_SIZE + 1;
119                 END IF;
120             END LOOP;
121 
122             IF NOT l_found THEN  -- Didn't find any till the end
123                 l_table_index := 1;  -- Start from the beginning
124 
125                 WHILE ( l_table_index < l_hash_value ) AND ( NOT l_found ) LOOP
126                     IF VAL_TAB.EXISTS(l_table_index) THEN
127                         IF VAL_TAB(l_table_index) = p_val THEN
128                             l_found := TRUE;
129                         ELSE
130                             l_table_index := l_table_index + 1;
131                         END IF;
132                     ELSE
133                         RETURN TABLE_SIZE + 1;
134                     END IF;
135                 END LOOP;
136             END IF;
137 
138             IF NOT l_found THEN
139                 RETURN TABLE_SIZE + 1;  -- Return a higher value
140             END IF;
141         END IF;
142     ELSE
143         RETURN TABLE_SIZE + 1;
144     END IF;
145 
146     RETURN l_table_index;
147 
148 EXCEPTION
149     WHEN OTHERS THEN  -- The entry doesn't exists
150         RETURN TABLE_SIZE + 1;
151 
152 END get_index;
153 
154 /**
155  * PRIVATE FUNCTION put
156  *
157  * DESCRIPTION
158  *     Put value in caching table and return table index.
159  *
160  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
161  *
162  * ARGUMENTS
163  *   IN:
164  *     p_val                          Specified value.
165  *
166  * NOTES
167  *
168  * MODIFICATION HISTORY
169  *
170  *   10-Sep-2004   Amulya Mishra       Created.
171  *
172  */
173 
174 FUNCTION put (
175     p_val                               IN     VARCHAR2
176 ) RETURN BINARY_INTEGER IS
177 
178     l_table_index                       BINARY_INTEGER;
179     l_stored                            BOOLEAN := FALSE;
180     l_hash_value                        NUMBER;
181 
182 BEGIN
183 
184     l_table_index := DBMS_UTILITY.get_hash_value( p_val, 1, TABLE_SIZE );
185 
186     IF VAL_TAB.EXISTS(l_table_index) THEN
187         IF VAL_TAB(l_table_index) <> p_val THEN --Collision
188             l_hash_value := l_table_index;
189             l_table_index := l_table_index + 1;
190 
191             WHILE (l_table_index < TABLE_SIZE) AND (NOT l_stored) LOOP
192                 IF VAL_TAB.EXISTS(l_table_index) THEN
193                     IF VAL_TAB(l_table_index) <> p_val THEN
194                         l_table_index := l_table_index + 1;
195                     END IF;
196                 ELSE
197                     VAL_TAB(l_table_index) := p_val;
198                     l_stored := TRUE;
199                 END IF;
200             END LOOP;
201 
202             IF NOT l_stored THEN --Didn't find any free bucket till the end
203                 l_table_index := 1;
204 
205                 WHILE (l_table_index < l_hash_value) AND (NOT l_stored) LOOP
206                     IF VAL_TAB.EXISTS(l_table_index) THEN
207                         IF VAL_TAB(l_table_index) <> p_val THEN
208                             l_table_index := l_table_index + 1;
209                         END IF;
210                     ELSE
211                         VAL_TAB(l_table_index) := p_val;
212                         l_stored := TRUE;
213                     END IF;
214                 END LOOP;
215             END IF;
216 
217         END IF;
218     ELSE
219         VAL_TAB(l_table_index) := p_val;
220     END IF;
221 
222     RETURN l_table_index;
223 EXCEPTION
224     WHEN OTHERS THEN
225         NULL;
226 
227 END put;
228 
229 /**
230  * PRIVATE FUNCTION search
231  *
232  * DESCRIPTION
233  *     Find value with a specified category, for instance, lookup.
234  *
235  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
236  *
237  * ARGUMENTS
238  *   IN:
239  *     p_val                          Specified value.
240  *     p_category                     Value category. We only support
241  *                                    category LOOKUP for now.
242  *   OUT:
243  *     x_lookup_meaning               Lookup Meaning
244  *
245  * NOTES
246  *
247  * MODIFICATION HISTORY
248  *
249  *   10-Sep-2004   Amulya Mishra       Created.
250  *
251  */
252 
253 FUNCTION search (
254     p_val                               IN     VARCHAR2,
255     p_category                          IN     VARCHAR2,
256     x_lookup_meaning                    OUT NOCOPY    VARCHAR2
257 ) RETURN BOOLEAN IS
258 
259     l_table_index                       BINARY_INTEGER;
260     l_return                            BOOLEAN;
261 
262     l_dummy                             VARCHAR2(1);
263     l_position1                         NUMBER;
264     l_position2                         NUMBER;
265 
266     l_lookup_table                      VARCHAR2(30);
267     l_lookup_type                       AR_LOOKUPS.lookup_type%TYPE;
268     l_lookup_code                       AR_LOOKUPS.lookup_code%TYPE;
269 
270     l_relationship_type                 VARCHAR2(30);
271     l_incl_unrelated_entities           VARCHAR2(1);
272 
273 BEGIN
274 
275     -- search for the value
276     l_table_index := get_index( p_val || G_SPECIAL_STRING || p_category );
277 
278     IF l_table_index < table_size THEN
279          l_return := TRUE;
280          IF p_category = 'LOOKUP' THEN
281            x_lookup_meaning := LOOKUP_MEANING_TAB(l_table_index);
282          END IF;
283     ELSE
284         --Can't find the value in the table; look in the database
285         IF p_category = 'LOOKUP' THEN
286 
287             l_position1 := INSTRB( p_val, G_SPECIAL_STRING, 1, 1 );
288             l_lookup_table := SUBSTRB( p_val, 1, l_position1 - 1 );
289             l_position2 := INSTRB( p_val, G_SPECIAL_STRING, 1, 2 );
290             l_lookup_type := SUBSTRB( p_val, l_position1 + G_LENGTH,
291                                      l_position2  - l_position1 - G_LENGTH );
292             l_lookup_code := SUBSTRB( p_val, l_position2 + G_LENGTH );
293 
294             IF UPPER( l_lookup_table ) = 'AR_LOOKUPS' THEN
295             BEGIN
296                 SELECT meaning INTO x_lookup_meaning
297                 FROM   AR_LOOKUPS
298                 WHERE  LOOKUP_TYPE = l_lookup_type
299                 AND    LOOKUP_CODE = l_lookup_code
300                 AND    ( ENABLED_FLAG = 'Y' AND
301                          TRUNC( SYSDATE ) BETWEEN
302                          TRUNC(NVL( START_DATE_ACTIVE,SYSDATE ) ) AND
303                          TRUNC(NVL( END_DATE_ACTIVE,SYSDATE ) ) );
304 
305                 l_return := TRUE;
306             EXCEPTION
307                 WHEN NO_DATA_FOUND THEN
308                     l_return := FALSE;
309             END;
310             ELSIF UPPER( l_lookup_table ) = 'SO_LOOKUPS' THEN
311             BEGIN
312                 SELECT meaning INTO x_lookup_meaning
313                 FROM   SO_LOOKUPS
314                 WHERE  LOOKUP_TYPE = l_lookup_type
315                 AND    LOOKUP_CODE = l_lookup_code
316                 AND    ( ENABLED_FLAG = 'Y' AND
317                          TRUNC( SYSDATE ) BETWEEN
318                          TRUNC(NVL( START_DATE_ACTIVE,SYSDATE ) ) AND
319                          TRUNC(NVL( END_DATE_ACTIVE,SYSDATE ) ) );
320 
321                 l_return := TRUE;
322             EXCEPTION
323                 WHEN NO_DATA_FOUND THEN
324                     l_return := FALSE;
325             END;
326             ELSIF UPPER( l_lookup_table ) = 'OE_SHIP_METHODS_V' THEN
327             BEGIN
328                 SELECT meaning INTO x_lookup_meaning
329                 FROM   OE_SHIP_METHODS_V
330                 WHERE  LOOKUP_TYPE = l_lookup_type
331                 AND    LOOKUP_CODE = l_lookup_code
332                 AND    ( ENABLED_FLAG = 'Y' AND
333                          TRUNC( SYSDATE ) BETWEEN
334                          TRUNC(NVL( START_DATE_ACTIVE,SYSDATE ) ) AND
335                          TRUNC(NVL( END_DATE_ACTIVE,SYSDATE ) ) )
336                 AND    ROWNUM = 1;
337 
338                 l_return := TRUE;
339             EXCEPTION
340                 WHEN NO_DATA_FOUND THEN
341                     l_return := FALSE;
342             END;
343             ELSIF UPPER( l_lookup_table ) = 'FND_LOOKUP_VALUES' THEN
344             BEGIN
345                 SELECT meaning INTO x_lookup_meaning
346                 FROM   FND_LOOKUP_VALUES
347                 WHERE  LOOKUP_TYPE = l_lookup_type
348                 AND    LOOKUP_CODE = l_lookup_code
349                 AND    ( ENABLED_FLAG = 'Y' AND
350                          TRUNC( SYSDATE ) BETWEEN
351                          TRUNC(NVL( START_DATE_ACTIVE,SYSDATE ) ) AND
352                          TRUNC(NVL( END_DATE_ACTIVE,SYSDATE ) ) )
353                 AND    ROWNUM = 1;
354 
355                 l_return := TRUE;
356             EXCEPTION
357                 WHEN NO_DATA_FOUND THEN
358                     l_return := FALSE;
359             END;
360             ELSIF UPPER( l_lookup_table ) = 'FND_LANGUAGES' THEN
361             BEGIN
362                 SELECT nls_language INTO x_lookup_meaning
363                 FROM   FND_LANGUAGES
364                 WHERE  LANGUAGE_CODE = l_lookup_code;
365 
366                 l_return := TRUE;
367             EXCEPTION
368                 WHEN NO_DATA_FOUND THEN
369                     l_return := FALSE;
370             END;
371 
372             ELSE
373                 l_return := FALSE;
374             END IF;
375 
376         -- added the following section for caching of incl_unrelated_entities
377         -- column value for hz_relationship_types records.
378         ELSIF p_category = 'RELATIONSHIP_TYPE' THEN
379 
380             l_position1 := INSTRB( p_val, G_SPECIAL_STRING, 1, 1 );
381             l_relationship_type := SUBSTRB( p_val, 1, l_position1 - 1 );
382 
383             BEGIN
384                 SELECT INCL_UNRELATED_ENTITIES INTO l_dummy
385                 FROM   HZ_RELATIONSHIP_TYPES
386                 WHERE  RELATIONSHIP_TYPE = l_relationship_type
387                 AND    ROWNUM = 1;
388 
389                 IF l_dummy = 'Y' THEN
390                     l_return := TRUE;
391                 ELSE
392                     l_return := FALSE;
393                 END IF;
394 
395             EXCEPTION
396                 WHEN NO_DATA_FOUND THEN
397                     l_return := FALSE;
398             END;
399 
400         END IF;
401 
402         --Cache the value
403         IF l_return THEN
404            l_table_index := put( p_val || G_SPECIAL_STRING || p_category );
405            IF p_category = 'LOOKUP' THEN
406                LOOKUP_MEANING_TAB(l_table_index) := x_lookup_meaning;
407            END IF;
408         END IF;
409     END IF;
410 
411     RETURN l_return;
412 
413 END search;
414 
415 /**
416  * PRIVATE FUNCTION search
417  *
418  * DESCRIPTION
419  *     Find value with a specified category, for instance, lookup.
420  *
421  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
422  *
423  * ARGUMENTS
424  *   IN:
425  *     p_val                          Specified value.
426  *     p_category                     Value category. We only support
427  *                                    category LOOKUP for now.
428  * NOTES
429  *
430  * MODIFICATION HISTORY
431  *
432  *   10-Sep-2004    Amulya Mishra       Created.
433  *
434  */
435 
436 FUNCTION search (
437     p_val                               IN     VARCHAR2,
438     p_category                          IN     VARCHAR2
439 ) RETURN BOOLEAN IS
440 
441     l_lookup_meaning                    VARCHAR2(100);
442 
443 BEGIN
444     RETURN search(p_val, p_category, l_lookup_meaning);
445 END search;
446 
447 
448 /**
449  * FUNCTION get_session_process_id
450  *
451  * DESCRIPTION
452  *     Return OS process id of current session.
453  *
454  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
455  *
456  * ARGUMENTS
457  *   IN:
458  *
459  * NOTES
460  *
461  * MODIFICATION HISTORY
462  *
463  *   10-Sep-2004    Amulya Mishra      Created.
464  *
465  */
466 
467 FUNCTION get_session_process_id RETURN VARCHAR2 IS
468 
469     l_spid                                  V$PROCESS.spid%TYPE;
470 
471 BEGIN
472 
473     SELECT SPID INTO l_spid
474     FROM V$PROCESS
475     WHERE ADDR = (
476         SELECT PADDR
477         FROM V$SESSION
478         WHERE AUDSID = USERENV('SESSIONID') );
479 
480     RETURN ( l_spid );
481 
482 END get_session_process_id;
483 
484 /**
485  * FUNCTION
486  *     created_by
487  *     creation_date
488  *     last_updated_by
489  *     last_update_date
490  *     last_update_login
491  *     request_id
492  *     program_id
493  *     program_application_id
494  *     program_update_date
495  *     user_id
496  *     application_id
497  *
498  * DESCRIPTION
499  *     Return standard who value.
500  *
501  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
502  *
503  * ARGUMENTS
504  *   IN:
505  *
506  * NOTES
507  *
508  * MODIFICATION HISTORY
509  *
510  *   10-Sep-2004   Amulya Mishra      Created.
511  */
512 
513 FUNCTION created_by RETURN NUMBER IS
514 BEGIN
515 
516     RETURN NVL(FND_GLOBAL.user_id,-1);
517 
518 END created_by;
519 
520 FUNCTION creation_date RETURN DATE IS
521 BEGIN
522 
523     RETURN SYSDATE;
524 
525 END creation_date;
526 
527 FUNCTION last_updated_by RETURN NUMBER IS
528 BEGIN
529 
530     RETURN NVL(FND_GLOBAL.user_id,-1);
531 
532 END last_updated_by;
533 
534 FUNCTION last_update_date RETURN DATE IS
535 BEGIN
536 
537     RETURN SYSDATE;
538 
539 END last_update_date;
540 
541 FUNCTION last_update_login RETURN NUMBER IS
542 BEGIN
543 
544     IF FND_GLOBAL.conc_login_id = -1 OR
545        FND_GLOBAL.conc_login_id IS NULL
546     THEN
547         RETURN FND_GLOBAL.login_id;
548     ELSE
549         RETURN FND_GLOBAL.conc_login_id;
550     END IF;
551 
552 END last_update_login;
553 
554 FUNCTION request_id RETURN NUMBER IS
555 BEGIN
556 
557     IF FND_GLOBAL.conc_request_id = -1 OR
558        FND_GLOBAL.conc_request_id IS NULL
559     THEN
560         RETURN NULL;
561     ELSE
562         RETURN FND_GLOBAL.conc_request_id;
563     END IF;
564 
565 END request_id;
566 
567 FUNCTION program_id RETURN NUMBER IS
568 BEGIN
569 
570     IF FND_GLOBAL.conc_program_id = -1 OR
571        FND_GLOBAL.conc_program_id IS NULL
572     THEN
573         RETURN NULL;
574     ELSE
575         RETURN FND_GLOBAL.conc_program_id;
576     END IF;
577 
578 END program_id;
579 
580 FUNCTION program_application_id RETURN NUMBER IS
581 BEGIN
582 
583     IF FND_GLOBAL.prog_appl_id = -1 OR
584        FND_GLOBAL.prog_appl_id IS NULL
585     THEN
586         RETURN NULL;
587     ELSE
588         RETURN FND_GLOBAL.prog_appl_id;
589     END IF;
590 
591 END program_application_id;
592 
593 FUNCTION application_id RETURN NUMBER IS
594 BEGIN
595 
596     IF FND_GLOBAL.resp_appl_id = -1 OR
597        FND_GLOBAL.resp_appl_id IS NULL
598     THEN
599         RETURN NULL;
600     ELSE
601         RETURN FND_GLOBAL.resp_appl_id;
602     END IF;
603 
604 END application_id;
605 
606 FUNCTION program_update_date RETURN DATE IS
607 BEGIN
608 
609     IF program_id IS NULL THEN
610         RETURN NULL;
611     ELSE
612         RETURN SYSDATE;
613     END IF;
614 
615 END program_update_date;
616 
617 FUNCTION user_id RETURN NUMBER IS
618 BEGIN
619 
620     RETURN NVL(FND_GLOBAL.user_id,-1);
621 
622 END user_id;
623 
624 FUNCTION Get_SchemaName (
625     p_app_short_name             IN     VARCHAR2
626 ) RETURN VARCHAR2 IS
627 
628     l_status                     VARCHAR2(30);
629     l_industry                   VARCHAR2(30);
630     l_schema_name                VARCHAR2(30);
631     l_return_value               BOOLEAN;
632 
633 BEGIN
634 
635     l_return_value := fnd_installation.get_app_info(
636         p_app_short_name, l_status, l_industry, l_schema_name);
637 
638     IF l_schema_name IS NULL THEN
639       fnd_message.set_name('FND','FND_NO_SCHEMA_NAME');
640       fnd_message.set_token('SCHEMA_NAME',p_app_short_name);
641       fnd_msg_pub.add;
642       RAISE fnd_api.g_exc_unexpected_error;
643     ELSE
644       RETURN l_schema_name;
645     END IF;
646 
647 END Get_SchemaName;
648 
649 
650 FUNCTION Get_AppsSchemaName RETURN VARCHAR2 IS
651 
652     l_aol_schema                 VARCHAR2(30);
653     l_apps_schema                VARCHAR2(30);
654     l_apps_mls_schema            VARCHAR2(30);
655 
656 BEGIN
657 
658     l_aol_schema := Get_SchemaName('FND');
659     system.ad_apps_private.get_apps_schema_name(
660         1, l_aol_schema, l_apps_schema, l_apps_mls_schema);
661 
662     RETURN l_apps_schema;
663 
664 END Get_AppsSchemaName;
665 
666 FUNCTION Get_LookupMeaning (
667     p_lookup_table                          IN     VARCHAR2,
668     p_lookup_type                           IN     VARCHAR2,
669     p_lookup_code                           IN     VARCHAR2
670 ) RETURN VARCHAR2 IS
671 
672     l_return                                BOOLEAN;
673     l_lookup_meaning                        VARCHAR2(100);
674 
675 BEGIN
676 
677     l_return := search(p_lookup_table || G_SPECIAL_STRING ||
678                   p_lookup_type || G_SPECIAL_STRING || p_lookup_code,
679                   'LOOKUP', l_lookup_meaning );
680     RETURN l_lookup_meaning;
681 
682 END Get_LookupMeaning;
683 
684 /*
685 
686 PROCEDURE CREATE_DUPLICATE_RULE(
687           p_rule_detail_id IN FUN_RULE_DETAILS.RULE_DETAIL_ID%TYPE,
688           p_rule_object_id IN FUN_RULE_DETAILS.RULE_OBJECT_ID%TYPE
689           ) IS
690 
691 l_next_rule_detail_id        FUN_RULE_DETAILS.RULE_DETAIL_ID%TYPE;
692 l_next_criteria_id           FUN_RULE_CRITERIA.CRITERIA_ID%TYPE;
693 
694 l_rowid                      ROWID;
695 
696 l_rule_detail_id	     FUN_RULE_DETAILS.RULE_DETAIL_ID%TYPE;
697 l_rule_object_id             FUN_RULE_DETAILS.RULE_OBJECT_ID%TYPE;
698 l_rule_name		     FUN_RULE_DETAILS.RULE_NAME%TYPE;
699 l_seq			     FUN_RULE_DETAILS.SEQ%TYPE;
700 l_operator                   FUN_RULE_DETAILS.OPERATOR%TYPE;
701 l_enabled_flag               FUN_RULE_DETAILS.ENABLED_FLAG%TYPE;
702 l_result_application_id      FUN_RULE_DETAILS.RESULT_APPLICATION_ID%TYPE;
703 l_result_value               FUN_RULE_DETAILS.RESULT_VALUE%TYPE;
704 l_created_by_module          FUN_RULE_DETAILS.CREATED_BY_MODULE%TYPE;
705 
706 
707 l_criteria_id                FUN_RULE_CRITERIA.CRITERIA_ID%TYPE;
708 l_criteria_param_name        FUN_RULE_CRITERIA.CRITERIA_PARAM_NAME%TYPE;
709 l_condition                  FUN_RULE_CRITERIA.CONDITION%TYPE;
710 l_param_value                FUN_RULE_CRITERIA.PARAM_VALUE%TYPE;
711 l_case_sensitive             FUN_RULE_CRITERIA.CASE_SENSITIVE%TYPE;
712 
713 
714 CURSOR C IS
715 	SELECT * FROM FUN_RULE_CRITERIA
716 	WHERE  RULE_DETAIL_ID = P_RULE_DETAIL_ID
717 FOR UPDATE NOWAIT;
718 
719 
720 BEGIN
721 
722    SELECT FUN_RULE_DETAILS_S.NEXTVAL
723    INTO l_next_rule_detail_id
724    FROM DUAL;
725 
726    SELECT
727          RULE_OBJECT_ID,
728          RULE_NAME,
729          SEQ,
730          OPERATOR,
731          ENABLED_FLAG,
732          RESULT_APPLICATION_ID,
733          RESULT_VALUE,
734          CREATED_BY_MODULE
735    INTO
736          l_rule_object_id,
737          l_rule_name,
738          l_seq,
739          l_operator,
740          l_enabled_flag,
741          l_result_application_id,
742          l_result_value,
743          l_created_by_module
744 
745    FROM FUN_RULE_DETAILS
746    WHERE RULE_OBJECT_ID = p_rule_object_id
747    AND   RULE_DETAIL_ID = p_rule_detail_id;
748 
749    FUN_RULE_DETAILS_PKG.INSERT_ROW (
750           X_ROWID                                =>l_rowid,
751           X_RULE_DETAIL_ID	                 =>l_next_rule_detail_id,
752           X_RULE_OBJECT_ID                       =>l_rule_object_id,
753           X_RULE_NAME		                 =>l_rule_name,
754           X_SEQ			                 =>l_seq,
755           X_OPERATOR                             =>l_operator,
756           X_ENABLED_FLAG                         =>l_enabled_flag,
757           X_RESULT_APPLICATION_ID                =>l_result_application_id,
758           X_RESULT_VALUE                         =>l_result_value,
759           X_OBJECT_VERSION_NUMBER                =>1,
760           X_CREATED_BY_MODULE                    =>l_created_by_module
761    );
762 
763 --insert criteria records for the duplicate rule.
764 
765 FOR p_rule_criteria_rec IN C LOOP
766 
767     FUN_RULE_CRITERIA_PKG.INSERT_ROW (
768         X_ROWID                           =>l_rowid,
769         X_CRITERIA_ID                     =>p_rule_criteria_rec.criteria_id,
770         X_RULE_DETAIL_ID                  =>l_next_rule_detail_id,
771         X_CRITERIA_PARAM_NAME             =>p_rule_criteria_rec.criteria_param_name,
772         X_CONDITION                       =>p_rule_criteria_rec.condition,
773         X_PARAM_VALUE                     =>p_rule_criteria_rec.param_value,
774         X_CASE_SENSITIVE                  =>p_rule_criteria_rec.case_sensitive,
775         X_OBJECT_VERSION_NUMBER           =>1,
776         X_CREATED_BY_MODULE               =>p_rule_criteria_rec.created_by_module
777     );
778 
779 END LOOP;
780 
781 
782 EXCEPTION
783 
784    WHEN NO_DATA_FOUND THEN
785       FND_MESSAGE.SET_NAME('SQLAP','FUN_NO_RULE_DETAIL');
786       FND_MSG_PUB.ADD;
787       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
788 
789    WHEN OTHERS THEN
790       FND_MESSAGE.SET_NAME('SQLAP','FUN_NO_RULE_DETAIL');
791       FND_MSG_PUB.ADD;
792       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
793 
794 
795 END  CREATE_DUPLICATE_RULE;
796 */
797 
798 FUNCTION GET_MAX_SEQ (
799                      P_RULE_OBJECT_ID IN FUN_RULE_DETAILS.RULE_OBJECT_ID%TYPE
800                      )
801 RETURN NUMBER  IS
802 
803 l_max_seq   FUN_RULE_DETAILS.SEQ%TYPE;
804 
805 BEGIN
806    SELECT MAX(SEQ)+1 INTO l_max_seq
807    FROM FUN_RULE_DETAILS
808    WHERE RULE_OBJECT_ID = P_RULE_OBJECT_ID;
809    RETURN l_max_seq;
810 
811 EXCEPTION
812 
813    WHEN NO_DATA_FOUND THEN
814       RETURN NULL;
815 
816    WHEN OTHERS THEN
817       RETURN NULL;
818 END GET_MAX_SEQ;
819 
820 
821 FUNCTION getApplicationID(p_AppShortName IN VARCHAR2)
822                           RETURN  NUMBER IS
823   l_application_id      NUMBER;
824 BEGIN
825         SELECT  nvl(application_id , 435)
826         INTO    l_application_id
827         FROM    fnd_application
828         WHERE   application_short_name = p_AppShortName;
829 
830         RETURN l_application_id;
831 EXCEPTION
832         WHEN OTHERS THEN
833                 APP_EXCEPTION.RAISE_EXCEPTION;
834 
835 END GetApplicationID;
836 
837 
838 FUNCTION getApplicationShortName(p_ApplicationId IN NUMBER)
839                           RETURN VARCHAR2
840 IS
841   l_application_short_name      VARCHAR2(30);
842 BEGIN
843 
844    if (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
845      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'Start FUN_RULE_UTILITY_PKG.getApplicationShortName', FALSE);
846      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'p_ApplicationId='||to_char(p_ApplicationId), FALSE);
847    end if;
848 
849         SELECT  nvl(application_short_name, 'FUN')
850         INTO    l_application_short_name
851         FROM    fnd_application
852         WHERE   application_id = p_ApplicationId;
853 
854    if (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
855      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'End FUN_RULE_UTILITY_PKG.getApplicationShortName', FALSE);
856      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'l_application_short_name'||l_application_short_name, FALSE);
857    end if;
858 
859         RETURN l_application_short_name;
860 EXCEPTION
861         WHEN OTHERS THEN
862            IF (FND_LOG.LEVEL_EXCEPTION  >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
863 	      FND_LOG.MESSAGE(FND_LOG.LEVEL_EXCEPTION , 'FUN_RULE_UTILITY_PKG.getApplicationShortName:->Exception', FALSE);
864 	      FND_LOG.MESSAGE(FND_LOG.LEVEL_EXCEPTION , SQLERRM, FALSE);
865 	   END IF;
866 
867            APP_EXCEPTION.RAISE_EXCEPTION;
868 
869 END getApplicationShortName;
870 
871 FUNCTION getValueSetDataType(p_ValueSetId  IN NUMBER)
872                           RETURN VARCHAR2
873 IS
874   l_dataType                  VARCHAR2(10);
875   l_maximum_size              NUMBER;
876   params_cursor               INTEGER;
877   params_rows_processed       INTEGER;
878 
879   l_ValueSetSql               VARCHAR2(1000) := 'SELECT FORMAT_TYPE, MAXIMUM_SIZE FROM FND_FLEX_VALUE_SETS WHERE
880                                                  FLEX_VALUE_SET_ID = :1';
881 
882 BEGIN
883 
884    if (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
885      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'Start FUN_RULE_UTILITY_PKG.getValueSetDataType', FALSE);
886      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'p_ValueSetId='||to_char(p_ValueSetId), FALSE);
887    end if;
888 
889    params_cursor := DBMS_SQL.OPEN_CURSOR;
890    DBMS_SQL.PARSE(params_cursor, l_ValueSetSql,DBMS_SQL.native);
891    dbms_sql.bind_variable(params_cursor , '1' , p_ValueSetId);
892 
893    dbms_sql.define_column(params_cursor, 1, l_dataType , 1);
894    dbms_sql.define_column(params_cursor, 2, l_maximum_size);
895 
896    params_rows_processed := DBMS_SQL.EXECUTE(params_cursor);
897 
898    while(dbms_sql.fetch_rows(params_cursor) > 0 ) loop
899      dbms_sql.column_value(params_cursor, 1, l_dataType );
900      dbms_sql.column_value(params_cursor, 2, l_maximum_size );
901 
902      IF (l_dataType = 'C' ) THEN l_dataType := 'STRINGS'; END IF;
903      IF (l_dataType = 'N' ) THEN l_dataType := 'NUMERIC'; END IF;
904      IF (l_dataType = 'D' OR l_dataType = 'X') THEN
905          l_dataType := 'DATE';
906      END IF;
907 
908      -----------------------------------------
909      -- Standard DateTime   - Y              -
910      -- Old      Time       - T              -
911      -- Old      DateTime   - t              -
912      -----------------------------------------
913      IF (l_dataType = 'T' OR l_dataType = 't' OR l_dataType = 'Y') THEN
914         RAISE INVAILD_DATA_TYPE;
915      END IF;
916 
917    end loop;
918 
919    DBMS_SQL.CLOSE_CURSOR(params_cursor);
920 
921    if (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
922      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'End FUN_RULE_UTILITY_PKG.getValueSetDataType', FALSE);
923      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'l_dataType'||l_dataType, FALSE);
924    end if;
925 
926 
927    RETURN l_dataType;
928 
929    EXCEPTION
930        WHEN INVAILD_DATA_TYPE THEN
931 
932         IF (FND_LOG.LEVEL_EXCEPTION  >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
933           FND_LOG.MESSAGE(FND_LOG.LEVEL_EXCEPTION , 'FUN_RULE_UTILITY_PKG.getValueSetDataType:->INVAILD_DATA_TYPE', FALSE);
934         END IF;
935 
936         FND_MESSAGE.SET_NAME('FUN','FUN_RULE_INVALID_CRIT_DATATYPE');
937         FND_MSG_PUB.ADD;
938         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
939 
940        WHEN INVAILD_LENGTH_TYPE THEN
941         IF (FND_LOG.LEVEL_EXCEPTION  >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
942           FND_LOG.MESSAGE(FND_LOG.LEVEL_EXCEPTION , 'FUN_RULE_UTILITY_PKG.getValueSetDataType:->INVAILD_LENGTH_TYPE', FALSE);
943         END IF;
944 
945         FND_MESSAGE.SET_NAME('FUN','FUN_RULE_INVALID_CRIT_LENGTH');
946         FND_MSG_PUB.ADD;
947         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
948 
949        WHEN OTHERS THEN
950   	IF DBMS_SQL.IS_OPEN(params_cursor) THEN
951 	 DBMS_SQL.CLOSE_CURSOR(params_cursor);
952 	END IF;
953 
954 	IF (FND_LOG.LEVEL_EXCEPTION  >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
955 	  FND_LOG.MESSAGE(FND_LOG.LEVEL_EXCEPTION , 'FUN_RULE_UTILITY_PKG.getValueSetDataType:->Exception='||SQLERRM, FALSE);
956 	END IF;
957 
958 	RAISE;
959 
960 END getValueSetDataType;
961 
962 FUNCTION GET_RULE_DFF_RESULT_VALUE(p_FlexFieldAppShortName	IN VARCHAR2,
963                                    p_FlexFieldName		IN VARCHAR2,
964 				   p_AttributeCategory		IN VARCHAR2,
965 				   p_Attribute1			IN VARCHAR2,
966 				   p_Attribute2			IN VARCHAR2,
967 				   p_Attribute3			IN VARCHAR2,
968 				   p_Attribute4			IN VARCHAR2,
969 				   p_Attribute5			IN VARCHAR2,
970 				   p_Attribute6			IN VARCHAR2,
971 				   p_Attribute7			IN VARCHAR2,
972 				   p_Attribute8			IN VARCHAR2,
973 				   p_Attribute9			IN VARCHAR2,
974 				   p_Attribute10		IN VARCHAR2,
975 				   p_Attribute11		IN VARCHAR2,
976 				   p_Attribute12		IN VARCHAR2,
977 				   p_Attribute13		IN VARCHAR2,
978 				   p_Attribute14		IN VARCHAR2,
979 				   p_Attribute15		IN VARCHAR2
980 				   )
981 RETURN VARCHAR2 IS
982 
983   error_msg               VARCHAR2(5000);
984   n                       NUMBER;
985   tf                      BOOLEAN;
986   s                       NUMBER;
987   e                       NUMBER;
988   errors_received         EXCEPTION;
989   error_segment           VARCHAR2(30);
990 
991 BEGIN
992    if (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
993      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'Start FUN_RULE_UTILITY_PKG.GET_RULE_DFF_RESULT_VALUE', FALSE);
994      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'p_FlexFieldAppShortName='||p_FlexFieldAppShortName, FALSE);
995      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'p_FlexFieldName='||p_FlexFieldName, FALSE);
996      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'p_AttributeCategory='||p_AttributeCategory, FALSE);
997      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'p_Attribute1='||p_Attribute1, FALSE);
998      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'p_Attribute2='||p_Attribute2, FALSE);
999      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'p_Attribute3='||p_Attribute3, FALSE);
1000      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'p_Attribute4='||p_Attribute4, FALSE);
1001      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'p_Attribute5='||p_Attribute5, FALSE);
1002      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'p_Attribute6='||p_Attribute6, FALSE);
1003      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'p_Attribute7='||p_Attribute7, FALSE);
1004      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'p_Attribute8='||p_Attribute8, FALSE);
1005      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'p_Attribute9='||p_Attribute9, FALSE);
1006      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'p_Attribute10='||p_Attribute10, FALSE);
1007      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'p_Attribute11='||p_Attribute11, FALSE);
1008      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'p_Attribute12='||p_Attribute12, FALSE);
1009      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'p_Attribute13='||p_Attribute13, FALSE);
1010      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'p_Attribute14='||p_Attribute14, FALSE);
1011      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'p_Attribute15='||p_Attribute15, FALSE);
1012    end if;
1013 
1014    fnd_flex_descval.set_column_value('ATTRIBUTE_CATEGORY', p_AttributeCategory);
1015    fnd_flex_descval.set_column_value('ATTRIBUTE1', p_Attribute1);
1016    fnd_flex_descval.set_column_value('ATTRIBUTE2', p_Attribute2);
1017    fnd_flex_descval.set_column_value('ATTRIBUTE3', p_Attribute3);
1018    fnd_flex_descval.set_column_value('ATTRIBUTE4', p_Attribute4);
1019    fnd_flex_descval.set_column_value('ATTRIBUTE5', p_Attribute5);
1020    fnd_flex_descval.set_column_value('ATTRIBUTE6', p_Attribute6);
1021    fnd_flex_descval.set_column_value('ATTRIBUTE7', p_Attribute7);
1022    fnd_flex_descval.set_column_value('ATTRIBUTE8', p_Attribute8);
1023    fnd_flex_descval.set_column_value('ATTRIBUTE8', p_Attribute9);
1024    fnd_flex_descval.set_column_value('ATTRIBUTE10', p_Attribute10);
1025    fnd_flex_descval.set_column_value('ATTRIBUTE11', p_Attribute11);
1026    fnd_flex_descval.set_column_value('ATTRIBUTE12', p_Attribute12);
1027    fnd_flex_descval.set_column_value('ATTRIBUTE13', p_Attribute13);
1028    fnd_flex_descval.set_column_value('ATTRIBUTE14', p_Attribute14);
1029    fnd_flex_descval.set_column_value('ATTRIBUTE15', p_Attribute15);
1030 
1031    IF  FND_FLEX_DESCVAL.validate_desccols(p_FlexFieldAppShortName, p_FlexFieldName) THEN
1032      IF (NVL(LENGTH(FND_FLEX_DESCVAL.concatenated_ids),0) > 1) THEN
1033         return(FND_FLEX_DESCVAL.concatenated_ids);
1034      ELSE
1035         return(FND_FLEX_DESCVAL.concatenated_values);
1036      END IF;
1037    ELSE
1038      if (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
1039         fnd_log.message(FND_LOG.LEVEL_STATEMENT, '*************************************************', FALSE);
1040         fnd_log.message(FND_LOG.LEVEL_STATEMENT, '* An error has occured so we will call           ', FALSE);
1041         fnd_log.message(FND_LOG.LEVEL_STATEMENT, '* FND_FLEX_DESCVAL.error_segment to detemine     ', FALSE);
1042         fnd_log.message(FND_LOG.LEVEL_STATEMENT, '* which segment contains the error.              ', FALSE);
1043         fnd_log.message(FND_LOG.LEVEL_STATEMENT, '*************************************************', FALSE);
1044      end if;
1045 
1046 
1047      error_segment := FND_FLEX_DESCVAL.error_segment;
1048      if (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
1049         fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'error_segment = ' || error_segment, FALSE);
1050      end if;
1051      RAISE errors_received;
1052 
1053    END IF;
1054 
1055    if (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
1056      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'End FUN_RULE_UTILITY_PKG.GET_RULE_DFF_RESULT_VALUE', FALSE);
1057    end if;
1058 
1059 EXCEPTION
1060  WHEN errors_received THEN
1061    error_msg := fnd_flex_descval.error_message;
1062    s :=1;
1063    e := 200;
1064 
1065    IF (FND_LOG.LEVEL_EXCEPTION  >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1066       FND_LOG.MESSAGE(FND_LOG.LEVEL_EXCEPTION , 'FUN_RULE_UTILITY_PKG.GET_RULE_DFF_RESULT_VALUE:->errors_received', FALSE);
1067       FND_LOG.MESSAGE(FND_LOG.LEVEL_EXCEPTION , 'Here are the error messages: ', FALSE);
1068    END IF;
1069 
1070    if(length(error_msg) < 200) then
1071       IF (FND_LOG.LEVEL_EXCEPTION  >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1072 	FND_LOG.MESSAGE(FND_LOG.LEVEL_EXCEPTION , error_msg, FALSE);
1073       END IF;
1074 
1075    else
1076      while e < 5001 and substr(error_msg, s, e) is not null
1077 	  loop
1078 	      IF (FND_LOG.LEVEL_EXCEPTION  >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1079 		FND_LOG.MESSAGE(FND_LOG.LEVEL_EXCEPTION , substr(error_msg, s, e), FALSE);
1080 	      END IF;
1081 
1082 	      s := s + 200;
1083 	      e := e + 200;
1084      end loop;
1085    end if;
1086 
1087   RAISE_APPLICATION_ERROR(-20000,error_msg);
1088 
1089 END get_rule_dff_result_value;
1090 
1091 /*Usage
1092     fun_rule_utility_pkg.print_debug(0,'Before calling Rules Engine.');
1093 */
1094 
1095 PROCEDURE print_debug(
1096         p_indent IN NUMBER,
1097         p_text IN VARCHAR2 ) IS
1098 BEGIN
1099         fnd_file.put_line( FND_FILE.LOG, RPAD(' ', (1+p_indent)*2)||p_text );
1100 EXCEPTION
1101         WHEN OTHERS THEN
1102                 null;
1103 END print_debug;
1104 
1105 
1106 FUNCTION get_moac_org_id
1107 RETURN NUMBER IS
1108 BEGIN
1109   if (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
1110      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'Start FUN_RULE_UTILITY_PKG.GET_MOAC_ORG_ID', FALSE);
1111      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'MO_GLOBAL.GET_ACCESS_MODE='||MO_GLOBAL.GET_ACCESS_MODE(), FALSE);
1112      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'MO_GLOBAL.GET_CURRENT_ORG_ID='||MO_GLOBAL.GET_CURRENT_ORG_ID, FALSE);
1113   end if;
1114 
1115   IF ( MO_GLOBAL.GET_ACCESS_MODE() = 'S') THEN
1116     RETURN MO_GLOBAL.GET_CURRENT_ORG_ID;
1117   ELSE
1118     RETURN -2;
1119   END IF;
1120 END;
1121 
1122 /* Rule Object Instance Enhancement for MULTIVALUE:
1123  * This function returns TRU if the RULE_OBJECT_ID passed is an instance or not.
1124  */
1125 
1126 FUNCTION IS_USE_INSTANCE(p_rule_object_id IN NUMBER)
1127 RETURN BOOLEAN
1128 IS
1129   l_parent_rule_object_id     FUN_RULE_OBJECTS_B.PARENT_RULE_OBJECT_ID%TYPE;
1130   params_cursor               INTEGER;
1131   params_rows_processed       INTEGER;
1132 
1133   l_sql               VARCHAR2(1000) := 'SELECT PARENT_RULE_OBJECT_ID FROM FUN_RULE_OBJECTS_B WHERE
1134                                                 RULE_OBJECT_ID = :1';
1135 
1136 BEGIN
1137 
1138    if (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
1139      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'Start FUN_RULE_UTILITY_PKG.IS_USE_INSTANCE', FALSE);
1140      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'p_rule_object_id='||to_char(p_rule_object_id), FALSE);
1141    end if;
1142 
1143    params_cursor := DBMS_SQL.OPEN_CURSOR;
1144    DBMS_SQL.PARSE(params_cursor, l_sql,DBMS_SQL.native);
1145    dbms_sql.bind_variable(params_cursor , '1' , p_rule_object_id);
1146 
1147    dbms_sql.define_column(params_cursor, 1, l_parent_rule_object_id);
1148 
1149    params_rows_processed := DBMS_SQL.EXECUTE(params_cursor);
1150 
1151    while(dbms_sql.fetch_rows(params_cursor) > 0 ) loop
1152      dbms_sql.column_value(params_cursor, 1, l_parent_rule_object_id );
1153      if(l_parent_rule_object_id IS NULL) then
1154        return FALSE;
1155      else
1156        return TRUE;
1157      end if;
1158    end loop;
1159 
1160    DBMS_SQL.CLOSE_CURSOR(params_cursor);
1161 
1162    if (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
1163      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'End FUN_RULE_UTILITY_PKG.IS_USE_INSTANCE', FALSE);
1164      fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'l_parent_rule_object_id='||to_char(l_parent_rule_object_id), FALSE);
1165    end if;
1166 
1167 
1168    RETURN FALSE;
1169 
1170    EXCEPTION
1171        WHEN OTHERS THEN
1172   	IF DBMS_SQL.IS_OPEN(params_cursor) THEN
1173 	 DBMS_SQL.CLOSE_CURSOR(params_cursor);
1174 	END IF;
1175 
1176 	IF (FND_LOG.LEVEL_EXCEPTION  >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1177 	  FND_LOG.MESSAGE(FND_LOG.LEVEL_EXCEPTION , 'FUN_RULE_UTILITY_PKG.IS_USE_INSTANCE:->Exception='||SQLERRM, FALSE);
1178 	END IF;
1179 
1180 	RAISE;
1181 END IS_USE_INSTANCE;
1182 
1183 END FUN_RULE_UTILITY_PKG;