DBA Data[Home] [Help]

PACKAGE BODY: APPS.JTF_PF_CONV_PKG

Source


1 PACKAGE BODY JTF_PF_CONV_PKG AS
2 /* $Header: jtfpfconvpkgb.pls 120.14 2008/04/28 15:32:10 rlandows ship $ */
3 /*===========================================================================+
4  |               Copyright (c) 2002 Oracle Corporation                       |
5  |                  Redwood Shores, California, USA                          |
6  |                       ALL rights reserved.                                |
7  +===========================================================================+
8  |   FILE NAME                                                               |
9  |             jtfpfconvpkgb.pls			                     |
10  |                                                                           |
11  |   Description                                                             |
12  |                                                                           |
13  |     This FILE contains THE PACKAGE BODY FOR THE                           |
14  |     JTF_PF_CONV_PKG , which IS THE PLSQL INTERFACE FOR THE                |
15  |     jsp (activity) LOGGING project                                        |
16  |                                                                           |
17  |     Modification History:                                                 |
18  |    05-Feb-2004     Modified  navkumar                                     |
19  |                       fixed midnight-straddle bug going in %_SUMM tables  |
20  |                       split migrate_data to _stats and _raw for           |
21  |                       troubleshooting                                     |
22  |    08-Jan-2004     Modified  angunda                                      |
23  |                       modified migrate_data to write to JTF_PF_%_SUMM     |
24  |                       Added TECH_STACK logic				     |
25  |    14-Apr-2002     Modified  navkumar                                     |
26  |                       added a suite OF PL/SQL FUNCTIONS and procedures    |
27  |    11-Apr-2002     Created   bsanghav                                     |
28  |___________________________________________________________________________|*/
29 
30 	last_migrate_day DATE;
31 
32   PROCEDURE writePFObjectTable(objTab JTF_PF_PAGE_OBJECT_TABLE, write_to_jtf INTEGER, tech_stack_tbl JTF_PF_TECHSTACK_TABLE, track_prps_tbl JTF_PF_TRACKPURPOSE_TABLE, dbdate OUT NOCOPY DATE) IS
33 	PRAGMA AUTONOMOUS_TRANSACTION;
34         enqueue_options     dbms_aq.enqueue_options_t;
35         message_properties  dbms_aq.message_properties_t;
36         message_handle      RAW(16);
37         objTabLocal             JTF_PF_PAGE_OBJECT_TABLE;
38 	obj	                     JTF_PF_PAGE_OBJECT;
39 	dummyPageObj         JTF_PF_PAGE_OBJECT;
40 	seq_num                  INTEGER;
41 
42    BEGIN
43    objTabLocal             := JTF_PF_PAGE_OBJECT_TABLE();
44    FOR i IN 1..objTab.COUNT
45     LOOP
46       obj := objTab(i);
47       objTabLocal.EXTEND;
48       SELECT JTF_PF_SEQ.NEXTVAL INTO seq_num FROM dual;
49       objTabLocal(i) := JTF_PF_PAGE_OBJECT(JTF_PF_INFO_OBJECT(seq_num,obj.info.Day,obj.info.Timestamp),obj.dpf,obj.ses,obj.jsp,
50                                           obj.loc,obj.lang,obj.client,obj.params,
51                                           obj.cookies,obj.headers, obj.prodinfo);
52     END LOOP;
53   SELECT sysdate INTO dbdate FROM dual;
54   IF (write_to_jtf = 1) THEN
55             FORALL indx IN objTabLocal.FIRST .. objTabLocal.LAST
56             INSERT INTO jtf_pf_repository(
57 			pageobject, object_version_number,
58 			created_by, creation_date,
59 			last_updated_by, last_update_date, tech_stack, track_purpose)
60 		VALUES (objTabLocal(indx), 0, 690, sysdate, 690, sysdate, tech_stack_tbl(indx), track_prps_tbl(indx));
61 
62        ELSE
63            message_properties.correlation := seq_num;
64            message_properties.expiration := 24*60*60; -- messages expire in one day after first dequeue
65            dbms_aq.enqueue(queue_name => qname,
66        	 	           enqueue_options      => enqueue_options,
67 	                   message_properties   => message_properties,
68 	                   payload       	=> dummyPageObj,
69  	                   msgid                => message_handle);
70        END IF;
71        COMMIT;
72   END writePFObjectTable;
73 
74    /*============================================================================================================
75     |  Writes THE Page flow data coming IN FROM THE JAVA layer INTO Advanced Queue
76     |  INTO JTF_PF_PARAMS_TABLE
77     |  This IS an autonomous TRANSACTION i.e. It does NOT matter whether THE parent TRANSACTION
78     |  commited OR rolled back , this TRANSACTION will COMMIT IF ALL goes well
79    ============================================================================================================*/
80    PROCEDURE writePFObject(obj JTF_PF_PAGE_OBJECT,write_to_jtf INTEGER,tech_stack VARCHAR2, track_purpose VARCHAR2, dbdate OUT NOCOPY DATE) IS
81 	PRAGMA AUTONOMOUS_TRANSACTION;
82 	pObject JTF_PF_PAGE_OBJECT;
83         enqueue_options     dbms_aq.enqueue_options_t;
84         message_properties  dbms_aq.message_properties_t;
85         message_handle      RAW(16);
86 	dummyPageObj        JTF_PF_PAGE_OBJECT;
87 	seq_num             INTEGER;
88    BEGIN
89        SELECT JTF_PF_SEQ.NEXTVAL INTO seq_num FROM dual;
90        SELECT sysdate INTO dbdate FROM dual;
91        dummyPageObj := JTF_PF_PAGE_OBJECT(JTF_PF_INFO_OBJECT(seq_num,obj.info.Day,obj.info.Timestamp),obj.dpf,obj.ses,obj.jsp,
92 					  obj.loc,obj.lang,obj.client,obj.params,
93                                           obj.cookies,obj.headers,obj.prodinfo);
94        IF (write_to_jtf = 1) THEN
95            INSERT INTO jtf_pf_repository(
96 			pageobject, object_version_number,
97 			created_by, creation_date,
98 			last_updated_by, last_update_date, tech_stack, track_purpose)
99 		VALUES (dummyPageObj, 0, 690, obj.info.Day, 690, obj.info.Timestamp, tech_stack, track_purpose);
100        ELSE
101            message_properties.correlation := seq_num;
102            message_properties.expiration := 24*60*60; -- messages expire in one day after first dequeue
103            dbms_aq.enqueue(queue_name => qname,
104        	 	           enqueue_options      => enqueue_options,
105 	                   message_properties   => message_properties,
106 	                   payload       	=> dummyPageObj,
107  	                   msgid                => message_handle);
108        END IF;
109        COMMIT;
110   END writePFObject;
111 
112   /* ============================================================================================================
113   |  Converts THE param names AND param VALUES, coming IN AS 2 seperate arrays, FROM THE JAVA layer,         |
114   |  INTO JTF_PF_PARAMS_TABLE                                                                                |
115   |  This IS used TO construct THE JTF_PF_PAGE_OBJECT                                                        |
116   ===============================================================================================================*/
117   FUNCTION GetParams (paramNames JTF_VARCHAR2_TABLE_300, paramValues JTF_VARCHAR2_TABLE_4000, paramSz INTEGER)
118   RETURN JTF_PF_PARAMS_TABLE IS
119 	params JTF_PF_PARAMS_TABLE := JTF_PF_PARAMS_TABLE();
120   BEGIN
121 	FOR i IN 1..paramSz LOOP
122 	    params.EXTEND;
123 	    params(i) := JTF_PF_NVPAIR(paramNames(i),paramValues(i));
124 	END LOOP;
125 	RETURN params;
126   END;
127   /* ============================================================================================================
128   |  Converts THE param names AND param VALUES, coming IN AS 2 seperate arrays, FROM THE JAVA layer,         |
129   |  INTO JTF_PF_PRODPARAMS_TABLE                                                                                |
130   |  This IS used TO construct THE JTF_PF_PRODINFO_OBJECT                                                        |
131   ===============================================================================================================*/
132   FUNCTION GetProdParams (paramNames JTF_VARCHAR2_TABLE_300, paramValues JTF_VARCHAR2_TABLE_4000, paramSz INTEGER)
133   RETURN JTF_PF_PRODPARAMS_TABLE IS
134 	params JTF_PF_PRODPARAMS_TABLE := JTF_PF_PRODPARAMS_TABLE();
135   BEGIN
136 	FOR i IN 1..paramSz LOOP
137 	    params.EXTEND;
138 	    params(i) := JTF_PF_NVPAIR(paramNames(i),paramValues(i));
139 	END LOOP;
140 	RETURN params;
141   END;
142 
143   /* ========================================================================
144   |  Converts THE param names AND param VALUES,                             |
145   |    coming IN AS an ARRAY OF NVPAIRS INTO a CLOB FOR clickstream support |
146   ===========================================================================*/
147   FUNCTION GetParamString(params JTF_PF_PARAMS_TABLE)
148   RETURN CLOB IS
149         paramCLOB       CLOB;
150         paramV          VARCHAR(32767);
151         nv              JTF_PF_NVPAIR;
152         paramSz         NUMBER;
153         psize           NUMBER;
154         offset          NUMBER;
155         i               NUMBER;
156   BEGIN
157         dbms_lob.createtemporary(paramCLOB,TRUE,DBMS_LOB.CALL);
158         psize := 0;
159         IF(params IS NULL) THEN
160 		RETURN paramCLOB;
161 	END IF;
162         paramSz := params.COUNT;
163 
164         FOR i IN 1..paramSz LOOP
165                 nv := params(i);
166                 IF i <> 1 THEN
167                         paramV := '&' || nv.NAME || '=' || nv.value;
168                 ELSE
169                         paramV := nv.NAME || '=' || nv.value;
170                 END IF;
171                 IF paramV IS NOT NULL THEN
172                         psize := length(paramV);
173                         offset := DBMS_LOB.GETLENGTH(paramClob) + 1;
174                         DBMS_LOB.WRITE(paramCLOB,psize,offset,paramV);
175                 END IF;
176         END LOOP;
177         RETURN paramCLOB;
178   END;
179 
180   /* ========================================================================
181   |  Converts THE param names AND param VALUES,                             |
182   |    coming IN AS an ARRAY OF NVPAIRS INTO a CLOB FOR clickstream support |
183   ==========================================================================*/
184   FUNCTION GetCookieString(params JTF_PF_COOKIES_TABLE)
185   RETURN CLOB IS
186         paramCLOB       CLOB;
187         paramV          VARCHAR(32767);
188         nvs             JTF_PF_NVSTRIPLET;
189         paramSz         NUMBER;
190         psize           NUMBER;
191         offset          NUMBER;
192         i               NUMBER;
193   BEGIN
194         dbms_lob.createtemporary(paramCLOB,TRUE,DBMS_LOB.CALL);
195         psize := 0;
196         IF(params IS NULL) THEN
197 		RETURN paramCLOB;
198         END IF;
199         paramSz := params.COUNT;
200 
201         FOR i IN 1..paramSz LOOP
202                 nvs := params(i);
203                 IF i <> 1 THEN
204                         paramV := ' ' || nvs.NAME || '=' || nvl(nvs.value, 'JTF_PF_SZ:'||nvs.length) || ';';
205                 ELSE
206                         paramV := nvs.NAME || '=' || nvl(nvs.value, 'JTF_PF_SZ:'||nvs.length) || ';';
207                 END IF;
208                 IF paramV IS NOT NULL THEN
209                         psize := length(paramV);
210                         offset := DBMS_LOB.GETLENGTH(paramClob) + 1;
211                         DBMS_LOB.WRITE(paramCLOB,psize,offset,paramV);
212                 END IF;
213         END LOOP;
214         RETURN paramCLOB;
215   END;
216 
217   /* ============================================================================================================
218   |  Converts THE cookie names, cookie sizes  AND cokie VALUES, coming IN AS 3 seperate arrays,                 |
219   |  FROM THE JAVA layer, INTO JTF_PF_COOKIES_TABLE                                                             |
220   |  This IS used TO construct THE JTF_PF_PAGE_OBJECT                                                           |
221   ===============================================================================================================*/
222   FUNCTION GetCookies (cookieNames JTF_VARCHAR2_TABLE_300, cookieValues JTF_VARCHAR2_TABLE_4000,
223 		cookieSizes JTF_NUMBER_TABLE, cookieSz INTEGER)
224   RETURN JTF_PF_COOKIES_TABLE IS
225 	cookie JTF_PF_COOKIES_TABLE := JTF_PF_COOKIES_TABLE();
226   BEGIN
227 	cookie.EXTEND(cookieSz);
228         FOR i IN 1..cookieSz LOOP
229             cookie(i) := JTF_PF_NVSTRIPLET(cookieNames(i),cookieValues(i),cookieSizes(i));
230         END LOOP;
231 	RETURN cookie;
232   END;
233 
234 
235   /*============================================================================================================
236   | Upload THE data IN AQ periodically TO THE JTF Repository                                                   |
237   =============================================================================================================*/
238 
239     PROCEDURE uploadAllNewPfObjects IS --ang This proc is currently not being invoked anywhere
240 	pgObjects            JTF_PF_PAGE_OBJECT ;
241 	new_messages         BOOLEAN :=TRUE;
242 	dopt                 dbms_aq.dequeue_options_t;
243 	mprop                dbms_aq.message_properties_t;
244 	deq_msgid            RAW(16);
245 	no_messages          EXCEPTION;
246 	last_msg_in_jtf_rep  INTEGER;
247 	last_msg_to_upload   INTEGER;
248 	current_msg          INTEGER;
249 	QUERY                VARCHAR2(2000);
250 	PRAGMA               EXCEPTION_INIT(NO_MESSAGES,-25228);
251 	PRAGMA               AUTONOMOUS_TRANSACTION;
252    BEGIN
253          SELECT max(a.pageobject.info.recid) INTO last_msg_in_jtf_rep FROM jtf_pf_repository a;
254          -- select max(a.corrid) into last_msg_to_upload from JTF_PF_LOGGING_TABLE a;
255 
256          IF  last_msg_in_jtf_rep IS NOT NULL THEN current_msg := last_msg_in_jtf_rep; END IF;
257 
258 	 dopt.navigation:=dbms_aq.first_message;
259          dopt.dequeue_mode := DBMS_AQ.BROWSE;
260          dopt.wait := 0;
261 	 WHILE (new_messages) LOOP
262 	  BEGIN
263                 IF(current_msg IS NOT NULL) THEN
264                     current_msg := current_msg + 1;
265                     IF (current_msg > last_msg_to_upload) THEN  new_messages := FALSE; END IF;
266                     dopt.correlation := current_msg;
267                 END IF;
268 
269                 dbms_aq.dequeue(queue_name=>qname,
270 			        dequeue_options=>dopt,
271 			        message_properties=> mprop,
272 			        payload => pgObjects,
273 			        msgid => deq_msgid);
274 
275 		current_msg := mprop.correlation;
276 		dopt.navigation := dbms_aq.first_message;
277 	        dopt.wait := 0;
278                 INSERT INTO jtf_pf_repository( --ang no need to update this insert as the proc is not in use
279 			pageobject, object_version_number,
280 			created_by, creation_date,
281 			last_updated_by, last_update_date)
282 		VALUES (pgObjects, 0, 690, pgObjects.info.Day, 690, pgObjects.info.Timestamp);
283 
284 		-- dbms_output.put_line('inserted ' || mprop.correlation);
285 	  EXCEPTION
286 	       WHEN NO_MESSAGES THEN
287                   IF(current_msg IS NOT NULL) THEN
288                       current_msg := current_msg + 1;
289                       IF(current_msg > last_msg_to_upload) THEN
290    	                  -- dbms_output.put_line('No more messages to dequeue');
291                           new_messages := FALSE;
292 			  COMMIT;
293                       END IF;
294                       dopt.correlation := current_msg;
295                   END IF;
296                WHEN OTHERS THEN
297                    new_messages :=FALSE;
298 		   -- raise_application_error(-20101, SQLERRM);
299 	           -- dbms_output.put_line(SQLERRM);
300           END;
301 	 END LOOP;
302    END ;
303 
304     -- This procedure is for migrating data from the JTF_PF_REPOSITORY (OLTP Stage Area)
305     -- to the OLAP Tables (JTF_PF_ANON_ACTIVITY, JTF_PF_SES_ACTIVITY).
306     PROCEDURE MIGRATE_DATA(timezone_offset IN NUMBER) IS
307 	today DATE;
308     BEGIN
309 	SELECT trunc(sysdate) INTO today FROM dual;
310 	JTF_PF_SOA_MIGRATE_PKG.MIGRATE_LOGINS_DATA(timezone_offset);
311 	JTF_PF_SOA_MIGRATE_PKG.MIGRATE_RESP_DATA(timezone_offset);
312 	JTF_PF_SOA_MIGRATE_PKG.MIGRATE_FORMS_DATA(timezone_offset);
313 	migrate_data_raw;
314 	migrate_data_stats(today);
315 	migrated_data(1,sysdate);
316 	COMMIT;
317     END MIGRATE_DATA;
318 
319     PROCEDURE MIGRATE_DATA_STATS(today DATE) IS
320     BEGIN
321 	IF (last_migrate_day IS NULL) THEN
322 	    SELECT min(x.day) INTO last_migrate_day FROM
323             (SELECT max(day) AS day FROM JTF_PF_APP_SUMM
324 		     UNION ALL
325 		     SELECT max(day) AS day FROM JTF_PF_HOST_SUMM
326 		     UNION ALL
327 		     SELECT max(day) AS day FROM JTF_PF_PAGE_SUMM
328 		     UNION ALL
329 		     SELECT max(day) AS day FROM JTF_PF_SESSION_SUMM
330 		     UNION ALL
331 		     SELECT max(day) AS day FROM JTF_PF_USER_SUMM
332 			) x;
333 	END IF;
334 	IF (last_migrate_day IS NOT NULL) THEN
335 		--DELETE FROM JTF_PF_ANON_ACTIVITY WHERE day < last_migrate_day;
336 		--DELETE FROM JTF_PF_SES_ACTIVITY  WHERE day < last_migrate_day;
337 		DELETE FROM JTF_PF_APP_SUMM WHERE day >= last_migrate_day;
338 		DELETE FROM JTF_PF_HOST_SUMM WHERE day >= last_migrate_day;
339 		DELETE FROM JTF_PF_PAGE_SUMM WHERE day >= last_migrate_day;
340 		DELETE FROM JTF_PF_SESSION_SUMM WHERE (sessionid IS NULL and day >= last_migrate_day)
341 						or (sessionid IS NOT NULL and sessionid IN
342 							(select distinct sessionid from JTF_PF_SES_ACTIVITY where day >= last_migrate_day OR last_migrate_day IS NULL));
343 		DELETE FROM JTF_PF_USER_SUMM WHERE day >= last_migrate_day;
344 	END IF;
345 		-- ADDED to fix bug no-5036611 (START HERE)
346 		IF 	   (last_migrate_day  is null) THEN
347 
348         INSERT INTO JTF_PF_APP_SUMM (day, cnt_pages_jtf, cnt_pages_oaf, cnt_pages_form, cnt_pages_all, cnt_flows, cnt_users, cnt_apps, cnt_resps, cnt_sessions, cnt_langs)
349                 (SELECT day, cnt_pages_jtf, cnt_pages_oaf, cnt_pages_form, cnt_pages_jtf+cnt_pages_oaf+cnt_pages_form, cnt_flows, cnt_users, cnt_apps, cnt_resps, cnt_sessions, cnt_langs
350                  FROM JTF_PF_APP_SUMMARY_VL
351                  );
352         INSERT INTO JTF_PF_HOST_SUMM (day, servername, serverport, jservs, sum_exect_jtf, sum_exect_oaf, pagehits_jtf, pagehits_oaf, pagehits_all, fails, pages, badpages)
353                 (SELECT day, NVL(servername, 'N/A'), NVL(serverport, -1), jservs, sum_exect_jtf, sum_exect_oaf, pagehits_jtf, pagehits_oaf, pagehits_jtf+pagehits_oaf, fails, pages, badpages
354                  FROM JTF_PF_HOST_SUMMARY_VL
355                 );
356         INSERT INTO JTF_PF_PAGE_SUMM (day, pagename, tech_stack, cnt_pages, cnt_ses, ucnt_ses, ucnt_users, ucnt_apps, ucnt_resps, ucnt_langs,
357                         sum_exect, sum_thinkt, cnt_thinkt, startt, endt, cnt_fail, cnt_forward)
358                 (SELECT day, pagename, tech_stack, cnt_pages, cnt_ses, ucnt_ses, ucnt_users, ucnt_apps, ucnt_resps, ucnt_langs,
359                         sum_exect, sum_thinkt, cnt_thinkt, startt, endt, cnt_fail, cnt_forward
360                  FROM JTF_PF_PAGE_SUMMARY_VL
361                 );
362         INSERT INTO JTF_PF_SESSION_SUMM (day, seqid, sessionid, user_name, userid, sum_exect_jtf, sum_exect_oaf, sum_exect_form, sum_thinkt_jtf, sum_thinkt_oaf, sum_thinkt_form,
363                          cnt_pages_jtf, cnt_pages_oaf, cnt_pages_form, cnt_pages_all, ucnt_pages, ucnt_flows, ucnt_users, ucnt_apps, ucnt_resps, ucnt_langs, startt, endt, cnt_fail)
364                 (SELECT  day, seqid, sessionid, user_name, userid, sum_exect_jtf, sum_exect_oaf, sum_exect_form, sum_thinkt_jtf, sum_thinkt_oaf, sum_thinkt_form,
365                         cnt_pages_jtf, cnt_pages_oaf, cnt_pages_form, cnt_pages_jtf+cnt_pages_oaf+cnt_pages_form, ucnt_pages, ucnt_flows, ucnt_users, ucnt_apps, ucnt_resps, ucnt_langs, startt, endt, cnt_fail
366                  FROM JTF_PF_SESSION_SUMMARY_VL
367                  WHERE (sessionid IS NULL )
368                         or (sessionid IS NOT NULL and sessionid IN
369                                 (select distinct sessionid from JTF_PF_SES_ACTIVITY))
370                 );
371         INSERT INTO JTF_PF_USER_SUMM (day, user_name, userid, sum_exect_jtf, sum_exect_oaf, sum_exect_form, sum_thinkt_jtf, sum_thinkt_oaf, sum_thinkt_form,
372                         cnt_pages_jtf, cnt_pages_oaf, cnt_pages_form, cnt_pages_all, ucnt_ses, ucnt_pages, ucnt_apps, ucnt_resps, ucnt_langs, startt, endt, cnt_fail)
373                 (SELECT day, user_name, userid, sum_exect_jtf, sum_exect_oaf, sum_exect_form, sum_thinkt_jtf, sum_thinkt_oaf, sum_thinkt_form,
374                         cnt_pages_jtf, cnt_pages_oaf, cnt_pages_form, cnt_pages_jtf+cnt_pages_oaf+cnt_pages_form, ucnt_ses, ucnt_pages, ucnt_apps, ucnt_resps, ucnt_langs, startt, endt, cnt_fail
375                  FROM JTF_PF_USER_SUMMARY_VL
376                 );
377 
378 	   ELSE
379 
380         INSERT INTO JTF_PF_APP_SUMM (day, cnt_pages_jtf, cnt_pages_oaf, cnt_pages_form, cnt_pages_all, cnt_flows, cnt_users, cnt_apps, cnt_resps, cnt_sessions, cnt_langs)
381                 (SELECT day, cnt_pages_jtf, cnt_pages_oaf, cnt_pages_form, cnt_pages_jtf+cnt_pages_oaf+cnt_pages_form, cnt_flows, cnt_users, cnt_apps, cnt_resps, cnt_sessions, cnt_langs
382                  FROM JTF_PF_APP_SUMMARY_VL
383                  WHERE day >= last_migrate_day
384                  );
385         INSERT INTO JTF_PF_HOST_SUMM (day, servername, serverport, jservs, sum_exect_jtf, sum_exect_oaf, pagehits_jtf, pagehits_oaf, pagehits_all, fails, pages, badpages)
386                 (SELECT day, NVL(servername, 'N/A'), NVL(serverport, -1), jservs, sum_exect_jtf, sum_exect_oaf, pagehits_jtf, pagehits_oaf, pagehits_jtf+pagehits_oaf, fails, pages, badpages
387                  FROM JTF_PF_HOST_SUMMARY_VL
388                  WHERE day >= last_migrate_day
389                 );
390         INSERT INTO JTF_PF_PAGE_SUMM (day, pagename, tech_stack, cnt_pages, cnt_ses, ucnt_ses, ucnt_users, ucnt_apps, ucnt_resps, ucnt_langs,
391                         sum_exect, sum_thinkt, cnt_thinkt, startt, endt, cnt_fail, cnt_forward)
392                 (SELECT day, pagename, tech_stack, cnt_pages, cnt_ses, ucnt_ses, ucnt_users, ucnt_apps, ucnt_resps, ucnt_langs,
393                         sum_exect, sum_thinkt, cnt_thinkt, startt, endt, cnt_fail, cnt_forward
394                  FROM JTF_PF_PAGE_SUMMARY_VL
395                  WHERE day >= last_migrate_day
396                 );
397         INSERT INTO JTF_PF_SESSION_SUMM (day, seqid, sessionid, user_name, userid, sum_exect_jtf, sum_exect_oaf, sum_exect_form, sum_thinkt_jtf, sum_thinkt_oaf, sum_thinkt_form,
398                          cnt_pages_jtf, cnt_pages_oaf, cnt_pages_form, cnt_pages_all, ucnt_pages, ucnt_flows, ucnt_users, ucnt_apps, ucnt_resps, ucnt_langs, startt, endt, cnt_fail)
399                 (SELECT  day, seqid, sessionid, user_name, userid, sum_exect_jtf, sum_exect_oaf, sum_exect_form, sum_thinkt_jtf, sum_thinkt_oaf, sum_thinkt_form,
400                         cnt_pages_jtf, cnt_pages_oaf, cnt_pages_form, cnt_pages_jtf+cnt_pages_oaf+cnt_pages_form, ucnt_pages, ucnt_flows, ucnt_users, ucnt_apps, ucnt_resps, ucnt_langs, startt, endt, cnt_fail
401                  FROM JTF_PF_SESSION_SUMMARY_VL
402                  WHERE (sessionid IS NULL and day >= last_migrate_day)
403                         or (sessionid IS NOT NULL and sessionid IN
404                                 (select distinct sessionid from JTF_PF_SES_ACTIVITY where day >= last_migrate_day ))
405                 );
406         INSERT INTO JTF_PF_USER_SUMM (day, user_name, userid, sum_exect_jtf, sum_exect_oaf, sum_exect_form, sum_thinkt_jtf, sum_thinkt_oaf, sum_thinkt_form,
407                         cnt_pages_jtf, cnt_pages_oaf, cnt_pages_form, cnt_pages_all, ucnt_ses, ucnt_pages, ucnt_apps, ucnt_resps, ucnt_langs, startt, endt, cnt_fail)
408                 (SELECT day, user_name, userid, sum_exect_jtf, sum_exect_oaf, sum_exect_form, sum_thinkt_jtf, sum_thinkt_oaf, sum_thinkt_form,
409                         cnt_pages_jtf, cnt_pages_oaf, cnt_pages_form, cnt_pages_jtf+cnt_pages_oaf+cnt_pages_form, ucnt_ses, ucnt_pages, ucnt_apps, ucnt_resps, ucnt_langs, startt, endt, cnt_fail
410                  FROM JTF_PF_USER_SUMMARY_VL
411                  WHERE day >= last_migrate_day
412                 );
413 
414 	   END IF;
415 	   -- ADDED To fix bug no-5036611 (END HERE)
416 
417         last_migrate_day := today;
418     END MIGRATE_DATA_STATS;
419 
420     PROCEDURE MIGRATE_DATA_RAW IS
421 	v_SQLString VARCHAR2(300);
422 
423 	CURSOR po_Cursor(starting_po IN INTEGER) IS
424 		SELECT x.pageobject, x.tech_stack
425 		FROM JTF_PF_REPOSITORY x
426 		WHERE x.pageobject.info.RecId > starting_po and
427 		x.track_purpose not in (2, 4)
428 		ORDER BY x.pageobject.ses.SessionId, x.pageobject.jsp.StartTime;
429 
430 	CURSOR cur_val IS SELECT nvl(max_po,-100000000000), nvl(ses_seqid,0), nvl(anon_seqid,0) FROM JTF_PF_SEQ_VL;
431 
432 	nextpo JTF_PF_PAGE_OBJECT;
433 	currpo JTF_PF_PAGE_OBJECT;
434 	thinkT INTEGER;
435 	seqcnt1 INTEGER;
436 	seqcnt2 INTEGER;
437 	maxpo  INTEGER;
438 	currtechstack varchar2(20);
439 	nexttechstack VARCHAR2(20);
440 
441     BEGIN
442 	OPEN cur_val;
446 	currpo := NULL;
443 	FETCH cur_val INTO maxpo, seqcnt2, seqcnt1;
444 	CLOSE cur_val;
445 
447 
448 	OPEN po_Cursor(maxpo);
449 	LOOP
450 	    FETCH po_Cursor INTO nextpo, nexttechstack;
451 	    -- if record exists in the cursor (previous iteration)
452 	    IF currpo IS NOT NULL THEN
453 			-- for anonymous activity
454 			IF currpo.ses IS NULL THEN
455                             IF currpo.jsp IS NOT NULL AND currpo.loc IS NOT NULL AND currpo.info IS NOT NULL THEN
456 		      	        seqcnt1 := seqcnt1 - 1;
457 				INSERT INTO JTF_PF_ANON_ACTIVITY(
458 	                                SEQID,
459 	                                DAY,
460 	                                TECH_STACK,
461 	                                TIMESTAMP,
462 	                                SERVERNAME,
463 	                                SERVERPORT,
464 	                                JSERVPORT,
465 	                                FLOWID,
466 	                                SESSIONID,
467 	                                USERID,
468 					PROXYID,
469 	                                APPID,
470 	                                RESPID,
471 	                                LANGID,
472 	                                STARTT,
473 	                                PAGENAME,
474 	                                STATUSCODE,
475 	                                EXECT,
476 	                                THINKT,
477 	                                PO,
478 	                                OBJECT_VERSION_NUMBER,
479 	                                CREATED_BY,
480 	                                CREATION_DATE,
481 	                                LAST_UPDATED_BY,
482 	                                LAST_UPDATE_DATE
483 				) VALUES(
484 					seqcnt1,
485 					currpo.info.day,
486 					currtechstack,
487 					currpo.info.timestamp,
488 					currpo.loc.servername,
489 					currpo.loc.serverport,
490 					currpo.loc.jservport,
491 					null,
492 					null,
493 					null,
494 					null,
495 					null,
496 					null,
497 					null,
498 					NVL(currpo.jsp.starttime, -1), -- ANG - Remove NVL condition, still what to do when starttime is null
499 					NVL(currpo.jsp.NAME, 'N/A'), -- ANG - Remove NVL condition, again there are records in repository table where the value for name coln is null. How should this be handled?
500 					NVL(currpo.jsp.statusCode, -1), -- ANG - need to get rid of NVL condition
501 					NVL(currpo.jsp.executionTime, -1), -- ANG - need to get rid of NVL condition
502 					thinkT,
503 					currpo.info.Recid,
504 					0,690,currpo.info.day,690,currpo.info.timestamp);
505 		             END IF;
506 			ELSE
507 				-- for session activity
508 		    		thinkT := NULL;
509 				IF NOT(currpo.jsp.statusCode = -200) AND currpo.ses.SessionId = nextpo.ses.SessionId AND NOT(po_Cursor%NOTFOUND) THEN
510 				    thinkT := (nextpo.jsp.StartTime - (currpo.jsp.StartTime + currpo.jsp.executionTime));
511 				    IF thinkT IS NOT NULL AND thinkT <= 0 THEN
512 					thinkT := NULL;
513 				    END IF;
514 				END IF;
515                             IF          currpo.jsp               IS NOT NULL
516                                 AND     currpo.loc               IS NOT NULL
517                                 AND     currpo.info              IS NOT NULL
518 			 	AND	currtechstack            IS NOT NULL
519 			        AND	currpo.info.day          IS NOT NULL
520 				AND     currpo.info.timestamp    IS NOT NULL
521 				AND     currpo.info.Recid        IS NOT NULL
522 				AND 	currpo.ses.sessionid     IS NOT NULL
523 				AND 	currpo.ses.userid        IS NOT NULL
524 				AND 	currpo.ses.appid         IS NOT NULL
525 				AND 	currpo.ses.respid        IS NOT NULL
526 				AND 	currpo.ses.langid        IS NOT NULL
527 				AND 	currpo.jsp.starttime     IS NOT NULL
528 				AND 	currpo.jsp.NAME          IS NOT NULL
529 				AND 	currpo.jsp.statusCode    IS NOT NULL
530 				AND 	currpo.jsp.executionTime IS NOT NULL
531                             THEN
532 				seqcnt2 := seqcnt2 + 1;
533 				INSERT INTO JTF_PF_SES_ACTIVITY(
534 	                                SEQID,
535 	                                DAY,
536 	                                TECH_STACK,
537 	                                TIMESTAMP,
538 	                                SERVERNAME,
539 	                                SERVERPORT,
540 	                                JSERVPORT,
541 	                                FLOWID,
542 	                                SESSIONID,
543 	                                USERID,
544 					PROXYID,
545 	                                APPID,
546 	                                RESPID,
547 	                                LANGID,
548 	                                STARTT,
549 	                                PAGENAME,
550 	                                STATUSCODE,
551 	                                EXECT,
552 	                                THINKT,
553 	                                PO,
554 	                                OBJECT_VERSION_NUMBER,
555 	                                CREATED_BY,
556 	                                CREATION_DATE,
557 	                                LAST_UPDATED_BY,
558 	                                LAST_UPDATE_DATE
559 				) VALUES(
560 					seqcnt2,
561 					currpo.info.day,
562 					currtechstack,
563 					currpo.info.timestamp,
564 					currpo.loc.servername,
565 					currpo.loc.serverport,
566 					currpo.loc.jservport,
567 					null,
568 					currpo.ses.sessionid,
572 					currpo.ses.respid,
569 					currpo.ses.userid,
570 					currpo.ses.proxyid,
571 					currpo.ses.appid,
573 					currpo.ses.langid,
574 					currpo.jsp.starttime,
575 					currpo.jsp.NAME,
576 					currpo.jsp.statusCode,
577 					currpo.jsp.executionTime,
578 					thinkT,
579 					currpo.info.Recid,
580 					0,690,currpo.info.day,690,currpo.info.timestamp);
581 		             END IF;
582 			END IF;
583 	    END IF;
584 	    EXIT WHEN po_Cursor%NOTFOUND;
585 	    currpo := nextpo;
586 	    currtechstack := nexttechstack;
587 	END LOOP;
588 	CLOSE po_Cursor;
589     END MIGRATE_DATA_RAW;
590 
591    /*============================================================================================================
592     | Wrapper FOR migrate_data TO be called BY Concurrent Manager
593    ============================================================================================================*/
594    PROCEDURE synchronize_pageflow_data
595    (ERRBUF                    OUT NOCOPY VARCHAR2,
596    RETCODE                   OUT NOCOPY NUMBER
597    )
598    IS
599    BEGIN
600 
601      --call migrate api
602      JTF_PF_CONV_PKG.migrate_data(0);
603 
604     EXCEPTION
605     WHEN OTHERS
606     THEN
607        RETCODE := 2;
608        ERRBUF := sqlcode||':'||sqlerrm;
609        fnd_file.put_line(fnd_file.log, 'JTF_PF_CONV_PKG.synchronize_pageflow_data failed ' || sqlcode||':'||sqlerrm);
610    END synchronize_pageflow_data;
611 
612   FUNCTION GetParamNVs (po_id INTEGER)
613   RETURN JTF_VARCHAR2_TABLE_4000 IS
614         params	JTF_PF_PARAMS_TABLE;
615         paramSz	NUMBER;
616 	nv	JTF_PF_NVPAIR;
617 	pname	JTF_VARCHAR2_TABLE_4000 := JTF_VARCHAR2_TABLE_4000();
618 	CURSOR cur(poid IN INTEGER) IS
619 		SELECT x.pageobject.params
620 		FROM JTF_PF_REPOSITORY x
621 		WHERE x.pageobject.info.RecId = poid;
622   BEGIN
623 	OPEN cur(po_id);
624 	FETCH cur INTO params;
625 	IF cur%NOTFOUND THEN
626 		CLOSE cur;
627 		RETURN NULL;
628 	END IF;
629 	CLOSE cur;
630 
631 	IF params IS NULL THEN
632 		pname.EXTEND(1);
633 		pname(1) := '';
634 		RETURN pname;
635 	END IF;
636 
637 	paramSz := params.COUNT;
638 
639 	pname.EXTEND(paramSz * 2);
640         FOR i IN 1..paramSz LOOP
641 	    nv := params(i);
642 	    pname(2 * i - 1) := nv.NAME;
643 	    pname(2 * i) := nv.value;
644         END LOOP;
645 	RETURN pname;
646   END;
647 
648   FUNCTION GetParamNames (params JTF_PF_PARAMS_TABLE, paramSz INTEGER)
649   RETURN JTF_VARCHAR2_TABLE_300 IS
650 	nv    JTF_PF_NVPAIR;
651 	pname JTF_VARCHAR2_TABLE_300 := JTF_VARCHAR2_TABLE_300();
652   BEGIN
653 	pname.EXTEND(paramSz);
654         FOR i IN 1..paramSz LOOP
655 	    nv := params(i);
656 	    pname(i) := nv.NAME;
657         END LOOP;
658 	RETURN pname;
659   END;
660 
661   FUNCTION GetParamValues (params JTF_PF_PARAMS_TABLE, paramSz INTEGER)
662   RETURN JTF_VARCHAR2_TABLE_4000 IS
663 	nv    JTF_PF_NVPAIR;
664 	pval JTF_VARCHAR2_TABLE_4000 := JTF_VARCHAR2_TABLE_4000();
665   BEGIN
666 	pval.EXTEND(paramSz);
667 	FOR i IN 1..paramSz LOOP
668 	    nv := params(i);
669 	    pval(i) := nv.value;
670 	END LOOP;
671   END;
672 
673   PROCEDURE CLEAN_DATA(START_DATE DATE) IS
674 	-- PRAGMA AUTONOMOUS_TRANSACTION;
675     TYPE RECTABTYPE IS TABLE OF NUMBER  INDEX BY BINARY_INTEGER;
676     RECTABTYPE1 RECTABTYPE;
677 
678     CURSOR EBIZ_DATA IS
679       SELECT X.PAGEOBJECT.INFO.RECID FROM JTF_PF_REPOSITORY X WHERE
680 	       X.TRACK_PURPOSE IN (0,1) AND
681 	        X.LAST_UPDATE_DATE <= LEAST(START_DATE ,(SELECT LAST_RECORD_MIGRATED_TIME FROM JTF_PF_PURGEABLE WHERE TRACK_PURPOSE IN (0,1)));
682 
683     CURSOR NON_EBIZ_DATA IS
684       SELECT X.PAGEOBJECT.INFO.RECID FROM JTF_PF_REPOSITORY X WHERE
685 	       X.TRACK_PURPOSE = 4 AND
686 	       X.LAST_UPDATE_DATE <= LEAST(START_DATE , (SELECT LAST_RECORD_MIGRATED_TIME FROM JTF_PF_PURGEABLE WHERE TRACK_PURPOSE = 4));
687 
688     CURSOR WA_EBIZ_DATA IS
689       SELECT X.PAGEOBJECT.INFO.RECID FROM JTF_PF_REPOSITORY X WHERE
690 	       X.TRACK_PURPOSE = 2 AND
691 	      X.LAST_UPDATE_DATE <= LEAST( START_DATE, (SELECT LAST_RECORD_MIGRATED_TIME FROM JTF_PF_PURGEABLE WHERE TRACK_PURPOSE = 2));
692 
693     CURSOR COMMON_DATA IS
694       SELECT X.PAGEOBJECT.INFO.RECID FROM JTF_PF_REPOSITORY X WHERE
695 	       X.TRACK_PURPOSE = 3 AND
696 	      X.LAST_UPDATE_DATE <= LEAST (START_DATE ,(SELECT MIN(LAST_RECORD_MIGRATED_TIME) FROM JTF_PF_PURGEABLE WHERE TRACK_PURPOSE IN(0,1,2)));
697 
698   BEGIN
699      OPEN EBIZ_DATA;
700      LOOP
701         FETCH EBIZ_DATA BULK COLLECT INTO RECTABTYPE1 LIMIT 1000;
702 	IF RECTABTYPE1.COUNT > 0  THEN
703 	  FORALL I IN RECTABTYPE1.FIRST .. RECTABTYPE1.LAST
704           DELETE FROM JTF_PF_REPOSITORY X WHERE X.PAGEOBJECT.INFO.RECID = RECTABTYPE1(I);
705 	END IF;
706 
707        EXIT WHEN EBIZ_DATA%NOTFOUND;
708      END LOOP;
709     RECTABTYPE1.DELETE;
710     CLOSE EBIZ_DATA;
711 
712      OPEN NON_EBIZ_DATA;
713      LOOP
714         FETCH NON_EBIZ_DATA BULK COLLECT INTO RECTABTYPE1 LIMIT 1000;
715 	     IF RECTABTYPE1.COUNT > 0  THEN
716      FORALL I IN RECTABTYPE1.FIRST .. RECTABTYPE1.LAST
720        EXIT WHEN NON_EBIZ_DATA%NOTFOUND;
717           DELETE FROM JTF_PF_REPOSITORY X WHERE X.PAGEOBJECT.INFO.RECID = RECTABTYPE1(I);
718     END IF;
719 
721      END LOOP;
722     RECTABTYPE1.DELETE;
723 	CLOSE NON_EBIZ_DATA;
724 
725      OPEN WA_EBIZ_DATA;
726      LOOP
727         FETCH WA_EBIZ_DATA BULK COLLECT INTO RECTABTYPE1 LIMIT 1000;
728 	     IF RECTABTYPE1.COUNT > 0  THEN
729      FORALL I IN RECTABTYPE1.FIRST .. RECTABTYPE1.LAST
730           DELETE FROM JTF_PF_REPOSITORY X WHERE X.PAGEOBJECT.INFO.RECID = RECTABTYPE1(I);
731     END IF;
732 
733        EXIT WHEN WA_EBIZ_DATA%NOTFOUND;
734      END LOOP;
735     RECTABTYPE1.DELETE;
736 	CLOSE WA_EBIZ_DATA;
737 
738 
739      OPEN COMMON_DATA;
740      LOOP
741         FETCH COMMON_DATA BULK COLLECT INTO RECTABTYPE1 LIMIT 1000;
742 	     IF RECTABTYPE1.COUNT > 0  THEN
743      FORALL I IN RECTABTYPE1.FIRST .. RECTABTYPE1.LAST
744           DELETE FROM JTF_PF_REPOSITORY X WHERE X.PAGEOBJECT.INFO.RECID = RECTABTYPE1(I);
745     END IF;
746        EXIT WHEN COMMON_DATA%NOTFOUND;
747      END LOOP;
748 
749 
750     RECTABTYPE1.DELETE;
751          CLOSE COMMON_DATA;
752     COMMIT;
753   END;
754 
755   PROCEDURE PURGE_DATA(start_date IN DATE) IS
756 	PRAGMA AUTONOMOUS_TRANSACTION;
757 	TEMP_DATE DATE;
758   BEGIN
759         --dbms_output.put_line('purge data ');
760 	TEMP_DATE:=(START_DATE-1);
761         CLEAN_DATA(TEMP_DATE);
762 	DELETE FROM JTF_PF_SES_ACTIVITY WHERE DAY <= START_DATE;
763         DELETE FROM JTF_PF_ANON_ACTIVITY	WHERE DAY <= START_DATE;
764 	DELETE FROM JTF_PF_APP_SUMM WHERE DAY <= START_DATE;
765         DELETE FROM JTF_PF_HOST_SUMM WHERE DAY <= START_DATE;
766 	DELETE FROM JTF_PF_PAGE_SUMM WHERE DAY <= START_DATE;
767         DELETE FROM JTF_PF_SESSION_SUMM WHERE DAY <= START_DATE;
768 	DELETE FROM JTF_PF_USER_SUMM WHERE DAY <= START_DATE;
769 	COMMIT;
770   END;
771 
772   --6991900, changed date parameter to varchar2
773   PROCEDURE PURGE_DATA(ERRBUF OUT NOCOPY VARCHAR2, RETCODE OUT NOCOPY NUMBER, start_date_v IN varchar2) IS
774 	PRAGMA AUTONOMOUS_TRANSACTION;
775         start_date date;
776   BEGIN
777         start_date := FND_CONC_DATE.STRING_TO_DATE(start_date_v);
778         PURGE_DATA(START_DATE);
779   EXCEPTION
780     WHEN OTHERS
781     THEN
782        RETCODE := 2;
783        ERRBUF := sqlcode||':'||sqlerrm;
784        fnd_file.put_line(fnd_file.log, 'JTF_PF_CONV_PKG.PURGE_DATA failed ' || sqlcode||':'||sqlerrm);
785   END;
786 
787 
788   PROCEDURE MULTIPLY_DATA(days NUMBER) IS
789 	PRAGMA AUTONOMOUS_TRANSACTION;
790 	CURSOR cur IS
791 		SELECT MAX(x.pageobject.ses.sessionid) + 3
792 		FROM JTF_PF_REPOSITORY_TMP x;
793 	max_sessionid INTEGER;
794   BEGIN
795 	DELETE FROM JTF_PF_REPOSITORY_TMP;
796 	DELETE FROM JTF_PF_REPOSITORY x WHERE x.pageobject.info.day > sysdate;
797 	COMMIT;
798 
799 	INSERT INTO JTF_PF_REPOSITORY_TMP(pageobject, object_version_number, created_by, creation_date, last_updated_by, last_update_date, last_update_login, security_group_id, tech_stack)
800 		(SELECT pageobject, object_version_number, created_by, creation_date, last_updated_by, last_update_date, last_update_login, security_group_id, tech_stack FROM JTF_PF_REPOSITORY x
801 		WHERE
802 				x.pageobject.info.day > sysdate - 1
803 			AND	x.pageobject.info.day < sysdate);
804 	COMMIT;
805 
806 	OPEN cur;
807 	FETCH cur INTO max_sessionid;
808 	IF(cur%NOTFOUND OR max_sessionid IS NULL) THEN
809 		max_sessionid := 100000;
810 	END IF;
811 	CLOSE cur;
812 
813 	FOR i IN 1..days LOOP
814 		UPDATE JTF_PF_REPOSITORY_TMP x
815 		SET
816 			x.pageobject.info.day = x.pageobject.info.day + 1,
817 			x.pageobject.info.timestamp = x.pageobject.info.timestamp + 1,
818 			x.pageobject.jsp.starttime = x.pageobject.jsp.starttime + 1000 * 60 * 60 * 24;
819 		COMMIT;
820 
821 		UPDATE JTF_PF_REPOSITORY_TMP x
822 		SET
823 			x.pageobject.ses.sessionid = decode(x.pageobject.ses.sessionid,
824 								NULL,x.pageobject.ses.sessionid,
825 								-1,x.pageobject.ses.sessionid,
826 								x.pageobject.ses.sessionid - max_sessionid)
827 		WHERE
828 			x.pageobject.ses IS NOT NULL;
829 		COMMIT;
830 
831 		INSERT INTO JTF_PF_REPOSITORY (pageobject, object_version_number, created_by, creation_date, last_updated_by, last_update_date, last_update_login, security_group_id, tech_stack)
832             (SELECT pageobject, object_version_number, created_by, creation_date, last_updated_by, last_update_date, last_update_login, security_group_id, tech_stack FROM JTF_PF_REPOSITORY_TMP);
833 		COMMIT;
834 	END LOOP;
835   END;
836   Function GROUP_CONCAT ( list IN JTF_PF_TABLETYPE, separator VARCHAR2)
837   RETURN  VARCHAR2 IS
838     ret VARCHAR2(1000) :='';
839   BEGIN
840     IF (list.COUNT > 0) THEN
841       FOR j IN list.FIRST..list.LAST  LOOP
842         IF j = 1 THEN
843           ret := list(j);
844         ELSE
845           ret := ret || separator || list(j);
846         END IF;
847       END LOOP;
848       RETURN ret;
849     ELSE
850       RETURN ret;
851     END IF;
852   END;
853   PROCEDURE MIGRATED_DATA(TRK_PRPS NUMBER, LST_RCD_MGRTD_TM DATE) IS
854     TP NUMBER := -1;
855   BEGIN
856     SELECT COUNT(TRACK_PURPOSE) INTO TP FROM JTF_PF_PURGEABLE WHERE TRACK_PURPOSE = TRK_PRPS;
857     IF (TP > 0) THEN
861     END IF;
858       UPDATE JTF_PF_PURGEABLE SET LAST_RECORD_MIGRATED_TIME = LST_RCD_MGRTD_TM WHERE TRACK_PURPOSE = TRK_PRPS;
859     ELSE
860       INSERT INTO JTF_PF_PURGEABLE(TRACK_PURPOSE, LAST_RECORD_MIGRATED_TIME) VALUES(TRK_PRPS, LST_RCD_MGRTD_TM);
862   END MIGRATED_DATA;
863 END;