DBA Data[Home] [Help]

PACKAGE BODY: APPS.IEC_RECOVER_PVT

Source


1 PACKAGE BODY      IEC_RECOVER_PVT AS
2 /* $Header: IECOCRCB.pls 115.30 2004/05/19 17:14:04 minwang ship $ */
3 
4 g_pkg_name CONSTANT VARCHAR2(30) := 'IEC_RECOVER_PVT';
5 g_error_msg VARCHAR2(2048);
6 
7 G_RECOVER_ACTION_TYPE CONSTANT NUMBER := 2;
8 G_NUM_MINUTES_IN_DAY CONSTANT NUMBER := 1440;
9 G_SYSTEM_OUTCOME_CODE CONSTANT NUMBER := 37;
10 G_LOST_RESULT_CODE CONSTANT NUMBER := 11;
11 G_FUNCTIONAL CONSTANT NUMBER := 2;
12 G_PERFORMANCE CONSTANT NUMBER := 1;
13 G_SOURCE_ID NUMBER;
14 
15 
16 PROCEDURE Log ( p_activity_desc IN VARCHAR2
17               , p_method_name   IN VARCHAR2
18               , p_sub_method    IN VARCHAR2
19               , p_sql_code      IN NUMBER
20               , p_sql_errm      IN VARCHAR2)
21 IS
22    l_error_msg VARCHAR2(2048);
23 BEGIN
24 
25    IEC_OCS_LOG_PVT.LOG_INTERNAL_PLSQL_ERROR
26                       ( 'IEC_RECOVER_PVT'
27                       , p_method_name
28                       , p_sub_method
29                       , p_activity_desc
30                       , p_sql_code
31                       , p_sql_errm
32                       , l_error_msg
33                       );
34 
35 END Log;
36 
37 
38 -----------------------------++++++-------------------------------
39 --
40 -- Start of comments
41 --
42 --  API name    : RECOVER_LIST_ENTRIES
43 --  Type        : Public
44 --  Pre-reqs    : None
45 --  Function    : Recover entries that have been checked out of AMS_LIST_ENTRIES for longer
46 --                than the time sent in as P_LOST_INTERVAL.
47 --  Parameters  : P_LOST_INTERVAL                IN     NUMBER                       Required
48 --                X_RETURN_CODE                    OUT  VARCHAR2                       Required
49 --
50 --  Version     : Initial version 1.0
51 --
52 -- End of comments
53 --
54 -----------------------------++++++-------------------------------
55 PROCEDURE RECOVER_LIST_ENTRIES
56    ( P_SOURCE_ID            IN             NUMBER
57    , P_LIST_ID              IN             NUMBER
58    , P_LOST_INTERVAL        IN             NUMBER
59    , X_ACTION_ID            IN   OUT NOCOPY  NUMBER
60    )
61  IS
62 
63   l_api_name CONSTANT VARCHAR2(30) := 'RECOVER_LIST_ENTRIES';
64   TYPE EntryCollection IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
65   TYPE FlagCollection IS TABLE OF VARCHAR2(1) INDEX BY BINARY_INTEGER;
66   l_update_count NUMBER := 0;
67   l_update_list EntryCollection;
68   l_entry_list EntryCollection;
69   l_cache_list EntryCollection;
70   l_subset_collection EntryCollection;
71   l_update_subset_collection EntryCollection;
72   l_callback_collection FlagCollection;
73   l_recycle_list NUMBER := 0;
74   l_ok_list NUMBER := 0;
75   l_lost_interval NUMBER;
76   l_list_entry_found NUMBER;
77   l_returns_id NUMBER;
78   l_user_id NUMBER;
79   l_err_msg VARCHAR2(100);
80   l_update_date DATE;
81   l_check_date DATE;
82   l_recycle_flag VARCHAR2(10);
83   l_batch_entries CONSTANT NUMBER := 10000;
84   l_entry_count NUMBER;
85   l_watermark NUMBER := 0;
86   l_outer_itertion NUMBER := 0;
87   l_inner_itertion NUMBER := 0;
88   l_start_time NUMBER ;
89   l_end_time NUMBER ;
90   l_log_status VARCHAR2(1);
91   l_total_count NUMBER;
92   l_sequence NUMBER;
93   l_subset_id NUMBER;
94   l_cache_id NUMBER;
95   l_callback_flag VARCHAR2(1);
96   l_no_sequence_except EXCEPTION;
97   l_status_code VARCHAR2(1);
98   l_action_id NUMBER;
99  BEGIN
100 
101   l_user_id := NVL(FND_GLOBAL.USER_ID, -1);
102   l_entry_count := l_batch_entries;
103   l_subset_id := -1;
104   l_cache_id := -1;
105   SAVEPOINT RECOVER_SUBSET_START;
106 
107   l_action_id := x_action_id;
108 
109   ----------------------------------------------------------------
110   -- The percentage of the day that the entry can reside in
111   -- the cache prior to being thought of as LOST.
112   ----------------------------------------------------------------
113   l_lost_interval := P_LOST_INTERVAL / G_NUM_MINUTES_IN_DAY;
114 
115   ----------------------------------------------------------------
116   -- Retrieve the sysdate once to use in the update returns table
117   -- buld insert.
118   ----------------------------------------------------------------
119   SELECT SYSDATE
120   INTO   l_update_date
121   FROM   DUAL;
122 
123   ----------------------------------------------------------------
124   -- this loop returns all of the entries that have been checked
125   -- out of the list for too long.
126   ----------------------------------------------------------------
127   FOR entry_rec IN (SELECT   LIST_ENTRY_ID
128                     ,        RETURNS_ID
129                     FROM     IEC_G_RETURN_ENTRIES
130                     WHERE    LIST_HEADER_ID = P_LIST_ID
131                     AND      RECORD_OUT_FLAG = 'Y'
132                     AND      DO_NOT_USE_FLAG = 'N'
133                     AND      NVL(RECYCLE_FLAG, 'N') = 'N'
134                     AND      l_update_date > RECORD_RELEASE_TIME + l_lost_interval
135                     ORDER BY LIST_ENTRY_ID)
136   LOOP
137 
138     l_update_count := l_update_list.COUNT + 1;
139     l_update_list(l_update_count) := entry_rec.RETURNS_ID;
140 
141     IF l_update_list.COUNT = 500
142     THEN
143 
144       IF (l_action_id = -1)
145       THEN
146 
147          SELECT IEC_G_RETURN_ENTRY_ACTION_S.NEXTVAL
148          INTO   l_action_id
149          FROM   DUAL;
150 
151          X_ACTION_ID := l_action_id;
152 
153       END IF;
154 
155     -- might want to get sysdate once and use.
156       FORALL j IN 1..L_UPDATE_LIST.COUNT
157                 UPDATE IEC_G_RETURN_ENTRIES
158                 SET    RECORD_OUT_FLAG = 'N'
159                 ,      LAST_UPDATE_DATE = SYSDATE
160                 ,      LAST_UPDATED_BY = l_user_id
161                 ,      CHECKIN_ACTION_TYPE = G_RECOVER_ACTION_TYPE
162                 ,      CHECKIN_ACTION_TIME = SYSDATE
163                 ,      CHECKIN_ACTION_ID = l_action_id
164                 WHERE  RETURNS_ID = l_update_list(j);
165 
166       l_update_list.DELETE;
167       COMMIT;
168     END IF;
169 
170   END LOOP;  -- end entry loop
171 
172     IF l_update_list.COUNT > 0
173     THEN
174 
175       IF (l_action_id = -1)
176       THEN
177          SELECT IEC_G_RETURN_ENTRY_ACTION_S.NEXTVAL
178          INTO   l_action_id
179          FROM   DUAL;
180 
181          X_ACTION_ID := l_action_id;
182 
183       END IF;
184 
185     -- might want to get sysdate once and use.
186       FORALL j IN 1..L_UPDATE_LIST.COUNT
187                 UPDATE IEC_G_RETURN_ENTRIES
188                 SET    RECORD_OUT_FLAG = 'N'
189                 ,      CHECKIN_ACTION_TYPE = G_RECOVER_ACTION_TYPE
190                 ,      CHECKIN_ACTION_TIME = SYSDATE
191                 ,      CHECKIN_ACTION_ID = l_action_id
192                 ,      LAST_UPDATE_DATE = SYSDATE
193                 ,      LAST_UPDATED_BY = l_user_id
194                 WHERE  RETURNS_ID = l_update_list(j);
195 
196       l_update_list.DELETE;
197       COMMIT;
198     END IF;
199 
200 
201 
202  EXCEPTION
203   WHEN FND_API.G_EXC_ERROR THEN
204     ROLLBACK;
205     RAISE;
206   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
207     ROLLBACK;
208     RAISE;
209 
210   ----------------------------------------------------------------
211   -- If an anonymous exception has been thrown then
212   -- the we must log an internal PLSQL error and
213   -- set the return status flag and return to the calling
214   -- procedure.
215   ----------------------------------------------------------------
216   WHEN OTHERS THEN
217     Log( 'Recovering List Entries on list ' || p_list_id
218        , l_api_name
219        , 'MAIN'
220        , SQLCODE
221        , SQLERRM
222        );
223     ROLLBACK;
224     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
225 
226  END RECOVER_LIST_ENTRIES;
227 
228 -----------------------------++++++-------------------------------
229 --
230 -- Start of comments
231 --
232 --  API name    : RECOVER_ENTRIES
233 --  Type        : Public
234 --  Pre-reqs    : None
235 --  Function    : Recover entries that have been checked out of AMS_LIST_ENTRIES for longer
236 --                than the time sent in as P_LOST_INTERVAL.
237 --  Parameters  : P_LOST_INTERVAL                IN     NUMBER                       Required
238 --                X_RETURN_CODE                    OUT  VARCHAR2                       Required
239 --
240 --  Version     : Initial version 1.0
241 --
242 -- End of comments
243 --
244 -----------------------------++++++-------------------------------
245 /* Called by the Recover Plugin. */
246 PROCEDURE RECOVER_SCHED_ENTRIES
247    ( P_SOURCE_ID            IN             NUMBER
248    , P_SCHED_ID             IN             NUMBER
249    , P_LOST_INTERVAL        IN             NUMBER
250    , X_ACTION_ID               OUT NOCOPY  NUMBER
251    )
252  IS
253   l_status_code VARCHAR2(1);
254   l_log_status VARCHAR2(1);
255   l_api_name CONSTANT VARCHAR2(30) := 'RECOVER_SCHED_ENTRIES';
256   l_action_id NUMBER;
257 
258 BEGIN
259   l_status_code := FND_API.G_RET_STS_SUCCESS;
260   x_action_id := NULL;
261 
262   ----------------------------------------------------------------
263   -- Set the source id to use for logging in
264   -- the rest of the package.
265   ----------------------------------------------------------------
266   G_SOURCE_ID := P_SOURCE_ID;
267 
268   ----------------------------------------------------------------
269   -- Initialize the return code to 'S'
270   ----------------------------------------------------------------
271   x_action_id := -1;
272   l_action_id := -1;
273 
274   ----------------------------------------------------------------
275   -- Loop thru the set of executing Lists.  An executing
276   -- List is one that has been assigned the AO activity, has
277   -- a status of 'ACTIVE' and has the target group associated
278   -- with it that has a status of 'EXECUTING'.
279   ----------------------------------------------------------------
280   FOR schedule_rec IN (SELECT LIST_HEADER_ID
281                        FROM   IEC_G_EXECUTING_LISTS_V
282 											 WHERE SCHEDULE_ID = P_SCHED_ID)
283   LOOP
284 
285     RECOVER_LIST_ENTRIES( P_SOURCE_ID
286                          , schedule_rec.LIST_HEADER_ID
287                          , P_LOST_INTERVAL
288                          , l_action_id);
289   END LOOP;  -- end schedule loop
290 
291 
292   COMMIT;
293 
294   X_ACTION_ID := l_action_id;
295 
296  EXCEPTION
297   ----------------------------------------------------------------
298   -- If either of the two FND_API exceptions have been thrown then
299   -- the procedure has already logged the error and we now just
300   -- set the return status flag and return to the calling
301   -- procedure.
302   ----------------------------------------------------------------
303   WHEN FND_API.G_EXC_ERROR THEN
304     ROLLBACK;
305     RAISE_APPLICATION_ERROR(-20999, g_error_msg);
306   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
307     ROLLBACK;
308     RAISE_APPLICATION_ERROR(-20999, g_error_msg);
309 
310   ----------------------------------------------------------------
311   -- If an anonymous exception has been thrown then
312   -- the we must log an internal PLSQL error and
313   -- set the return status flag and return to the calling
314   -- procedure.
315   ----------------------------------------------------------------
316   WHEN OTHERS THEN
317     Log( 'Recovering Sched Entries'
318        , l_api_name
319        , 'MAIN'
320        , SQLCODE
321        , SQLERRM
322        );
323     ROLLBACK;
324     RAISE_APPLICATION_ERROR(-20999, g_error_msg);
325 
326  END RECOVER_SCHED_ENTRIES;
327 
328 END IEC_RECOVER_PVT;