DBA Data[Home] [Help]

PACKAGE BODY: APPS.IGS_PE_DYNAMIC_PERSID_GROUP

Source


1 PACKAGE BODY IGS_PE_DYNAMIC_PERSID_GROUP AS
2 /* $Header: IGSPEDGB.pls 120.1 2006/02/02 06:49:07 skpandey noship $ */
3 
4   -- Global Variables
5 
6 
7   g_api_version 	CONSTANT NUMBER       := 1.0;
8   g_api_name    	CONSTANT VARCHAR2(30) := 'igs_get_dynamic_sql';
9   g_pkg_name		CONSTANT VARCHAR2(30) := 'igs_dynamic_perid_group';
10   g_full_name   	CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| g_api_name;
11   --g_msg_list		VARCHAR2     	      := FND_API.g_false;
12 
13 
14 /*==========================================================================+
15  | Name: IGS_GET_DYNAMIC_SQL().                                             |
16  |       Returns the SQL extracted from Discoverer.                         |
17  |    04-DEC-2003  ssaleem     Dynamic Person id group Bug 3198795          |
18  |                             handled order by clause in dynamic person    |
19  |                             id group                                     |
20  +==========================================================================*/
21 
22   FUNCTION IGS_GET_DYNAMIC_SQL(
23      p_GroupID	IN     		igs_pe_persid_group_all.group_id%TYPE,
24      p_Status	OUT NOCOPY 	VARCHAR2) RETURN VARCHAR2
25   IS
26 
27      --local variables
28 
29     l_SQL 		VARCHAR2(32767);
30     l_SQL_exp 		VARCHAR2(67);
31     l_id		NUMBER(6);
32     lv_parser           VARCHAR2(32767);
33     lv_found            VARCHAR2(1);
34     x_Count		NUMBER;
35     x_Data		VARCHAR2(2000);
36 
37     CURSOR c_group_type IS
38     SELECT group_type
39     FROM IGS_PE_PERSID_GROUP_V
40     WHERE group_id = p_GroupID;
41     lv_group_type IGS_PE_PERSID_GROUP_V.group_type%TYPE;
42 
43     CURSOR c_Rec IS
44     SELECT S.sql_segment
45     FROM IGS_PE_PERSID_GROUP_ALL G, IGS_PE_DYN_SQLSEGS S
46     WHERE G.group_id = p_GroupID
47     AND G.file_name = S.file_name
48     ORDER BY S.seg_sequence_num;
49 
50 
51   BEGIN
52     l_SQL := '';
53     l_SQL_exp := 'SELECT 1 FROM DUAL';
54     OPEN c_group_type;
55     FETCH c_group_type INTO lv_group_type;
56     CLOSE c_group_type;
57 
58     IF lv_group_type = 'STATIC' THEN
59        l_SQL := 'SELECT person_id FROM igs_pe_prsid_grp_mem_all where TRUNC(SYSDATE) BETWEEN NVL(start_date,TRUNC(SYSDATE)) AND NVL(end_date,TRUNC(SYSDATE)) AND group_id = '||p_GroupID ;
60 
61     ELSIF lv_group_type = 'DYNAMIC' THEN
62        FOR c_Disc IN c_REC LOOP
63           l_SQL  := l_SQL || c_Disc.sql_segment;
64        END LOOP;
65 
66        -- l_SQL := UPPER(rtrim(l_SQL)); Bug:3405360, asbala --commented this code
67        lv_parser  := substr(l_SQL,(instr(l_SQL,'SELECT') + 6));
68        lv_parser  := substr(lv_parser,1,(instr(lv_parser,'FROM') - 1));
69        lv_parser  := trim(lv_parser);
70        lv_parser  := lv_parser||',';
71 
72        WHILE lv_parser IS NOT NULL LOOP
73          DECLARE
74              lv_check VARCHAR2(100);
75          BEGIN
76              lv_check  := substr(lv_parser,1,(instr(lv_parser,',')-1));
77              lv_parser := trim(substr(lv_parser,(instr(lv_parser,',')+1)));
78 
79              IF ((UPPER(lv_check) like '%PERSON_ID%') OR
80                  (UPPER(lv_check) like '%PARTY_ID%')) THEN
81                   l_SQL := 'SELECT '||lv_check||' PERSON_ID '||
82                        substr(l_SQL,(instr(l_SQL,'FROM')));
83                   lv_found := 'Y';
84                   lv_parser := NULL;
85               END IF;
86          END;
87        END LOOP;
88 
89        IF INSTR(l_SQL,' ORDER BY ') > 0 THEN
90          l_SQL := SUBSTR(l_SQL,0,(INSTR(l_SQL,' ORDER BY ')));
91        END IF;
92 
93        IF NVL(lv_found,'N') = 'N' THEN
94               RAISE NO_DATA_FOUND;
95        END IF;
96     END IF;
97     p_Status := FND_API.g_ret_sts_success;
98 
99     RETURN l_SQL;
100 
101   EXCEPTION
102     WHEN NO_DATA_FOUND THEN
103       p_Status := FND_API.g_ret_sts_unexp_error ;
104 
105       IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
106         FND_MSG_PUB.add_exc_msg(g_pkg_name, g_api_name);
107       END IF;
108       FND_MSG_PUB.count_and_get(
109         p_encoded => FND_API.g_false,
110         p_count   => x_Count,
111         p_data    => x_Data
112       );
113       RETURN l_SQL_exp;
114     WHEN FND_API.g_exc_error THEN
115       p_Status := FND_API.g_ret_sts_error;
116       FND_MSG_PUB.count_and_get(
117         p_encoded => FND_API.g_false,
118         p_count   => x_Count,
119         p_data    => x_Data
120       );
121       RETURN l_SQL_exp;
122     WHEN FND_API.g_exc_unexpected_error THEN
123       p_Status := FND_API.g_ret_sts_unexp_error ;
124       FND_MSG_PUB.count_and_get(
125         p_encoded => FND_API.g_false,
126         p_count   => x_count,
127         p_data    => x_data
128       );
129       RETURN l_SQL_exp;
130   END IGS_GET_DYNAMIC_SQL;
131 
132 
133 FUNCTION GET_DYNAMIC_SQL(
134      p_GroupID	IN     		igs_pe_persid_group_all.group_id%TYPE,
135      p_Status	OUT NOCOPY 	VARCHAR2,
136      p_group_type OUT NOCOPY    IGS_PE_PERSID_GROUP_V.group_type%TYPE) RETURN VARCHAR2
137   IS
138 
139      --local variables
140 
141     l_SQL 		VARCHAR2(32767);
142     l_SQL_exp 		VARCHAR2(67);
143     l_id		NUMBER(6);
144     lv_parser           VARCHAR2(32767);
145     lv_found            VARCHAR2(1);
146     x_Count		NUMBER;
147     x_Data		VARCHAR2(2000);
148 
149 
150     CURSOR c_group_type IS
151     SELECT group_type
152     FROM IGS_PE_PERSID_GROUP_V
153     WHERE group_id = p_GroupID;
154     lv_group_type IGS_PE_PERSID_GROUP_V.group_type%TYPE;
155 
156     CURSOR c_Rec IS
157     SELECT S.sql_segment
158     FROM IGS_PE_PERSID_GROUP_ALL G, IGS_PE_DYN_SQLSEGS S
159     WHERE G.group_id = p_GroupID
160     AND G.file_name = S.file_name
161     ORDER BY S.seg_sequence_num;
162 
163   BEGIN
164     l_SQL := '';
165     l_SQL_exp := 'SELECT 1 FROM DUAL';
166 
167     OPEN c_group_type;
168     FETCH c_group_type INTO lv_group_type;
169     CLOSE c_group_type;
170 
171     IF lv_group_type = 'STATIC' THEN
172        l_SQL := 'SELECT person_id FROM igs_pe_prsid_grp_mem_all where TRUNC(SYSDATE) BETWEEN NVL(start_date,TRUNC(SYSDATE)) AND NVL(end_date,TRUNC(SYSDATE)) AND group_id = :p_GroupID';
173 
174     ELSIF lv_group_type = 'DYNAMIC' THEN
175        FOR c_Disc IN c_REC LOOP
176           l_SQL  := l_SQL || c_Disc.sql_segment;
177        END LOOP;
178 
179        lv_parser  := substr(l_SQL,(instr(l_SQL,'SELECT') + 6));
180        lv_parser  := substr(lv_parser,1,(instr(lv_parser,'FROM') - 1));
181        lv_parser  := trim(lv_parser);
182        lv_parser  := lv_parser||',';
183 
184        WHILE lv_parser IS NOT NULL LOOP
185          DECLARE
186              lv_check VARCHAR2(100);
187          BEGIN
188              lv_check  := substr(lv_parser,1,(instr(lv_parser,',')-1));
189              lv_parser := trim(substr(lv_parser,(instr(lv_parser,',')+1)));
190 
191              IF ((UPPER(lv_check) like '%PERSON_ID%') OR
192                  (UPPER(lv_check) like '%PARTY_ID%')) THEN
193                   l_SQL := 'SELECT '||lv_check||' PERSON_ID '||
194                        substr(l_SQL,(instr(l_SQL,'FROM')));
195                   lv_found := 'Y';
196                   lv_parser := NULL;
197               END IF;
198          END;
199        END LOOP;
200 
201        IF INSTR(l_SQL,' ORDER BY ') > 0 THEN
202          l_SQL := SUBSTR(l_SQL,0,(INSTR(l_SQL,' ORDER BY ')));
203        END IF;
204 
205        IF NVL(lv_found,'N') = 'N' THEN
206               RAISE NO_DATA_FOUND;
207        END IF;
208     END IF;
209     p_Status := FND_API.g_ret_sts_success;
210     p_group_type := lv_group_type;
211     RETURN l_SQL;
212 
213   EXCEPTION
214     WHEN NO_DATA_FOUND THEN
215       p_Status := FND_API.g_ret_sts_unexp_error ;
216 
217       IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
218         FND_MSG_PUB.add_exc_msg(g_pkg_name, g_api_name);
219       END IF;
220       FND_MSG_PUB.count_and_get(
221         p_encoded => FND_API.g_false,
222         p_count   => x_Count,
223         p_data    => x_Data
224       );
225       RETURN l_SQL_exp;
226     WHEN FND_API.g_exc_error THEN
227       p_Status := FND_API.g_ret_sts_error;
228       FND_MSG_PUB.count_and_get(
229         p_encoded => FND_API.g_false,
230         p_count   => x_Count,
231         p_data    => x_Data
232       );
233       RETURN l_SQL_exp;
234     WHEN FND_API.g_exc_unexpected_error THEN
235       p_Status := FND_API.g_ret_sts_unexp_error ;
236       FND_MSG_PUB.count_and_get(
237         p_encoded => FND_API.g_false,
238         p_count   => x_count,
239         p_data    => x_data
240       );
241       RETURN l_SQL_exp;
242   END GET_DYNAMIC_SQL;
243 
244 
245   FUNCTION DYN_PIG_MEMBER(p_GroupID  IN   NUMBER,
246                        p_PersonID IN   NUMBER)
247   RETURN NUMBER AS
248 
249      --local variables
250 
251     l_SQL               VARCHAR2(32767);
252     l_length            NUMBER;
253     l_id                NUMBER(6);
254     lv_parser           VARCHAR2(32767);
255     lv_found            VARCHAR2(1);
256 
257     TYPE c_person_id_grpCurTyp IS REF CURSOR ;
258     c_person_id_grp c_person_id_grpCurTyp ;
259     TYPE c_person_id_grp_recTyp IS RECORD
260     (  person_id igs_pe_person_base_v.person_id%TYPE);
261      c_person_id_grp_rec c_person_id_grp_recTyp ;
262 
263     CURSOR c_Rec IS
264     SELECT S.sql_segment
265     FROM IGS_PE_PERSID_GROUP_ALL G, IGS_PE_DYN_SQLSEGS S
266     WHERE G.group_id = p_GroupID
267     AND G.file_name = S.file_name
268     ORDER BY S.seg_sequence_num;
269 
270 
271   BEGIN
272     l_SQL               := '';
273     FOR c_Disc IN c_Rec LOOP
274         l_SQL  := l_SQL || c_Disc.sql_segment;
275     END LOOP;
276 
277     l_SQL :=  rtrim(l_SQL);
278     lv_parser  := substr(l_SQL,(instr(l_SQL,'SELECT') + 6));
279     lv_parser  := substr(lv_parser,1,(instr(lv_parser,'FROM') - 1));
280     lv_parser  := trim(lv_parser);
281     lv_parser  := lv_parser||',';
282 
283     WHILE lv_parser IS NOT NULL LOOP
284       DECLARE
285           lv_check VARCHAR2(100);
286       BEGIN
287           lv_check  := substr(lv_parser,1,(instr(lv_parser,',')-1));
288           lv_parser := trim(substr(lv_parser,(instr(lv_parser,',')+1)));
289 
290           IF ((lv_check like '%PERSON_ID%') OR
291               (lv_check like '%PARTY_ID%')) THEN
292                l_SQL := 'SELECT '||lv_check||' PERSON_ID '||
293                     substr(l_SQL,(instr(l_SQL,'FROM')));
294                lv_found := 'Y';
295                lv_parser := NULL;
296            END IF;
297       END;
298     END LOOP;
299     IF NVL(lv_found,'N') = 'N' THEN
300            RAISE NO_DATA_FOUND;
301     END IF;
302 
303 --  skpandey, 02-FEB-2006, Bug#4937960: Changed cursor as a part of LITERAL fix
304     OPEN c_person_id_grp  FOR 'SELECT person_id FROM ('||l_SQL||') WHERE person_id = :p_PersonID' USING p_PersonID;
305 
306     FETCH c_person_id_grp INTO c_person_id_grp_rec;
307     IF  c_person_id_grp%NOTFOUND THEN
308        CLOSE c_person_id_grp;
309        RETURN  NULL;
310     ELSE
311        CLOSE c_person_id_grp;
312        RETURN p_PersonID;
313     END IF;
314 
315 
316   EXCEPTION
317     WHEN OTHERS THEN
318         Fnd_Message.Set_Name('IGS' , 'DYN_PIG_MEMBER');
319         IGS_GE_MSG_STACK.ADD;
320         App_Exception.Raise_Exception ;
321 
322   END DYN_PIG_MEMBER;
323 
324 /*==========================================================================+
325  | Name:  IGS_Post_Save_Document().                                         |
326  |        To enable automatic extraction of SQL, Oracle Discoverer has      |
327  |        enabled a trigger that gets fired whenever a Workbook is          |
328  |        saved.  The "trigger" looks for a PL/SQL function which is        |
329  |        mapped to this function and then does the necessary data          |
330  |        insertion.                                                        |
331  +==========================================================================*/
332 
333   FUNCTION IGS_POST_SAVE_DOCUMENT(p_WorkBookOwner IN VARCHAR2,
334                                   p_WorkBookName  IN VARCHAR2,
335                                   p_WorkSheetName IN VARCHAR2,
336                                   p_Sequence      IN NUMBER,
337                                   p_SQLSegment    IN VARCHAR2)
338   RETURN NUMBER IS
339 
340     -- local variables
341     l_sqlerrm 	       VARCHAR2(600);
342     l_sqlcode          VARCHAR2(100);
343     l_sequence_id      NUMBER(6);
344     l_creator_id       NUMBER(15);
345     l_temp_str	       VARCHAR2(200);
346     l_num              NUMBER;
347 
348     l_insert	       BOOLEAN;
349     l_sqltxt	       VARCHAR2(32767);
350 
351     CURSOR c_dyn_sql IS
352     SELECT 1
353     FROM IGS_PE_DYN_SQLSEGS
354     WHERE file_name = UPPER(p_WorkBookName)||':'||UPPER(p_WorkSheetName);
355 
356     CURSOR c_prev_seg IS
357     SELECT 1
358     FROM IGS_PE_DYN_SQLSEGS
359     WHERE file_name = UPPER(p_WorkBookName)||':'||UPPER(p_WorkSheetName)
360     AND seg_sequence_num=1;
361 
362 
363   BEGIN
364     l_sqltxt	       := '';
365     l_temp_str := substr(p_WorkBookOwner, 2);
366     l_creator_id := to_number(l_temp_str);
367 
368 
369     IF (AMS_DISCOVERER_PVT.EUL_TRIGGER$POST_SAVE_DOCUMENT(p_WorkBookOwner,
370       p_WorkBookName, p_WorkSheetName, p_Sequence, p_SQLSegment) = 0) THEN
371 
372       l_insert := FALSE;
373       --check for an existing set of workbook entries
374       if (p_Sequence < 2) then
375          OPEN c_dyn_sql;
376          FETCH c_dyn_sql INTO l_num;
377          IF(c_dyn_sql%FOUND) THEN
378              DELETE from IGS_PE_DYN_SQLSEGS
379              WHERE file_name = UPPER(p_WorkBookName)||':'
380                                ||UPPER(p_WorkSheetName);
381          END IF;
382          CLOSE c_dyn_sql;
383 
384          l_sqltxt := UPPER(p_SQLSegment);
385          IF INSTR(l_sqltxt, '.PARTY_ID') > 0 OR
386             INSTR(l_sqltxt, '.PERSON_ID') > 0
387          THEN
388             l_insert := TRUE;
389          END IF;
390       else  /* Continuing segments */
391          OPEN c_prev_seg;
392          FETCH c_prev_seg INTO l_num;
393          IF (c_prev_seg%FOUND) THEN
394             l_insert := TRUE;
395          ELSE
396             l_insert := FALSE;
397          END IF;
398          CLOSE c_prev_seg;
399       end if;
400 
401       IF l_insert = TRUE THEN
402          l_sqltxt := replace(p_SQLSegment,fnd_global.local_chr(10),' ');
403          INSERT INTO IGS_PE_DYN_SQLSEGS (
404             SQLSEGS_ID,
405             FILE_NAME,
406             SEG_SEQUENCE_NUM,
407             SQL_SEGMENT,
408             CREATED_BY,
409             CREATION_DATE,
410             LAST_UPDATED_BY,
411             LAST_UPDATE_DATE
412           )
413 	  VALUES (
414   	    IGS_PE_DYN_SQLSEGS_S.nextval,
415             UPPER(p_WorkBookName)||':'||UPPER(p_WorkSheetName),
416   	    p_Sequence,
417   	    l_sqltxt,
418   	    l_creator_id,
419   	    SYSDATE,
420   	    l_creator_id,
421   	    SYSDATE
422           );
423        END IF;
424 
425     ELSE
426       RETURN(1);
427     END IF;
428 
429 
430   RETURN(0);
431 
432 
433   EXCEPTION
434     WHEN OTHERS THEN
435       l_sqlerrm := SQLERRM;
436       l_sqlcode := SQLCODE;
437       RETURN (1) ;
438 
439   END IGS_POST_SAVE_DOCUMENT;
440 
441 /*==========================================================================+
442  | Name: GET_DYNAMIC_SQL_FROM_FILE().                                             |
443  |       Returns the SQL extracted from Discoverer.                         |
444  +==========================================================================*/
445 
446   FUNCTION GET_DYNAMIC_SQL_FROM_FILE(
447      p_FileName	IN     		IGS_PE_DYN_SQLSEGS.file_name%TYPE,
448      p_Status	OUT NOCOPY 	VARCHAR2) RETURN VARCHAR2
449   IS
450 
451      --local variables
452 
453     l_SQL 		VARCHAR2(32767);
454     l_SQL_exp 		VARCHAR2(67);
455     l_id		NUMBER(6);
456     lv_parser           VARCHAR2(32767);
457     lv_found            VARCHAR2(1);
458     x_Count		NUMBER;
459     x_Data		VARCHAR2(2000);
460 
461     CURSOR c_Rec (cp_FileName IGS_PE_DYN_SQLSEGS.file_name%TYPE) IS
462     SELECT S.sql_segment
463     FROM IGS_PE_DYN_SQLSEGS S
464     WHERE S.file_name = cp_FileName
465     ORDER BY S.seg_sequence_num;
466 
467   BEGIN
468        l_SQL 		         := '';
469        l_SQL_exp 		 := 'SELECT 1 FROM DUAL';
470        FOR c_Disc IN c_REC(p_FileName) LOOP
471           l_SQL  := l_SQL || c_Disc.sql_segment;
472        END LOOP;
473 
474        lv_parser  := substr(l_SQL,(instr(l_SQL,'SELECT') + 6));
475        lv_parser  := substr(lv_parser,1,(instr(lv_parser,'FROM') - 1));
476        lv_parser  := trim(lv_parser);
477        lv_parser  := lv_parser||',';
478 
479        WHILE lv_parser IS NOT NULL LOOP
480          DECLARE
481              lv_check VARCHAR2(100);
482          BEGIN
483              lv_check  := substr(lv_parser,1,(instr(lv_parser,',')-1));
484              lv_parser := trim(substr(lv_parser,(instr(lv_parser,',')+1)));
485 
486              IF ((UPPER(lv_check) like '%PERSON_ID%') OR
487                  (UPPER(lv_check) like '%PARTY_ID%')) THEN
488                   l_SQL := 'SELECT '||lv_check||' PERSON_ID '||
489                        substr(l_SQL,(instr(l_SQL,'FROM')));
490                   lv_found := 'Y';
491                   lv_parser := NULL;
492               END IF;
493          END;
494        END LOOP;
495 
496        IF INSTR(l_SQL,' ORDER BY ') > 0 THEN
497          l_SQL := SUBSTR(l_SQL,0,(INSTR(l_SQL,' ORDER BY ')));
498        END IF;
499 
500        IF NVL(lv_found,'N') = 'N' THEN
501               RAISE NO_DATA_FOUND;
502        END IF;
503 
504     p_Status := FND_API.g_ret_sts_success;
505 
506     RETURN l_SQL;
507 
508   EXCEPTION
509     WHEN NO_DATA_FOUND THEN
510       p_Status := FND_API.g_ret_sts_unexp_error ;
511 
512       IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
513         FND_MSG_PUB.add_exc_msg(g_pkg_name, g_api_name);
514       END IF;
515       FND_MSG_PUB.count_and_get(
516         p_encoded => FND_API.g_false,
517         p_count   => x_Count,
518         p_data    => x_Data
519       );
520       RETURN l_SQL_exp;
521     WHEN FND_API.g_exc_error THEN
522       p_Status := FND_API.g_ret_sts_error;
523       FND_MSG_PUB.count_and_get(
524         p_encoded => FND_API.g_false,
525         p_count   => x_Count,
526         p_data    => x_Data
527       );
528       RETURN l_SQL_exp;
529     WHEN FND_API.g_exc_unexpected_error THEN
530       p_Status := FND_API.g_ret_sts_unexp_error ;
531       FND_MSG_PUB.count_and_get(
532         p_encoded => FND_API.g_false,
533         p_count   => x_count,
534         p_data    => x_data
535       );
536       RETURN l_SQL_exp;
537   END GET_DYNAMIC_SQL_FROM_FILE;
538 
539 END IGS_PE_DYNAMIC_PERSID_GROUP;