DBA Data[Home] [Help]

PACKAGE BODY: APPS.BIS_BIA_RSG_INDEX_MGMT

Source


1 PACKAGE BODY BIS_BIA_RSG_INDEX_MGMT AS
2 /* $Header: BISBRIMB.pls 120.2 2006/01/24 09:32:33 aguwalan noship $ */
3 
4 procedure setTimer(
5     p_log_timstamp in out NOCOPY date)
6   IS
7   BEGIN
8     p_log_timstamp := sysdate;
9   END;
10 
11 PROCEDURE WRITELOG(P_TEXT VARCHAR2)
12   IS
13   L_TEXT VARCHAR2(255);
14   BEGIN
15     BIS_COLLECTION_UTILITIES.put_line(P_TEXT);
16     BIS_COLLECTION_UTILITIES.put_line(' ');
17 /*    if(length(P_TEXT)>255) then
18       L_TEXT :=substr(P_TEXT, 0, 254);
19     else
20       L_TEXT := P_TEXT ;
21     end if;
22     DBMS_OUTPUT.PUT_LINE(L_TEXT);
23     DBMS_OUTPUT.PUT_LINE(' ');
24     DBMS_OUTPUT.PUT_LINE(' ');   */
25   END;
26 
27 FUNCTION duration(
28 	p_duration		number) return VARCHAR2 IS
29   BEGIN
30     return(to_char(floor(p_duration)) ||' Days '||
31            to_char(mod(floor(p_duration*24), 24))||':'||
32            to_char(mod(floor(p_duration*24*60), 60))||':'||
33            to_char(mod(floor(p_duration*24*60*60), 60)));
34   END duration;
35 
36 PROCEDURE logTime(
37     p_process        varchar2,
38     p_log_timstamp   date)
39   IS
40     -- modified for GSCC
41     l_duration     number ;
42   BEGIN
43     l_duration := sysdate - p_log_timstamp;
44     WRITELOG('Process Time for '|| p_process || ' : ' || duration(l_duration));
45   END;
46 
47 
48 Function form_triplet( att1 varchar2,
49                        att2 varchar2,
50                        att3 varchar2  ) return varchar2
51   IS
52     --- modified for GSCC and decrease the size of the variable as it
53     --- was unneccessary
54     l_result varchar2(200) ;
55   BEGIN
56     l_result := '( ' || att1 || ', ' || att2 || ', ' || att3 || ') ';
57     return l_result;
58   END;
59 
60 
61 function is_index_mgmnt_profile_set
62   return boolean
63   is
64   begin
65     IF (fnd_profile.value('BIS_BIA_MV_INDEX_ENABLE') = 'Y') THEN
66       return true;
67     ELSE
68       WRITELOG('Runtime BIA MV Log Management feature is off');
69       return false;
70     END IF;
71   end;
72 
73 
74 
75 function is_Index_Mgmt_Enabled(p_mv_name in varchar2, p_mv_schema in varchar2) return varchar2 -- p_mv_schema is no more used after bug 4186097
76 is
77   TYPE curType IS REF CURSOR;
78   c_index_mgmt_flag curType;
79   l_stmt varchar2(1000);
80   -- modified to remove GSCC warning  File.Sql.35
81   l_index_mgmt_enabled varchar2(1);
82   begin
83     l_index_mgmt_enabled := 'N';
84     l_stmt := 'select Drop_create_index_flag from bis_obj_properties where OBJECT_TYPE=''MV'' and OBJECT_NAME=:1'; --bug 4186097. removed p_mv_schema check, because p_mv_schema gives the Schema in which
85                                                                                                                                     --the MV is created, whereas OBJECT_OWNER is a product short name to whom the MV belongs.
86     open c_index_mgmt_flag for l_stmt using p_mv_name;
87     fetch c_index_mgmt_flag into l_index_mgmt_enabled;
88     close c_index_mgmt_flag;
89     if (l_index_mgmt_enabled = 'Y' or l_index_mgmt_enabled = 'y') then --bug 4186097
90       return 'Y';
91     else
92       return 'N';
93     end if;
94   end;
95 
96 
97 
98 PROCEDURE drop_mv_index(p_index_name in varchar2, p_index_schema in varchar2)
99 is
100   l_time date;
101   l_dur  number;
102   -- modified to remove GSCC File.Sql.35, decreased the length of the variable to 200 from 1000 also
103   l_stmt varchar2(200);
104 
105 BEGIN
106   l_stmt := 'DROP INDEX ' || p_index_schema||'.'||p_index_name;
107   setTimer(l_time);
108   WRITELOG('Executing ' || l_stmt);
109   execute immediate l_stmt;
110   logTime( 'Successfuly dropped mv index of ' || form_triplet(p_index_name, P_index_schema, null) , l_time);
111   WRITELOG('************************************');
112 
113 EXCEPTION WHEN OTHERS THEN
114     WRITELOG('In procedure drop_mv_index, failed droping ' ||  p_index_schema||'.'||p_index_name || sqlerrm);
115     raise;
116 end;
117 
118 
119 procedure Capture_and_drop_index_by_mv(p_mv_name in varchar2, p_mv_schema in varchar2)
120 is
121   -- modified to remove GSCC warning File.Sql.35
122   l_mv_index_handle clob;
123   l_time date;
124   l_length number;
125   l_stmt varchar2(32767);
126   TYPE curType IS REF CURSOR ;
127   c_all_index_details	curType;
128   l_index_name bis_obj_indexes.index_name%type;
129   l_schema all_indexes.owner%type;
130   l_ddl clob;
131 begin
132   -- added to remove GSCC warning File.Sql.35
133   l_mv_index_handle := null;
134   l_length          := 0;
135   l_stmt            := null;
136 
137   if(NOT is_index_mgmnt_profile_set) then
138     WRITELOG('No further action performed!');
139     return;
140   end if;
141 
142 
143   setTimer(l_time);
144 
145   WRITELOG('Capturing MV Index for ' || form_triplet(p_mv_name, p_mv_schema, null));
146   -- bug#4704403
147   --l_mv_index_handle := sys.ad_dbms_metadata.get_dependent_ddl('INDEX',p_mv_name, p_mv_schema);
148 
149     l_stmt := 'SELECT INDEX_NAME, OWNER, TO_CHAR(sys.ad_dbms_metadata.GET_DDL(''INDEX'',INDEX_NAME,OWNER)) FROM '||
150     '(select index_name , OWNER from all_indexes where table_name = :1 and owner = :2)';
151 
152   open c_all_index_details for l_stmt using p_mv_name, p_mv_schema;
153     loop
154       fetch c_all_index_details	into l_index_name, l_schema, l_ddl;
155       exit when c_all_index_details%NOTFOUND;
156 
157       if l_ddl is not null or l_ddl <> '' then
158         update bis_obj_indexes  set  INDEX_SQL = l_ddl,  LAST_UPDATE_DATE = sysdate, LAST_UPDATED_BY = FND_GLOBAL.User_id,  LAST_UPDATE_LOGIN = fnd_global.LOGIN_ID where OBJECT_NAME=p_mv_name and OBJECT_TYPE='MV' and INDEX_NAME=l_index_name;
159         IF SQL%NOTFOUND THEN
160           INSERT INTO bis_obj_indexes( OBJECT_NAME, OBJECT_TYPE, INDEX_NAME, INDEX_SQL, CREATION_DATE, CREATED_BY, LAST_UPDATE_DATE, LAST_UPDATED_BY, LAST_UPDATE_LOGIN)
161           		values(p_mv_name, 'MV', l_index_name, l_ddl, sysdate, FND_GLOBAL.User_id, sysdate, FND_GLOBAL.User_id, fnd_global.LOGIN_ID);
162         END IF;
163         COMMIT;
164         drop_mv_index(l_index_name, p_mv_schema);
165       end if;
166     end loop;
167   close c_all_index_details	;
168 
169   logTime( 'Dropping mv index of ' || form_triplet(p_mv_name, p_mv_schema, l_index_name) , l_time);
170   WRITELOG('************************************');
171 
172 
173 
174 EXCEPTION WHEN OTHERS THEN
175     WRITELOG('In procedure Capture_and_drop_index_by_mv, failed capturing MV Index for ' ||  form_triplet(p_mv_name, p_mv_schema, l_index_name) || ', ' ||sqlerrm);
176     raise;
177 
178 
179 end;
180 
181 
182 
183 procedure recreate_indexes_by_mv(ERRBUF OUT NOCOPY VARCHAR2, RETCODE OUT NOCOPY VARCHAR2, p_mv_name in varchar2,P_mv_schema in varchar2)
184 is
185   l_stmt varchar2(300);
186   TYPE curType IS REF CURSOR ;
187   c_index_sql	curType;
188   l_index_name varchar2(30);
189   l_index_ddl varchar2(32767);--clob;
190   temp_index_ddl varchar2(32767);--clob;
191   l_time date;
192   count_created Number; -- bug 4284095
193   count_exists  Number; -- bug 4284095
194   l_program_status boolean; -- bug 4284095
195 
196   --bug 4312072
197   l_mv_name varchar2(30);
198   l_mv_schema varchar2(30);
199 begin
200   ERRBUF:= NULL;
201   RETCODE:= '0';
202 
203   if(NOT is_index_mgmnt_profile_set) then
204     WRITELOG('Index management Profile is False! No further action performed!');
205     return;
206   end if;
207 
208   --code added for bug 4284095
209   if(p_mv_name is null or P_mv_schema is null) then
210     WRITELOG('Warning!! Program will exit as parameters are NULL');
211     l_program_status := fnd_concurrent.set_completion_status('WARNING' ,NULL);
212     RETCODE := 2;
213     return ;
214   end if;
215 
216   --added for bug 4312072
217   l_mv_name   := upper(p_mv_name);
218   l_mv_schema := upper(P_mv_schema);
219 
220   -- added for bug 4284188
221   -- this API can be run directly when user run concurrent program 'Recreate MV index Management', that time we
222   -- need to check seperately if the flag set or not.
223   if (is_Index_Mgmt_Enabled(l_mv_name,l_mv_schema) = 'N')then
224        WRITELOG('The MV '||l_mv_name||' is not seeded in RSG or MV Index management is disabled for MV ' ||l_mv_name||'.  No further action performed!');
225        return ;
226   end if;
227 
228   count_created :=0; -- this counter will be used created indexes -- bug 4284095
229   count_exists  :=0;  -- bug 4284095
230 
231   setTimer(l_time);
232   WRITELOG('Recreating MV Index for ' || form_triplet(l_mv_name, l_mv_schema, null));
233 
234   -- bug 4312072
235   l_stmt := 'select INDEX_NAME, INDEX_SQL from BIS_OBJ_INDEXES where OBJECT_NAME='''
236             ||l_mv_name||
237 	    ''' and OBJECT_TYPE=''MV'' and INDEX_SQL is not null';
238 
239   open c_index_sql for l_stmt;
240   loop
241     fetch c_index_sql into l_index_name, l_index_ddl;
242     exit when c_index_sql%NOTFOUND;
243     logTime( form_triplet(l_mv_name, l_mv_schema, l_index_name) , l_time);
244     if l_index_ddl is not null /*and l_index_ddl <> ''*/ then
245       BEGIN
246       logTime( 'Checking for existence of ' || l_index_name, l_time);
247       -- bug#4704403
248       temp_index_ddl:= to_char(sys.ad_dbms_metadata.get_ddl('INDEX',l_index_name));
249       logTime( 'Index exists ' || l_index_name, l_time);
250       count_exists := count_exists + 1;   -- bug 4284095
251       EXCEPTION WHEN OTHERS THEN --Index doesnt exists already . We can recreate now without ORA error.
252         logTime( 'index does not exist, recreating index ' || l_index_name, l_time);
253         execute immediate l_index_ddl;
254 	count_created := count_created + 1;   -- bug 4284095
255         logTime( 'recreated index ' || l_index_name, l_time);
256       END;
257     end if;
258   end loop;
259   close c_index_sql;
260 
261   --code for bug 4284095
262   If(count_created =0 and count_exists =0) then
263     WRITELOG('No Index has been created, As there is no index associated for');
264     WRITELOG(' given MV '|| l_mv_name);
265   else If (count_exists >0 and count_created =0) then
266          WRITELOG('All indexes for the MV '||l_mv_name||' already existed in the system');
267 	 WRITELOG('so no indexes were recreated');
268        end if;
269   end if;
270   WRITELOG('************************************');
271 
272 EXCEPTION WHEN OTHERS THEN
273     WRITELOG('In recreate_indexes_by_mv, failed recreating MV Index for ' ||  form_triplet(l_mv_name, l_mv_schema, l_index_name) || 'due to ' ||sqlerrm);
274 
275     ERRBUF:=SQLERRM;
276     RETCODE:=SQLCODE;
277 
278     raise;
279 
280 end;
281 
282 procedure recreate_indexes_by_mv_wrapper(p_mv_name in varchar2,P_mv_schema in varchar2) is
283 ERRBUF VARCHAR2(2000);
284 RETCODE VARCHAR2(2000);
285 begin
286 
287   if(NOT is_index_mgmnt_profile_set) then
288     WRITELOG('No further action performed!');
289     return;
290   end if;
291 
292   recreate_indexes_by_mv(ERRBUF, RETCODE, p_mv_name, P_mv_schema);
293 end;
294 
295 
296 procedure enable_index_mgmt(p_mv_name in varchar2,P_mv_schema in varchar2)
297 is
298   begin
299   update bis_obj_properties set DROP_CREATE_INDEX_FLAG='Y', LAST_UPDATED_BY= FND_GLOBAL.User_id, LAST_UPDATE_LOGIN = fnd_global.LOGIN_ID, LAST_UPDATE_DATE = sysdate  where OBJECT_NAME=p_mv_name and OBJECT_OWNER=p_mv_schema and OBJECT_TYPE='MV';
300   COMMIT;
301 
302   EXCEPTION WHEN OTHERS THEN
303     WRITELOG('In procedure enable_index_mgmt, failed enabling index mgmt flag' ||  form_triplet(p_mv_name, p_mv_schema, null) || ', ' ||sqlerrm);
304     raise;
305 
306   end;
307 
308 
309 procedure disable_index_mgmt(p_mv_name in varchar2,P_mv_schema in varchar2)
310 is
311   begin
312   update bis_obj_properties set DROP_CREATE_INDEX_FLAG='N', LAST_UPDATED_BY= FND_GLOBAL.User_id, LAST_UPDATE_LOGIN = fnd_global.LOGIN_ID, LAST_UPDATE_DATE = sysdate  where OBJECT_NAME=p_mv_name and OBJECT_OWNER=p_mv_schema and OBJECT_TYPE='MV';
313   COMMIT;
314 
315   EXCEPTION WHEN OTHERS THEN
316     WRITELOG('In procedure disable_index_mgmt, failed enabling index mgmt flag' ||  form_triplet(p_mv_name, p_mv_schema, null) || ', ' ||sqlerrm);
317     raise;
318 
319   end;
320 
321 
322 END;
323 
324