DBA Data[Home] [Help]

PACKAGE BODY: APPS.HZ_DQM_SEARCH_UTIL

Source


1 PACKAGE BODY HZ_DQM_SEARCH_UTIL AS
2 /*$Header: ARHDQUTB.pls 120.29 2006/02/11 00:19:27 schitrap noship $ */
3 g_within_threshold NUMBER := 4;
4 
5 g_string VARCHAR2(2000);
6 g_curpos NUMBER;
7 g_delim VARCHAR2(30);
8 g_numtoks NUMBER;
9 
10 g_num_eval NUMBER:=0;
11 
12 g_no_score BOOLEAN := FALSE;
13 
14 --Start of Bug No:4244535
15 
16 TYPE attr_rec_type IS RECORD(attr_id hz_trans_attributes_b.ATTRIBUTE_ID%type,
17                              tmp_section hz_trans_attributes_b.temp_section%type);
18 TYPE attr_tb_type is table of attr_rec_type index by binary_integer;
19 g_attr_rec attr_rec_type;
20 g_attr_tb  attr_tb_type;
21 
22 --End of Bug No:4244535
23 
24 
25 PROCEDURE set_score IS
26 BEGIN
27   g_no_score:= FALSE;
28 END;
29 PROCEDURE set_no_score IS
30 BEGIN
31   g_no_score:= TRUE;
32 END;
33 
34 PROCEDURE set_num_eval(p_num NUMBER) IS
35 BEGIN
36   g_num_eval:=p_num;
37 END;
38 
39 FUNCTION get_num_eval RETURN NUMBER IS
40 BEGIN
41   RETURN g_num_eval;
42 END;
43 
44 PROCEDURE new_search IS
45 BEGIN
46   HZ_TRANS_PKG.clear_globals;
47 END;
48 FUNCTION subst_reserved(
49     p_inp       IN  VARCHAR2) RETURN VARCHAR2 IS
50 
51 retstr VARCHAR2(4000);
52 
53 BEGIN
54     retstr := ' ' || p_inp || ' ';
55     retstr := replace(retstr,' ABOUT ',' {ABOUT} ');
56     retstr := replace(retstr,' ACCUM ',' {ACCUM} ');
57     retstr := replace(retstr,' AND ',' {AND} ');
58     retstr := replace(retstr,' BT ',' {BT} ');
59     retstr := replace(retstr,' BTG ',' {BTG} ');
60     retstr := replace(retstr,' BTI ',' {BTI} ');
61     retstr := replace(retstr,' BTP ',' {BTP} ');
62     retstr := replace(retstr,' MINUS ',' {MINUS} ');
63     retstr := replace(retstr,' NEAR ',' {NEAR} ');
64     retstr := replace(retstr,' NOT ',' {NOT} ');
65     retstr := replace(retstr,' NT ',' {NT} ');
66     retstr := replace(retstr,' NTG ',' {NTG} ');
67     retstr := replace(retstr,' NTI ',' {NTI} ');
68     retstr := replace(retstr,' NTP ',' {NTP} ');
69     retstr := replace(retstr,' OR ',' {OR} ');
70     retstr := replace(retstr,' PT ',' {PT} ');
71     retstr := replace(retstr,' RT ',' {RT} ');
72     retstr := replace(retstr,' SQE ',' {SQE} ');
73     retstr := replace(retstr,' SYN ',' {SYN} ');
74     retstr := replace(retstr,' TR ',' {TR} ');
75     retstr := replace(retstr,' TRSYN ',' {TRSYN} ');
76     retstr := replace(retstr,' TT ',' {TT} ');
77     retstr := replace(retstr,' WITHIN ',' {WITHIN} ');
78     return rtrim(ltrim(retstr));
79 END;
80 
81 FUNCTION check_misc (p_within VARCHAR2) RETURN VARCHAR2 IS
82 l_1stchar VARCHAR2(1);
83 l_misc_within VARCHAR2(30);
84 CURSOR temp_sect(p_attr_id NUMBER) IS
85   SELECT nvl(temp_section,p_within) --Bug No: 4244535
86   FROM HZ_TRANS_ATTRIBUTES_VL
87   WHERE attribute_id = p_attr_id;
88   --AND temp_section IS NOT NULL; --Bug No: 4244535
89 l_attr_id NUMBER(15);
90 l_index   NUMBER;
91 BEGIN
92   l_1stchar := substrb(p_within,1,1);
93   IF l_1stchar = 'D' THEN
94     RETURN p_within;
95   ELSIF l_1stchar = 'M' THEN
96     RETURN p_within;
97   ELSE
98     --Start of Bug No: 4244535
99     l_attr_id := to_number(substrb(p_within,2));
100     FOR i in 1..g_attr_tb.count LOOP
101       IF (g_attr_tb(i).attr_id = l_attr_id) THEN
102         RETURN g_attr_tb(i).tmp_section;
103       END IF;
104     END LOOP;
105     l_index := g_attr_tb.count+1;
106     OPEN temp_sect(l_attr_id);
107     FETCH temp_sect INTO l_misc_within;
108     IF temp_sect%FOUND THEN
109       CLOSE temp_sect;
110       g_attr_tb(l_index).attr_id     := l_attr_id;
111       g_attr_tb(l_index).tmp_section := l_misc_within;
112       RETURN l_misc_within;
113     ELSE
114       CLOSE temp_sect;
115       g_attr_tb(l_index).attr_id     := l_attr_id;
116       g_attr_tb(l_index).tmp_section := p_within;
117       RETURN p_within;
118     END IF;
119   --End of Bug No: 4244535
120   END IF;
121 END;
122 
123 PROCEDURE add_transformation (
124 	p_tx_val	IN	VARCHAR2,
125 	p_within	IN	VARCHAR2,
126 	x_tx_str	IN OUT NOCOPY	VARCHAR2) IS
127 
128 l_tx_val VARCHAR2(4000);
129 
130 BEGIN
131   IF p_tx_val IS NOT NULL THEN
132     l_tx_val := p_tx_val;
133     IF instrb(l_tx_val,'%')>0 OR lengthb(l_tx_val)>255 THEN ----Bug No: 3032742
134       l_tx_val := subst_reserved(l_tx_val);
135     ELSE
136       l_tx_val := '{' || l_tx_val || '}';
137     END IF;
138 
139     IF x_tx_str IS NOT NULL THEN
140       x_tx_str := x_tx_str || ' OR ';
141     END IF;
142 
143     IF p_within IS NULL THEN
144       x_tx_str := x_tx_str || '(' || l_tx_val || ')';
145     ELSE
146       x_tx_str := x_tx_str ||
147         '(' || l_tx_val || ') within ' || check_misc(p_within);
148     END IF;
149   END IF;
150 EXCEPTION
151   WHEN OTHERS THEN
152     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
153     FND_MESSAGE.SET_TOKEN('PROC' ,'HZ_DQM_SEARCH_UTIL.add_transformation');
154     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
155     FND_MSG_PUB.ADD;
156     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
157 END add_transformation;
158 
159 PROCEDURE add_filter (
160 	p_tx_val	IN	VARCHAR2,
161 	p_within	IN	VARCHAR2,
162 	x_filter_str	IN OUT NOCOPY	VARCHAR2) IS
163 BEGIN
164   IF p_tx_val IS NOT NULL THEN
165     IF x_filter_str IS NOT NULL THEN
166       x_filter_str := x_filter_str || ' AND ';
167     END IF;
168     x_filter_str := x_filter_str ||
169        '{' || replace(p_tx_val,'_',' ') || '} within ' || check_misc(p_within);
170   END IF;
171 EXCEPTION
172   WHEN OTHERS THEN
173     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
174     FND_MESSAGE.SET_TOKEN('PROC' ,'HZ_DQM_SEARCH_UTIL.add_filter');
175     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
176     FND_MSG_PUB.ADD;
177     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
178 END add_filter;
179 
180 PROCEDURE add_attribute (
181 	p_tx_str	IN	VARCHAR2,
182 	p_match_str	IN	VARCHAR2,
183 	x_contains_str	IN OUT NOCOPY	VARCHAR2) IS
184 BEGIN
185   IF p_tx_str IS NOT NULL THEN
186     IF x_contains_str IS NOT NULL THEN
187       x_contains_str := x_contains_str || p_match_str;
188     END IF;
189     x_contains_str := x_contains_str || '('||
190                       p_tx_str || ')';
191   END IF;
192 EXCEPTION
193   WHEN OTHERS THEN
194     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
195     FND_MESSAGE.SET_TOKEN('PROC' ,'HZ_DQM_SEARCH_UTIL.add_attribute');
196     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
197     FND_MSG_PUB.ADD;
198     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
199 END add_attribute;
200 
201 PROCEDURE add_attribute_with_denorm (
202         p_tx_str        IN      VARCHAR2,
203         p_match_str     IN      VARCHAR2,
204         p_denorm_str    IN      VARCHAR2,
205         x_contains_str  IN OUT NOCOPY   VARCHAR2) IS
206 BEGIN
207   IF p_tx_str IS NOT NULL THEN
208     IF x_contains_str IS NOT NULL THEN
209       x_contains_str := x_contains_str || p_match_str;
210     END IF;
211     x_contains_str := x_contains_str || '('||
212                       p_tx_str;
213     IF p_denorm_str IS NOT NULL THEN
214       x_contains_str := x_contains_str || ' AND ('||p_denorm_str ||'))';
215     ELSE
216       x_contains_str := x_contains_str || ')';
217     END IF;
218   END IF;
219 EXCEPTION
220   WHEN OTHERS THEN
221     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
222     FND_MESSAGE.SET_TOKEN('PROC' ,'HZ_DQM_SEARCH_UTIL.add_attribute_with_denorm');
223     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
224     FND_MSG_PUB.ADD;
225     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
226 END add_attribute_with_denorm;
227 
228 
229 PROCEDURE add_search_record (
230 	p_rec_contains_str 	IN	VARCHAR2,
231 	p_filter_str		IN	VARCHAR2,
232 	x_contains_str		IN OUT NOCOPY	VARCHAR2) IS
233 BEGIN
234   IF p_rec_contains_str IS NOT NULL THEN
235     IF x_contains_str IS NOT NULL THEN
236       x_contains_str := x_contains_str || ' OR ';
237     END IF;
238     IF p_filter_str IS NOT NULL THEN
239       x_contains_str :=
240         x_contains_str || '((' || p_rec_contains_str || ') AND '||p_filter_str||')';
241     ELSE
242       x_contains_str :=
243         x_contains_str || '('|| p_rec_contains_str || ')';
244     END IF;
245   END IF;
246 EXCEPTION
247   WHEN OTHERS THEN
248     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
249     FND_MESSAGE.SET_TOKEN('PROC' ,'HZ_DQM_SEARCH_UTIL.add_search_record');
250     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
251     FND_MSG_PUB.ADD;
252     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
253 END;
254 
255 -- Remove records from HZ_DQM_PARTIES_GT which don't satisfy subset_defn
256 PROCEDURE remove_matches_not_in_subset (
257         p_search_ctx_id         IN      NUMBER,
258         p_subset_defn           IN      VARCHAR2
259 ) IS
260   l_sqlstr VARCHAR2(4000);
261 BEGIN
262   l_sqlstr := 'DELETE FROM HZ_DQM_PARTIES_GT m WHERE NOT EXISTS ('||
263               'SELECT p.party_id FROM HZ_PARTIES p '||
264               'WHERE p.party_id = m.party_id AND '||
265               p_subset_defn || ') AND SEARCH_CONTEXT_ID = :ctxid';
266   EXECUTE IMMEDIATE l_sqlstr USING p_search_ctx_id;
267 EXCEPTION
268   WHEN OTHERS THEN
269     FND_MESSAGE.SET_NAME('AR', 'HZ_RESTRICT_SQL_ERROR');
270     FND_MESSAGE.SET_TOKEN('PROC' ,'remove_matches_not_in_subset');
271     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
272     FND_MSG_PUB.ADD;
273     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
274 END remove_matches_not_in_subset;
275 
276 FUNCTION strtok (
277     p_string VARCHAR2 DEFAULT NULL,
278     p_numtoks NUMBER DEFAULT NULL,
279     p_delim VARCHAR2 DEFAULT NULL
280     ) RETURN VARCHAR2 IS
281 
282   l_spc_char NUMBER;
283   l_numtoks NUMBER;
284   ret VARCHAR2(4000); --Bug No: 3032742
285   FIRST BOOLEAN;
286   l_first_pos NUMBER;
287 BEGIN
288   IF p_string IS NOT NULL THEN
289     g_string := p_string;
290     g_curpos := 1;
291     g_delim := p_delim;
292     g_numtoks := p_numtoks;
293   END IF;
294 
295   IF g_string IS NULL THEN
296     RETURN null;
297   END IF;
298 
299   l_numtoks := 0;
300   FIRST := TRUE;
301   LOOP
302     l_spc_char := instr(g_string,g_delim,g_curpos);
303     EXIT WHEN l_spc_char = 0;
304 
305     ret := ret || ' '|| substr(g_string,g_curpos,l_spc_char-g_curpos);
306     g_curpos := l_spc_char+1;
307     IF FIRST THEN
308       l_first_pos :=  g_curpos;
309       FIRST := FALSE;
310     END IF;
311     l_numtoks := l_numtoks+1;
312     EXIT WHEN l_numtoks=g_numtoks;
313   END LOOP;
314   IF l_numtoks<g_numtoks THEN
315     ret := ret || ' '|| substr(g_string,g_curpos);
316     l_numtoks := l_numtoks+1;
317     g_string := NULL;
318   END IF;
319   IF l_numtoks<g_numtoks THEN
320     RETURN NULL;
321   ELSE
322     g_curpos := l_first_pos;
323     RETURN ltrim(ret);
324   END IF;
325 END;
326 
327 FUNCTION is_match(
328 	p_src	IN      VARCHAR2,
329 	p_dest	IN      VARCHAR2,
330     p_attr_idx IN   NUMBER
331  ) RETURN BOOLEAN IS
332 
333 test VARCHAR2(2000);
334 
335 BEGIN
336  IF p_src IS NULL OR p_dest IS NULL  THEN
337    RETURN FALSE;
338  END IF;
339 
340  IF (' '||p_dest||' ' like '% '||p_src||' %') THEN
341    RETURN TRUE;
342  ELSE
343    RETURN FALSE;
344  END IF;
345 END;
346 
347 FUNCTION is_similar_match(
348         p_src   		IN      VARCHAR2,
349         p_dest  		IN      VARCHAR2,
350         p_min_similarity 	IN 	VARCHAR2,
351         p_attr_idx              IN      NUMBER)
352 RETURN BOOLEAN IS
353   numspc NUMBER;
354   destspc NUMBER;
355   l_dest VARCHAR2(2000);
356 BEGIN
357  IF p_src IS NULL OR p_dest IS NULL  THEN
358    RETURN FALSE;
359  ELSIF instr(p_src,'%')>0 THEN
360    RETURN is_match(p_src,p_dest,p_attr_idx);
361  ELSIF NOT is_match(p_src,p_dest,p_attr_idx) THEN
362     l_dest := p_dest;
363     numspc:=1;
364     l_dest := rtrim(p_dest);
365     while (instr(p_src,' ',1,numspc)>0) LOOP
366        numspc:=numspc+1;
367     END LOOP;
368     destspc := instr(p_dest,' ',1,numspc)-1;
369     IF (destspc>0) THEN
370        l_dest := substr(l_dest,1,destspc);
371     END IF;
372     IF is_similar(p_src,l_dest,p_min_similarity)=1 THEN
373         RETURN TRUE;
374      ELSE
375         RETURN FALSE;
376      END IF;
377  ELSE
378    RETURN TRUE;
379  END IF;
380 END;
381 
382 FUNCTION is_similar(
383 	p_src               IN      VARCHAR2,
384 	p_dest              IN      VARCHAR2,
385         p_min_similarity    IN      NUMBER := 100)
386   RETURN NUMBER IS
387 
388 m NUMBER;
389 n NUMBER;
390 
391 TYPE NumberList IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
392 
393 alist NumberList;
394 blist NumberList;
395 
396 cost NUMBER;
397 
398 D VARCHAR2(1 CHAR );
399 C VARCHAR2(1 CHAR );
400 
401 BEGIN
402 
403   n := nvl(LENGTH(p_src),0);
404   m := nvl(LENGTH(p_dest),0);
405 
406   IF n = 0 THEN
407     return m;
408   END IF;
409   IF m = 0 THEN
410     return n;
411   END IF;
412 
413   FOR I IN 1..(M+1) LOOP
414     alist(I) := I-1;
415   END LOOP;
416 
417   FOR I IN 1..N LOOP
418     IF mod(I,2) = 1 THEN
419       blist(1) := I;
420     ELSE
421       alist(1) := I;
422     END IF;
423 
424     C := substr(p_src,I,1);
425 
426     FOR J IN 2..(M+1) LOOP
427       D := substr(p_dest,J-1,1);
428       COST := 1;
429       IF D=C THEN
430         COST := 0;
431       END IF;
432       IF mod(I,2) = 1 THEN
433         blist(J) := least(blist(J-1)+1,alist(J)+1,alist(j-1)+COST);
434       ELSE
435         alist(J) := least(alist(J-1)+1,blist(J)+1,blist(j-1)+COST);
436       END IF;
437     END LOOP;
438   END LOOP;
439   IF mod(n,2) = 1 THEN
440     IF (1-(blist(m+1)/n))*100 > p_min_similarity THEN
441       RETURN 1;
442     ELSE
443       RETURN 0;
444     END IF;
445   ELSE
446     IF (1-(alist(m+1)/n))*100 > p_min_similarity THEN
447       RETURN 1;
448     ELSE
449       RETURN 0;
450     END IF;
451   END IF;
452 EXCEPTION
453   WHEN OTHERS THEN
454     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
455     FND_MESSAGE.SET_TOKEN('PROC' ,'HZ_DQM_SEARCH_UTIL.is_similar');
456     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
457     FND_MSG_PUB.ADD;
458     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
459 END;
460 
461 -- This Function tests if the DQM indexes have been created
462 -- and if they are valid
463 FUNCTION is_dqm_available
464   RETURN VARCHAR2 IS
465 
466   T NUMBER;
467 BEGIN
468 
469   BEGIN
470     SELECT 1 INTO T FROM HZ_STAGED_PARTIES
471     WHERE ROWNUM=1
472     AND CONTAINS (concat_col, 'dummy_string')>0;
473   EXCEPTION
474     WHEN NO_DATA_FOUND THEN
475       NULL;
476     WHEN OTHERS THEN
477       RETURN FND_API.G_FALSE;
478   END;
479   BEGIN
480     SELECT 1 INTO T FROM HZ_STAGED_PARTY_SITES
481     WHERE ROWNUM=1
482     AND CONTAINS (CONCAT_COL, 'dummy_string')>0;
483   EXCEPTION
484     WHEN NO_DATA_FOUND THEN
485       NULL;
486     WHEN OTHERS THEN
487       RETURN FND_API.G_FALSE;
488   END;
489   BEGIN
490     SELECT 1 INTO T FROM HZ_STAGED_CONTACTS
491     WHERE ROWNUM=1
492     AND CONTAINS (CONCAT_COL, 'dummy_string')>0;
493   EXCEPTION
494     WHEN NO_DATA_FOUND THEN
495       NULL;
496     WHEN OTHERS THEN
497       RETURN FND_API.G_FALSE;
498   END;
499   BEGIN
500     SELECT 1 INTO T FROM HZ_STAGED_CONTACT_POINTS
501     WHERE ROWNUM=1
502     AND CONTAINS (CONCAT_COL, 'dummy_string')>0;
503   EXCEPTION
504     WHEN NO_DATA_FOUND THEN
505       NULL;
506     WHEN OTHERS THEN
507       RETURN FND_API.G_FALSE;
508   END;
509   RETURN FND_API.G_TRUE;
510 END;
511 
512 
513 FUNCTION is_dqm_available(
514 p_match_rule_id NUMBER
515 )
516   RETURN VARCHAR2 IS
517 
518   T NUMBER;
519   X VARCHAR2(1);
520   l_comp_flag VARCHAR2(1);
521   l_count NUMBER;
522   CURSOR c1 is select compilation_flag from hz_match_rules_b where match_rule_id = p_match_rule_id;
523  CURSOR c2 is select count(*)
524             from hz_trans_functions_b
525             where function_id in (
526                        select function_id
527                        from hz_match_rule_primary mp, hz_primary_trans pt
528                        where match_rule_id = p_match_rule_id
529                        and mp.primary_attribute_id = pt.primary_attribute_id
530                        union
531                        select function_id
532                        from hz_match_rule_secondary ms, hz_secondary_trans st
533                        where match_rule_id = p_match_rule_id
534                        and ms.secondary_attribute_id = st.secondary_attribute_id
535             )
536             and staged_flag <> 'Y'
537             and nvl(active_flag, 'Y') <> 'N' ;
538 
539 BEGIN
540    X := hz_dqm_search_util.is_dqm_available;
541     IF (X = FND_API.G_TRUE) THEN
542     OPEN c1;
543     FETCH c1 INTO l_comp_flag;
544        IF (l_comp_flag = 'C') THEN
545             OPEN c2;
546             FETCH c2 INTO l_count;
547             IF (l_count = 0) THEN
548                X := FND_API.G_TRUE;
549             ELSE
550                X := FND_API.G_FALSE;
551             END IF;
552         ELSE
553             X := FND_API.G_FALSE;
554         END IF;
555     ELSE
556         X := FND_API.G_FALSE;
557     END IF;
558    RETURN X;
559 END is_dqm_available;
560 
561 
562 
563 FUNCTION ESTIMATED_LENGTH(p_str VARCHAR2) RETURN NUMBER IS
564 
565 l_tok VARCHAR2(4000);
566 l_str VARCHAR2(4000);
567 len NUMBER := 0;
568 eqpos NUMBER;
569 BEGIN
570   RETURN lengthb(p_str);
571 END;
572 
573 PROCEDURE update_word_list (
574    p_repl_word VARCHAR2,
575    p_word_list_id NUMBER) IS
576   repl_str VARCHAR2(2000);
577   FIRST BOOLEAN;
578 begin
579 
580   NULL;
581 END;
582 
583 PROCEDURE get_quality_score (
584     p_srch_ctx_id IN NUMBER,
585     p_match_rule_id IN NUMBER
586     )  IS
587 
588 l_score NUMBER;
589 l_quality_weight NUMBER;
590 l_quality_score NUMBER;
591 l_final_score NUMBER ;
592 l_rule_purpose VARCHAR2(1);
593 l_party_rec HZ_PARTIES%ROWTYPE;
594 l_mms NUMBER;
595 BEGIN
596      l_quality_weight := hz_dqm_quality_uh_pkg.get_quality_weighting(p_match_rule_id);
597      IF (l_quality_weight > 0) THEN
598          select rule_purpose into l_rule_purpose
599          from hz_match_rules_vl
600          where match_rule_id = p_match_rule_id;
601 
602          IF ( l_rule_purpose = 'S') THEN
603            FOR TX IN (
604                 select party_id, score
605                 from hz_matched_parties_gt
606                 where search_context_id = p_srch_ctx_id)
607            LOOP
608              select * into l_party_rec
609              from HZ_PARTIES
610              where party_id = TX.party_id;
611              l_quality_score := hz_dqm_quality_uh_pkg.get_quality_score(p_match_rule_id, l_party_rec);
612              l_score := TX.score;
613              l_final_score := (l_score * ( 100 - l_quality_weight) + l_quality_score * l_quality_weight)/ 100;
614              update hz_matched_parties_gt
615              set score = l_final_score
616              where search_context_id = p_srch_ctx_id
617              and party_id = TX.party_id;
618            END LOOP;
619          ELSIF ( l_rule_purpose = 'D') THEN
620            select sum(score) into l_mms
621            from hz_match_rule_secondary
622            where match_rule_id =  p_match_rule_id;
623            FOR TX IN (select party_id, score
624                 from hz_matched_parties_gt
625                 where search_context_id = p_srch_ctx_id)
626            LOOP
627              select * into l_party_rec
628              from HZ_PARTIES
629              where party_id = TX.party_id;
630              l_score := TX.score;
631              l_quality_score := hz_dqm_quality_uh_pkg.get_quality_score(p_match_rule_id, l_party_rec);
632              l_final_score :=  (l_score - (l_score * l_quality_weight)/100 + (l_quality_score * l_quality_weight* l_mms)/(100*100));
633              update hz_matched_parties_gt
634              set score = l_final_score
635              where search_context_id = p_srch_ctx_id
636              and party_id = TX.party_id;
637            END LOOP;
638          END IF;
639      END IF;
640  EXCEPTION WHEN OTHERS THEN
641       FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_QUAL_SCORE'); -- Error occured in obtaining a quality score.  Please contact system adminsitrator or turn profile option off to run DQM without quality score.
642       FND_MSG_PUB.ADD;
643       RAISE;
644 END get_quality_score;
645 
646 
647 FUNCTION validate_trans_proc(
648      P_PROCEDURE_NAME IN VARCHAR2
649      ) return VARCHAR2 IS
650   c NUMBER;
651   l_sql VARCHAR2(255);
652   dotCheck NUMBER;
653   procCheck NUMBER;
654   l_sqlstr VARCHAR2(4000);
655   l_status VARCHAR2(255);
656   l_owner1 VARCHAR2(255);
657   l_temp VARCHAR2(255);
658   BEGIN
659   	select instr(P_PROCEDURE_NAME,'.') into dotCheck from dual;
660   	IF dotCheck = 0 THEN
661 
662 	/*select count(*) into procCheck from sys.all_objects
663 	where object_name=trim(upper(P_PROCEDURE_NAME))
664 	and (object_type='PROCEDURE' OR object_type='FUNCTION');*/
665 
666    IF (fnd_installation.GET_APP_INFO('AR',l_status,l_temp,l_owner1)) THEN
667     l_sqlstr := ' select count(*) from sys.all_procedures where object_name=trim(upper(:P_PROCEDURE_NAME)) and owner=:2';
668     EXECUTE IMMEDIATE l_sql into procCheck USING P_PROCEDURE_NAME,l_owner1;
669    END IF;
670 
671 	IF procCheck=0 THEN
672 	RETURN 'INVALID';
673 	ELSE
674 	RETURN 'VALID';
675 	END IF;
676 	ELSE
677         c := dbms_sql.open_cursor;
678         l_sql := 'select ' || P_PROCEDURE_NAME ||
679              '(:attrval,:lang,:attr,:entity) from dual';
680         dbms_sql.parse(c,l_sql,2);
681         dbms_sql.close_cursor(c);
682         RETURN 'VALID';
683         END IF;
684   EXCEPTION WHEN OTHERS THEN
685         RETURN 'INVALID';
686   END validate_trans_proc;
687 
688 
689 FUNCTION validate_custom_proc(
690      P_CUST_PROCEDURE_NAME IN VARCHAR2
691      ) return VARCHAR2 IS
692   c NUMBER;
693   dotCheck NUMBER;
694   procCheck NUMBER;
695   l_sql VARCHAR2(255);
696   l_sqlstr VARCHAR2(4000);
697   l_status VARCHAR2(255);
698   l_owner1 VARCHAR2(255);
699   l_temp VARCHAR2(255);
700 BEGIN
701  	select instr(P_CUST_PROCEDURE_NAME,'.') into dotCheck from dual;
702   	IF dotCheck = 0 THEN
703 
704 	/*select count(*) into procCheck from sys.all_objects
705 	where object_name=trim(upper(P_CUST_PROCEDURE_NAME))
706 	and (object_type='PROCEDURE' OR object_type='FUNCTION');*/
707 
708    IF (fnd_installation.GET_APP_INFO('AR',l_status,l_temp,l_owner1)) THEN
709     l_sqlstr := ' select count(*) from sys.all_procedures where object_name=trim(upper(:1)) and owner=:2 ';
710     EXECUTE IMMEDIATE l_sql into procCheck USING P_CUST_PROCEDURE_NAME,l_owner1;
711    END IF;
712 
713 	IF procCheck=0 THEN
714 	RETURN 'INVALID';
715 	ELSE
716 	RETURN 'VALID';
717 	END IF;
718 	ELSE
719         c := dbms_sql.open_cursor;
720         l_sql := 'select ' || P_CUST_PROCEDURE_NAME ||
721              '(:record_id,:entity,:attr) from dual';
722         dbms_sql.parse(c,l_sql,2);
723         dbms_sql.close_cursor(c);
724         RETURN 'VALID';
725         END IF;
726   EXCEPTION WHEN OTHERS THEN
727         RETURN 'INVALID';
728 END validate_custom_proc;
729 
730 END ;